Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Germiona от Ноябрь 26, 2008, 16:28



Название: как вставить цветные символы в поле QTextEdit
Отправлено: Germiona от Ноябрь 26, 2008, 16:28
Добрый день,господа!

Нужно в поле QTextEdit разместить массив символов unsigned char (фиксированный 24*80, т.е. 1920 символов), при этом каждый символ имеет свой цвет.....

Как бы это можно было бы реализовать?

Если проделать это в цикле,например:
Код:

Unsigned char data[1920];
QTextEdit *textEdit = new QTextEdit();
...
for(int i=0; i<1920, i++) {
                                   setColor(<цвет>);
                                   textEdit->insertAt(data[i], 0, i);
                                 }                                 

то программа зависает на несколько секунд, проделывая эту операцию((((


Название: Re: как вставить цветные символы в поле QTextEdit
Отправлено: Rcus от Ноябрь 26, 2008, 16:42
void QWidget::setUpdatesEnabled ( bool enable )


Название: Re: как вставить цветные символы в поле QTextEdit
Отправлено: Germiona от Ноябрь 26, 2008, 17:15
Цитировать
void QWidget::setUpdatesEnabled ( bool enable )


Даже если отключить обновления, все равно также медленно


Название: Re: как вставить цветные символы в поле QTextEdit
Отправлено: Rcus от Ноябрь 26, 2008, 17:49
Добрался до компа с Qt (4.4, но не столь важно в данном случае). Похоже QTextEdit слабо подходит для эмуляции терминала.


Название: Re: как вставить цветные символы в поле QTextEdit
Отправлено: Germiona от Ноябрь 26, 2008, 17:50
Это точно ))) Оч много проблем, но что тогда подходит?  ???


Название: Re: как вставить цветные символы в поле QTextEdit
Отправлено: Rcus от Ноябрь 26, 2008, 17:55
для qt4 на qtapps есть виджет-эмулятор терминала. Для Qt3 я бы посмотрел на исходники Konsole.


Название: Re: как вставить цветные символы в поле QTextEdit
Отправлено: Germiona от Ноябрь 26, 2008, 18:03
а где их найти?   ::)


Название: Re: как вставить цветные символы в поле QTextEdit
Отправлено: Alex Custov от Ноябрь 26, 2008, 18:08
а где их найти?   ::)

можно в svn:

# svn co svn://anonsvn.kde.org/home/kde/branches/KDE/3.5/kdebase/konsole konsole

Можно в исходниках kdebase: http://archive.ubuntu.com/ubuntu/pool/main/k/kdebase/kdebase_3.5.9.orig.tar.gz


Название: Re: как вставить цветные символы в поле QTextEdit
Отправлено: vvvmag от Декабрь 01, 2008, 09:49
Для того чтобы можно было настраивать отображение разных кусков текста по разному применяется QTextLayout.
Код:
QFontMetrics font_metrics(option.font);
QTextDocument text_doc.setHtml(text);
QTextLayout textLayout(text_doc.toPlainText());

int leading = font_metrics.leading();
int height = 0;
qreal widthUsed = 0;
textLayout.beginLayout();

while (1) {
QTextLine line = textLayout.createLine();
if (!line.isValid())
break;

line.setLineWidth(rect.width());
height += leading;
line.setPosition(QPoint(0, height));
height += line.height();
widthUsed = qMax(widthUsed, line.naturalTextWidth());
}

textLayout.endLayout();


QTextCharFormat ch_format;//формат отображения выделенной подстроки


QVector<QTextLayout::FormatRange> formats_str;
QTextLayout::FormatRange format_common;
format_common.start = 0;
format_common.length = text.length();

if (option.state & QStyle::State_Selected && option.state & QStyle::State_Active)
{
ch_format.setForeground(Qt::white);
}
else
{
ch_format.setForeground((Qt::black));
}
format_common.format = ch_format;
formats_str.append(format_common);
//в цикле проходим все подстроки в строкt поиска
QString string_of_filter = filter_string->text();
QStringList filtr_sub_strings = string_of_filter.split(" ",QString::SkipEmptyParts);
for (int i = 0; i < filtr_sub_strings.size(); i++)
{
//определяем количество вхождений текущей подстроки
if (text.count(filtr_sub_strings.at(i),Qt::CaseInsensitive)>0)
{
QTextLayout::FormatRange format_sub_string;
ch_format.setBackground(QBrush(Qt::lightGray));
ch_format.setForeground(QBrush(Qt::black));
format_sub_string.format = ch_format;

int start_sub_string = text.indexOf(filtr_sub_strings.at(i),0,Qt::CaseInsensitive);
while (start_sub_string != -1)
{
format_sub_string.start = start_sub_string;
format_sub_string.length = filtr_sub_strings.at(i).length();
formats_str.append(format_sub_string);
//ищем следующее вхождение
start_sub_string = text.indexOf(filtr_sub_strings.at(i),format_sub_string.start+1,Qt::CaseInsensitive);
}
}
}

QTextOption opt;
opt.setAlignment(Qt::AlignTop | Qt::AlignLeft);
textLayout.setTextOption(opt);
textLayout.draw(painter,QPointF(rect.x() + 5,rect.y()),formats_str,(QRectF)rect);


Данный пример взят из делегата. Подсветка искомых под-строк в тексте ячейки таблицы


Название: Re: как вставить цветные символы в поле QTextEdit
Отправлено: Germiona от Декабрь 01, 2008, 15:03
 :o

а попроще как-нибудь можно?

напрмер append() добавляет текст быстро, одна проблема текст добавляется как новый параграф....


Название: Re: как вставить цветные символы в поле QTextEdit
Отправлено: Germiona от Декабрь 05, 2008, 13:24
В продолжении темы.....

Если вставлять текст в QTextEdit в формате HTML, где для каждого символа применяется тэг с описанием цвета:

Код:
<font color="#blue">data[0]</font><font color="#red">data[1]</font>...

то шрифт игнорирует установку фактора растяжения.....ф-ии setStretch(int factor)

Почему так происходит  ??? Можно это как-то исправить?


 


Название: Re: как вставить цветные символы в поле QTextEdit
Отправлено: Polesinskij от Ноябрь 01, 2013, 11:22
автоматизация оцветнения очень интересная тема.Оцветнение средней буквы троек красным, (зеленым и затем синим), поиск текста по цветам и без цветов .Всё это пересекается с простыми в исполнении алгоритмами к полю генноинженерной информации. Как это всё будет работать в итерации внутри циклов???Например после элемета строки Абц, нужно оцветнить красным каждый третий символ после второго(тобищт=Б, и его самого) до момента наступления условия строки xyZ, и отсюда ничего не оцветнять до момента завершения цикла на вышеуказанном моменте Абц.Зарание буду признателен за ответ. И такой вопрос, какой стандарт битража поддерживает оцветнение символов без хтмл-теговых вставок. Я слышал что есть такой стандарт в досе.