为什么QHBoxLayout导致窗口小部件重叠?

Dav*_*eer 12 c++ qt

我需要将自定义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按预期显示布局.