我需要将自定义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();
}
造成这种情况的原因是什么,我该如何解决?顺便说一句,我尝试了类似于常规QWidget
子类(而不是QPushButton
子类)的东西,并且没有问题。这是QPushButton
特有的。
更新:我现在真的在想这是一个错误。我已将其提交给Qt Bug Tracker;我们会看到巨魔的想法。无论如何,派生自QAbstractButton
修复了绘图问题......我只需重新实现我需要的一些功能。
更新2: Qt的Trolls提供了解决方案(解决方法?);我在下面发布了他们的修复作为答案。我将它留给他们的团队来确定这是一个功能还是错误。它显然只在Mac上表现不同。
答案 0 :(得分:12)
解决方案是将以下内容添加到子类中:
setAttribute(Qt::WA_LayoutUsesWidgetRect);
显然只需要在Mac平台上; Windows和Linux按预期显示布局。
答案 1 :(得分:0)
我会尝试简单地调用
而不是调用setSizePolicy()并重新实现sizeHint() setFixedSize(50, 25)
在你的构造函数中。这应该自己更新sizeHint。
希望这有帮助。
答案 2 :(得分:0)
您的代码适用于我。我测试了它。你用的是什么版本?我使用Qt 4.6.3,它很好。