【问题标题】:Text on QToolButton not being drawnQToolButton 上的文本未绘制
【发布时间】:2019-12-04 23:04:17
【问题描述】:

这是posting 的后续问题。

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

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

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 返回"geometry of the widget relative to its parent..."。您确定不应该改用 QWidget::contentsRect 吗?
  • @G.M.哦,伙计,就是这样,我现在觉得很傻。没关系,今天学到了新东西!将其发布为解决方案,我会接受!非常感谢

标签: c++ qt user-interface button


【解决方案1】:

根据评论,QWidget::frameGeometry 返回...

“小部件相对于其父级的几何形状...”

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多