QTool按钮上的文本未绘制

Text on QToolButton not being drawn

本文关键字:绘制 文本 按钮 QTool      更新时间:2023-10-16

这是这篇文章的后续问题。

正在尝试一种方法,其中我子类化 QToolButton 并覆盖 paint 事件,以便首先绘制一个红色矩形,然后将文本绘制在矩形的顶部。

我的代码大部分都可以工作,但是,按钮上的文本没有被绘制。我看了一些论坛帖子,但没有多少成功。以下是油漆覆盖功能的当前版本:

virtual void paintEvent(QPaintEvent *) override
{
    QString tempText;
    QStylePainter p(this);
    QStyleOptionToolButton opt;
    initStyleOption(&opt);
    tempText = opt.text;
    opt.text = QString();
    p.save();
    p.drawComplexControl(QStyle::CC_ToolButton, opt);
    p.setBrush(QColor(255,0,0,100));
    p.setPen(Qt::NoPen);
    p.drawRect(4,4,width()-8,height()-8);
    // p.setBrush(QColor(0,0,0));
    p.setPen(QColor(0,0,0));
    p.setFont(this->font());
    p.drawText(this->frameGeometry(), Qt::AlignCenter, tempText);
    p.restore();
}

目前,代码的逻辑应该是:

1(保存包含在opt中的文本(此文本绘制在按钮上(。在我的代码中,opt中的文本保存在一个名为 tempText 的变量中

2( 将opt.text设置为空字符串

3(用中间的红色矩形绘制按钮

4( 使用正确的对齐设置在按钮上绘制tempText。为此,我正在考虑将文本绑定到按钮内的框架。但到目前为止,按钮上没有绘制任何文本。

根据注释,QWidget::frameGeometry返回...

"小部件相对于其父级的几何形状...">

这实际上不是你想要的。 相反,您需要呈现QWidget内容QRect。 所以你可能想要...

p.drawText(contentsRect(), Qt::AlignCenter, tempText);

另外,您的paintEvent实现调用QPainter::saveQPainter::restore。 这些操作可能代价高昂,除非绝对必要,否则应避免。