代码之家  ›  专栏  ›  技术社区  ›  Dave Mateer

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

  •  12
  • Dave Mateer  · 技术社区  · 14 年前

    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 子类(而不是 Qpush按钮 Qpush按钮

    更新: 我现在真的在想这是个虫子。我把它交给了 Qt Bug Tracker ;我们会看看巨怪怎么想的。无论如何,从 QAbstractButton

    更新2: Qt的巨魔们提供了一个解决方案(解决方法?);我把他们的修正贴在下面作为答复。我要让他们的团队来决定这是一个特性还是一个bug。很显然,它在Mac上的表现是不同的。

    3 回复  |  直到 14 年前
        1
  •  12
  •   Dave Mateer    14 年前

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

    setAttribute(Qt::WA_LayoutUsesWidgetRect);
    

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

        2
  •  0
  •   Live    14 年前

    我不会调用setSizePolicy()和reimplementSizeHint(),而是尝试简单地调用

    setFixedSize(50, 25)

    希望这有帮助。

        3
  •  0
  •   Narek    14 年前

    你的代码对我很有用。我已经测试过了。你用什么版本?我用的是Qt 4.6.3,很好。