C++ 未绘制QToolButton上的文本
这是一个后续问题 我正在尝试一种方法,在该方法中,我将QToolButton子类化,并覆盖绘制事件,以便首先绘制一个红色矩形,然后在矩形顶部绘制文本 我的代码大部分工作,但是,按钮上的文本没有被绘制。我看了一些论坛帖子,但没有太多的内容。以下是“绘制覆盖”功能的当前版本:C++ 未绘制QToolButton上的文本,c++,qt,user-interface,button,C++,Qt,User Interface,Button,这是一个后续问题 我正在尝试一种方法,在该方法中,我将QToolButton子类化,并覆盖绘制事件,以便首先绘制一个红色矩形,然后在矩形顶部绘制文本 我的代码大部分工作,但是,按钮上的文本没有被绘制。我看了一些论坛帖子,但没有太多的内容。以下是“绘制覆盖”功能的当前版本: virtual void paintEvent(QPaintEvent *) override { QString tempText; QStylePainter p(this); QStyleOpti
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
中的文本保存在名为testext
2) 将opt.text
设置为空字符串
3) 绘制中间有红色矩形的按钮
4) 使用正确的对齐设置在按钮上绘制testext
。为此,我考虑将文本绑定到按钮内的框架。但到目前为止,按钮上没有绘制文本。根据注释,返回
“小部件相对于其父级的几何图形…”
这不是你想要的。您需要的是QRect
,其中将呈现QWidget
的内容。所以你可能想
p.drawText(contentsRect(), Qt::AlignCenter, tempText);
另外,您的
paintEvent
实现调用QPainter::save
和QPainter::restore
。这些操作可能非常昂贵,除非绝对必要,否则应避免使用。注意,返回的是“小部件相对于其父部件的几何图形…”
。你确定你不应该改用它吗?@G.M.胡曼,就是这样,我现在觉得很傻。没关系,今天学到了新东西!将其作为解决方案发布,我将接受它!非常感谢你