【问题标题】:paint text with paintEvent()使用 paintEvent() 绘制文本
【发布时间】:2012-07-31 15:23:05
【问题描述】:

我有一个程序需要使用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 中使用draw 以我需要的方式显示文本?使用 QString(或 QLabel 之类的)

我正在使用 Qt4。

感谢您的帮助 =)

【问题讨论】:

    标签: html qt qt4 qstring qpainter


    【解决方案1】:

    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());
    }
    

    但是请记住,这可能非常低效。仅当您的源 html 更改时,您可能希望将 drawContents() 缓存到缓存的 QPixmap...

    【讨论】:

    • 谢谢@sjwarner,但是,我需要给它一个需要绘制的特定位置我做了这个document-&gt;drawContents(&amp;painter, QRect(QPoint.x(), QPoint.y(), rect().width(), rect().height()));,但它没有显示任何东西。
    • @sjtaheri 似乎让你走上了正确的道路,所以我会留给你的 ;-)
    【解决方案2】:

    假设您尝试通过QPainterpainter 在QRect rect 上的str 中打印HTML 格式的文本内容。执行以下操作:

    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() ) ;
    

    【讨论】:

    • 谢谢@sjtaheri!这工作得很好,但我需要给它一个我存储在 QList 中的特定位置。我这样做了document-&gt;drawContents(&amp;painter, QRect(QPoint.x(), QPoint.y(), rect().width(), rect().height()));,但它没有显示任何内容。如果我使用像document-&gt;drawContents(&amp;painter, QRect(20, 20, rect().width(), rect().height())); 这样的数字,它会显示矩形但被修剪。有什么想法吗?
    • 对于每个点,首先,使用painter::translate 方法以点的x 和y 位置作为参数对其进行翻译。然后通过调用 document->drawContents( &painter , QRect( 0 , 0, width , height ) 绘制文档。宽度和高度应该足够大,以便整个文本适合。最后使用 QPainter::restore 方法恢复画家。重复这个程序适用于所有点。
    • 再次感谢@sjtaheri =D 我试过了,但它不会显示我在画家身上的其余 qpixmaps,即使我进行恢复也不行:S 这是我的代码:@987654326 @ qpixmap 是不可见的,如果我开始点击,我最终会抓住 qpixmap,但是当我释放它时它会再次消失。 =(
    猜你喜欢
    • 1970-01-01
    • 2019-01-16
    • 1970-01-01
    • 2015-10-28
    • 1970-01-01
    • 2020-07-27
    • 1970-01-01
    • 2013-03-20
    • 2014-05-10
    相关资源
    最近更新 更多