2012-07-31 99 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