• 1903阅读
  • 8回复

[提问]Qpainter  如何 绘制如下所示 [复制链接]

上一主题 下一主题
离线xing181512
 

只看楼主 倒序阅读 楼主  发表于: 2021-01-04
注册:QT for
Test


使用QPainter 如何绘制如上所示,在一个固定的宽度区域 ,文字的背景色随文字增加/换行 而增加/换行
离线XChinux

只看该作者 1楼 发表于: 2021-01-04
这个似乎难办到。
QFontMetrics通过这个类,可以获得你要绘制的文字到底要占多大的区域,可能能自己计算出来。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线青空飞羽

只看该作者 2楼 发表于: 2021-01-04
QLable有个wordWrap 属性,应该有用

wordWrap : bool
This property holds the label's word-wrapping policy
If this property is true then label text is wrapped where necessary at word-breaks; otherwise it is not wrapped at all.
By default, word wrap is disabled.
离线snow_man_0

只看该作者 3楼 发表于: 2021-01-05
QPainter::drawText(const QRectF &rectangle, int flags, const QString &text, QRectF *boundingRect = nullptr)
flags: Qt::TextWordWrap
QFontMetrics算出rectangle,填充颜色就可以

离线lemonzll

只看该作者 4楼 发表于: 2021-01-05
  1. void Widget::paintEvent(QPaintEvent *event)
  2. {
  3.     QPainter painter(this);
  4.     QTextDocument doc;
  5.     QColor textColor = "green";  //文字颜色
  6.     doc.setDefaultStyleSheet(QStringLiteral("span { background-color: %1}")
  7.         .arg(textColor.name()));
  8.     doc.setHtml(tr("<p>Register: <span>Qt for test Qt for test Qt for test Qt for test</span></p>"));
  9.     doc.setDocumentMargin(1);
  10.     doc.setTextWidth(this->width() / 2);  //设置绘制区域宽度,这里例子是只有整体宽度一半
  11.     doc.drawContents(&painter);
  12. }

3条评分好评度+1金钱+10威望+1
xing181512 好评度 +1 厉害,可以实现 2021-01-05
xing181512 威望 +1 厉害,可以实现 2021-01-05
xing181512 金钱 +10 厉害,可以实现 2021-01-05
离线xing181512

只看该作者 5楼 发表于: 2021-01-05
厉害,可以实现
离线xing181512

只看该作者 6楼 发表于: 2021-01-05
回 lemonzll 的帖子
lemonzll:void Widget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    QTextDocument doc;
....... (2021-01-05 08:59) 

再请教下,要是我先在指定区域内绘制,如何实现呢,
离线lemonzll

只看该作者 7楼 发表于: 2021-01-05
  1. void Widget::paintEvent(QPaintEvent *event)
  2. {
  3.     QPainter painter(this);
  4.     QTextDocument doc;
  5.     QColor textColor = "green";  //文字颜色
  6.     doc.setDefaultStyleSheet(QStringLiteral("span { background-color: %1}")
  7.                              .arg(textColor.name()));
  8.     doc.setHtml(tr("<p>Register: <span>Qt for test Qt for test Qt for test Qt for test</span></p>"));
  9.     doc.setDocumentMargin(1);
  10.     auto r = this->rect();
  11.     r.setWidth(r.width() / 2);
  12.     r.setHeight(r.height() / 2);
  13.     r.moveCenter(r.bottomRight());   //构建个画图用的矩形。这里是放在中间的1/4个矩形
  14.     painter.drawRect(r);   //绘图区域画出来,方便比较
  15.     painter.save();
  16.     painter.translate(r.topLeft());  //平移到画图区域左上角
  17.     doc.setTextWidth(r.width());  //设置画图区域宽度
  18.     //doc.drawContents(&painter, QRect{0, 0, r.width(), r.height()});  //加上第二个参数可用来使文字不超过矩形范围,这里演示不启用这个
  19.     doc.drawContents(&painter);
  20.     painter.restore();
  21. }

把qpainter的坐标平移下再画图就可以了。



4条评分好评度+1贡献值+1金钱+10威望+1
20091001753 好评度 +1 - 2021-01-05
20091001753 贡献值 +1 - 2021-01-05
20091001753 威望 +1 - 2021-01-05
20091001753 金钱 +10 - 2021-01-05
离线xing181512

只看该作者 8楼 发表于: 2021-01-05
回 lemonzll 的帖子
lemonzll:void Widget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    QTextDocument doc;
    QColor textColor = "green";  //文字颜色
....... (2021-01-05 13:23) 

快速回复
限100 字节
 
上一个 下一个