2012-07-31 46 views
0

我有一个需要用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应该是这样的:

一些大胆的文字:一些不加粗的文字。 (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()); 
} 

但请记住,这可能是非常低效的。只有当您的源代码html更改时,您可能需要将drawContents()缓存到QPixmap ...

+0

谢谢@sjwarner,但是,我需要给它一个特定的位置以满足它的需要被绘制我做了这个'document-> drawContents(&painter,QRect(QPoint.x(),QPoint)。y(),rect().width(),rect()。height()));'但它不显示任何东西。 – user1486311 2012-07-31 16:54:13

+0

@sjtaheri似乎让你走上了正轨,所以我会离开你去的;-) – sjwarner 2012-08-01 09:37:59

+0

谢谢! = D现在工作正常! – user1486311 2012-08-02 15:39:03

2

假设你正在尝试通过QPainter画家打印HTML格式的文本内容在STR上QRect矩形。具体操作如下:

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

谢谢@sjtaheri!这工作得很好,但我需要给它一个特定的位置,我已经存储在QList中。我做了这个'document-> drawContents(&painter,QRect(QPoint.x(),QPoint.y(),rect().width(),rect()。height()));'但它不显示任何东西。如果我使用像'document-> drawContents(&画家,QRect(20,20,rect()。width(),rect()。height()));'它显示rect但修剪。有什么想法吗? – user1486311 2012-07-31 16:52:44

+0

对于每个点,首先,使用painter :: translate方法将点的x和y位置作为参数进行转换。然后通过调用document-> drawContents(&painter,QRect(0,0,width,height)来绘制文档,宽度和高度应该足够大,以便整个文本适合。最后使用QPainter :: restore方法恢复画家。这个程序适用于所有点 – sjtaheri 2012-07-31 18:13:11

+0

再次感谢@sjtaheri = DI试过了,但它不会显示我在画家身上所拥有的qpixmaps的其余部分,即使我进行恢复也不会:S这是我的代码:'for int i = 0; i getIcon()); QTextDocument * document = new QTextDocument(this); document- > setHtml(iconList [i] - > getVariablesText()); painter.translate(iconList [i] - > getVariablesLocation()); document-> drawContents(&painter,rect()); painter.restore();}'The qpixmap是不可见的,如果我开始点击,我最终会抓住qpixmap,但是当我释放它时会再次褪色。=( – user1486311 2012-07-31 19:00:52