2012-07-31 6 views
0

У меня есть программа, которая должна нарисовать текст с помощью paintEvent(). я попытался это:текст с краскойEvent()

1. QPainter painter; // painter for the canvas 
2. painter.drawText(QPoint location, QString canvasText); 

где

3. QString canvasText = variablesText.append("<b>"); 
4. variablesText.append((*fieldIter).second.c_str()); 
5. variablesText.append(":</b> "); 
6. variablesText.append(someValue); 
7. variablesText.append("\n"); 

мне нужен текст, который будет отформатированный, canvasText должен выглядеть следующим образом:

Некоторые полужирный текст: некоторые не жирный текст. (newLine)

Полужирный текст 2: некоторые не выделены жирным шрифтом text2. (newLine), и это продолжается некоторое время.

Проблема у меня в том, что QString не может иметь HTML код в нем, так что текст отображается как:

< b>Some bold text:< /b> some not bold text. < b>Some bold text 2: < /b> 
some not bold text2.\n 

Есть ли способ использовать рисовать в paintEvent, чтобы показать текст как мне это нужно? с QString (или QLabel или что-то еще)

Я использую Qt4.

Спасибо за помощь =)

ответ

3

QTextDocument кажется, хорошо подходят для того, что вы после того, как, в частности setHtml(). A QTextDocument может отформатировать текст и нарисовать результат на экране с помощью вашего виджетов QPainter. Что-то вроде ниже является самым простым из возможных решений:

void Test::paintEvent(QPaintEvent *) 
{ 
    QPainter painter(this); 

    QTextDocument doc; 
    doc.setHtml("<b>Title</b><p>Body Text</p>"); 

    doc.drawContents(&painter, rect()); 
} 

Имейте в виду, однако, что это, вероятно, будет очень неэффективно. Вероятно, вы захотите, чтобы drawContents() был кэширован QPixmap, только когда ваш источник html изменяется ...

+0

Спасибо @sjwarner, однако, мне нужно указать ему конкретное место, где это необходимо Чтобы сделать это, я сделал это 'document-> drawContents (& painter, QRect (QPoint.x(), QPoint.y(), rect(). width(), rect(). height())) ;, но ничего не показывает. – user1486311

+0

@sjtaheri, похоже, попал на правильный путь, поэтому я оставлю вас до него ;-) – sjwarner

+0

спасибо! = D он отлично работает! – user1486311

2

Предположим, что вы пытаетесь напечатать HTML форматированный текст содержание ул на QRect прямоугольнику с помощью QPainter художника. Выполните следующие действия:

QString str; // this string contains HTML formatted contents 
QTextDocument * document = new QTextDocument(this) ; 
document->setHtml(str) ; 

painter.translate(rect.left() , rect.top()) ; 
document->drawContents(&painter , QRect(0 , 0, rect.width() , rect.height()) ; 
+0

Thanks @sjtaheri! это работает очень хорошо, но мне нужно указать ему определенное место, которое я сохранил в QList. Я сделал этот «document-> drawContents (& painter, QRect (QPoint.x(), QPoint.y(), rect(). Width(), rect(). Height())) ;, но он не показывает что-нибудь. Если я использую числа типа 'document-> drawContents (& painter, QRect (20, 20, rect(). Width(), rect(). Height()));' он показывает прямоугольник, но обрезается. Есть предположения? – user1486311

+0

Для каждой точки сначала перенесите ее с помощью painter :: translate method с положением x и y в качестве аргументов. Затем нарисуйте документ, вызвав document-> drawContents (& painter, QRect (0, 0, width, height). Ширина и высота должны быть достаточно большими, чтобы весь текст входил. Наконец, восстановите маляр с помощью метода QPainter :: restore. эта процедура для всех точек. – sjtaheri

+0

Еще раз спасибо @sjtaheri = DI попробовал это, но он не покажет остальную часть qpixmaps, которые у меня есть у художника, даже если я сделаю восстановление: S это мой код: 'for (int i = 0; i <кусокRects.size(); ++ i) {painter.drawPixmap (pieceRects [i], iconList [i] -> getIcon()); QTextDocument * document = new QTextDocument (this); document- > setHtml (iconList [i] -> getVariablesText()); painter.translate (iconList [i] -> getVariablesLocation()); document-> drawContents (& painter, rect()); painter.restore();} ' qpixmap невидим, если я начну щелкнуть, я в конце концов возьму qpixmap, но когда я его отпущу, он снова исчезнет. = ( – user1486311

 Смежные вопросы

  • Нет связанных вопросов^_^