我需要将自定义QPushButton子类的多个实例放在一起.出于某种原因,按钮在绘制时会相互重叠.下面是问题的简化示例.
这是(不正确的)输出:

这是代码:
#include <QtGui>
class MyButton : public QPushButton {
public:
explicit MyButton(Qt::GlobalColor color, QWidget *parent = NULL)
: QPushButton(parent), color_(color) {
setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
}
QSize sizeHint() const {
return QSize(50, 25);
}
protected:
void paintEvent(QPaintEvent *) {
QPainter painter(this);
painter.setOpacity(0.5);
painter.fillRect(0, 0, width(), height(), color_);
}
private:
Qt::GlobalColor color_;
};
int main(int argc, char **argv) {
QApplication app(argc, argv);
QWidget widget;
QHBoxLayout *layout = new QHBoxLayout;
layout->setSpacing(0);
MyButton *w1 = new MyButton(Qt::red);
MyButton *w2 = new MyButton(Qt::green);
MyButton *w3 = new MyButton(Qt::blue);
layout->addWidget(w1);
layout->addWidget(w2);
layout->addWidget(w3);
widget.setLayout(layout);
widget.show();
return app.exec();
}
Run Code Online (Sandbox Code Playgroud)
造成这种情况的原因是什么,我该如何解决?顺便说一下,我尝试过类似于常规QWidget子类(而不是QPushButton子类)的东西,并且没有问题.这是特有的东西QPushButton.
更新:我现在真的在想这是一个错误.我把它提交给了Qt Bug Tracker ; 我们会看到巨魔的想法.在任何情况下,从QAbstractButton修复绘图问题得出......我只需要重新实现我需要的一些功能.
更新2: Qt的Trolls提供了解决方案(解决方法?); 我在下面发布了他们的修复作为答案.我将它留给他们的团队来确定这是一个功能还是错误.它显然只在Mac上表现不同.
Dav*_*eer 12
解决方案是将以下内容添加到子类中:
setAttribute(Qt::WA_LayoutUsesWidgetRect);
Run Code Online (Sandbox Code Playgroud)
显然它只需要在Mac平台上; Windows和Linux按预期显示布局.