рисовать текст с помощью paintEvent()

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

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 должен выглядеть так:

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

Некоторый полужирный текст 2: некоторый нежирный текст2. (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.

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


person acerqueiro    schedule 31.07.2012    source источник


Ответы (2)


QTextDocument кажется подходящим для того, что вам нужно, в частности setHtml() . 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 изменится...

person sam-w    schedule 31.07.2012
comment
Спасибо @sjwarner, однако мне нужно указать конкретное место, где его нужно нарисовать. Я сделал это document->drawContents(&painter, QRect(QPoint.x(), QPoint.y(), rect().width(), rect().height()));, но он ничего не показывает. - person acerqueiro; 31.07.2012
comment
@sjtaheri, кажется, направил вас на правильный путь, так что я оставлю вас наедине ;-) - person sam-w; 01.08.2012

Предположим, вы пытаетесь напечатать текстовое содержимое в формате HTML в строке str на QRect rect через QPainter painter. Сделайте следующее:

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() ) ;
person sjtaheri    schedule 31.07.2012
comment
Спасибо @sjtaheri! это прекрасно работает, но мне нужно указать конкретное местоположение, которое я сохранил в QList. Я сделал это document->drawContents(&painter, QRect(QPoint.x(), QPoint.y(), rect().width(), rect().height()));, но ничего не показывает. Если я использую такие числа, как document->drawContents(&painter, QRect(20, 20, rect().width(), rect().height()));, он показывает прямоугольник, но обрезанный. Есть предположения? - person acerqueiro; 31.07.2012
comment
Для каждой точки сначала переведите ее с помощью метода painter::translate с координатами x и y точки в качестве аргументов. Затем нарисуйте документ, вызвав document-›drawContents( &painter , QRect( 0 , 0, width , height ). Ширина и высота должны быть достаточно большими, чтобы поместился весь текст. Наконец, восстановите рисовальщик с помощью метода QPainter::restore. Повторите эта процедура для всех точек. - person sjtaheri; 31.07.2012
comment
Еще раз спасибо @sjtaheri = Я попробовал это, но он не покажет остальные qpixmaps, которые у меня есть на рисовщике, даже если я сделаю восстановление: S это мой код: for (int i = 0; i < pieceRects.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, но когда я отпускаю, он снова исчезает. знак равно - person acerqueiro; 31.07.2012