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

时间:2010-10-20 14:24:46

标签: c++ qt

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

这是(不正确的)输出:

overlapping

以下是代码:

#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上表现不同。

3 个答案:

答案 0 :(得分:12)

解决方案是将以下内容添加到子类中:

setAttribute(Qt::WA_LayoutUsesWidgetRect);

显然只需要在Mac平台上; Windows和Linux按预期显示布局。

答案 1 :(得分:0)

我会尝试简单地调用

而不是调用setSizePolicy()并重新实现sizeHint()

setFixedSize(50, 25)

在你的构造函数中。这应该自己更新sizeHint。

希望这有帮助。

答案 2 :(得分:0)

您的代码适用于我。我测试了它。你用的是什么版本?我使用Qt 4.6.3,它很好。