Russian Qt Forum
Сентябрь 30, 2024, 18:30 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: как вставить цветные символы в поле QTextEdit  (Прочитано 10580 раз)
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);
                                 }                                 

то программа зависает на несколько секунд, проделывая эту операцию((((
Записан
Rcus
Гость
« Ответ #1 : Ноябрь 26, 2008, 16:42 »

void QWidget::setUpdatesEnabled ( bool enable )
Записан
Germiona
Гость
« Ответ #2 : Ноябрь 26, 2008, 17:15 »

Цитировать
void QWidget::setUpdatesEnabled ( bool enable )


Даже если отключить обновления, все равно также медленно
Записан
Rcus
Гость
« Ответ #3 : Ноябрь 26, 2008, 17:49 »

Добрался до компа с Qt (4.4, но не столь важно в данном случае). Похоже QTextEdit слабо подходит для эмуляции терминала.
Записан
Germiona
Гость
« Ответ #4 : Ноябрь 26, 2008, 17:50 »

Это точно ))) Оч много проблем, но что тогда подходит?  Непонимающий
Записан
Rcus
Гость
« Ответ #5 : Ноябрь 26, 2008, 17:55 »

для qt4 на qtapps есть виджет-эмулятор терминала. Для Qt3 я бы посмотрел на исходники Konsole.
Записан
Germiona
Гость
« Ответ #6 : Ноябрь 26, 2008, 18:03 »

а где их найти?   Строит глазки
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #7 : Ноябрь 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
Записан
vvvmag
Гость
« Ответ #8 : Декабрь 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);


Данный пример взят из делегата. Подсветка искомых под-строк в тексте ячейки таблицы
Записан
Germiona
Гость
« Ответ #9 : Декабрь 01, 2008, 15:03 »

 Шокированный

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

напрмер append() добавляет текст быстро, одна проблема текст добавляется как новый параграф....
Записан
Germiona
Гость
« Ответ #10 : Декабрь 05, 2008, 13:24 »

В продолжении темы.....

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

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

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

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


 
Записан
Polesinskij
Гость
« Ответ #11 : Ноябрь 01, 2013, 11:22 »

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


Страница сгенерирована за 0.1 секунд. Запросов: 23.