2010-10-20 104 views
11

我需要的地方彼此相邻定制QPushButton子类的几个实例。出于某种原因,涂漆时按钮重叠。下面是一个简化的问题示例。QHBoxLayout为什么会导致窗口小部件重叠?

这里是(不正确)输出:

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得出的修复了绘图问题......我只需重新实现我需要的一些功能。 Qt Trolls提供了一个解决方案(解决方法是什么?)。我在下面发布了他们的修复方案我将它留给他们的团队来确定这是一个功能还是错误。它显然只在Mac上表现不同。

+1

我没有看到任何解决您的按钮的大小。您指定它将被固定并且尺寸提示,但不是他的实际尺寸。你是否在真实的代码中执行它? – Live 2010-10-20 15:26:57

+0

@Live:但是这不是QHBoxLayout的重点吗?它不应该使用大小提示来确定每个小部件的理想大小吗? (例如,如果尺寸提示和政策允许,允许一些展开/合同)。 – 2010-10-20 15:44:19

+0

@Live:我确认尺寸合适。如果你做了一个qDebug()<< size(),它是正确的。 – 2010-10-20 15:46:42

回答

11

的解决方案是添加以下子类:

setAttribute(Qt::WA_LayoutUsesWidgetRect); 

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

+0

你在哪里添加了这个? – chacham15 2013-01-01 00:57:58

+0

@ chacham15:你可以将它添加到子类的构造函数中,在我上面的例子中是MyButton。 – 2013-01-02 13:53:14

0

而不是调用setSizePolicy()并重新实现sizeHint()的话,我会简单地调用

setFixedSize(50, 25)

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

希望这会有所帮助。

+0

'setFixedSize'导致相同的行为。我真的开始认为这只是一个错误。 – 2010-10-20 17:03:19

0

您的代码为我工作得很好。我已经测试过它。你使用什么版本?我使用Qt 4.6.3,这很好。

+0

我在Mac OS X 10.6.4上; Qt 4.7.0 – 2010-10-21 12:23:34

+0

我认为这是问题所在。是的,可能是一个错误。 – Narek 2010-10-21 13:34:12

相关问题