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

12

我需要将多个自定义的 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;我们将看看Trolls的想法。无论如何,从QAbstractButton派生可以解决绘图问题...我只需要重新实现一些所需的功能。
更新2:Qt的巨魔们提供了一个解决方案(变通方法?);我将他们的解决方案发布为下面的答案。我把这个问题交给他们的团队来确定这是一个功能还是一个错误。显然,它在Mac上的行为有所不同。

1
我没有看到任何固定您PushButton大小的内容。您指定它将被固定并设置了sizeHint,但没有实际大小。您在实际代码中是否这样做了? - Live
@Live:我已经验证了尺寸是正确的。如果你使用 qDebug() << size(),它就是正确的。 - Dave Mateer
如果你拉伸窗口会发生什么(你可以吗?) - Live
@直播:如果您拉伸窗口,按钮之间的边距会扩大,而按钮保持固定大小。如果您执行layout->addStretch(1),则按钮仍会重叠。这几乎就像布局错误地计算了所有按钮所需的大小。我可能会将此作为错误进行提交。 - Dave Mateer
1
今晚我有机会测试了你的代码。它在Windows 7上使用Qt 4.6.2和Linux上使用Qt 4.5.3编译并正确运行,所以我删除了之前的回答。因此,可能是在MacOS下出现了错误。你能指出操作系统和Qt的版本吗? - Arnold Spence
显示剩余2条评论
3个回答

12
解决方案是在子类中添加以下内容:
setAttribute(Qt::WA_LayoutUsesWidgetRect);

显然,这只在Mac平台上是必要的;Windows和Linux会按预期显示布局。


@chacham15:你可以将它添加到子类的构造函数中,就像我上面示例中的 MyButton 一样。 - Dave Mateer

0

不要调用setSizePolicy()和重新实现sizeHint(),我建议你在构造函数中直接调用

setFixedSize(50, 25)

这样就可以自动更新sizeHint了。

希望能对你有所帮助。


“setFixedSize”会导致相同的行为。我真的开始认为这只是一个错误。 - Dave Mateer

0

你的代码在我这里运行良好,我已经测试过了。你用的是哪个版本?我使用的是Qt 4.6.3,也很好。


我在 Mac OS X 10.6.4 上;Qt 版本是 4.7.0。 - Dave Mateer
我认为那就是问题所在。是的,可能是个bug。 - Narek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接