2014-06-09 55 views
1

我想將我的自定義小部件放入佈局中,並在另一個小部件中顯示此部件。我可以將我的小部件作爲第二個(容器)小部件的子項,並且它工作正常,但是如果我將它放入第二個(容器)小部件的佈局中,它將失敗。我已經創建了一個簡單的例子來描述它。在佈局中顯示自定義小部件

頁眉

class MyClass : public QAbstractButton 
{ 
    Q_OBJECT 
public: 
    explicit MyClass(QWidget *parent = 0); 
    void paintEvent(QPaintEvent *); 
    QSize sizeHint(); 
    QSize minimumSizeHint(); 
}; 

來源

#include <QApplication> 
#include <QAbstractButton> 
#include <QDebug> 
#include <QPainter> 
#include <QVBoxLayout> 

MyClass::MyClass(QWidget *parent) : 
    QAbstractButton(parent) 
{ 
    setGeometry(10,10, 200, 200); 
} 

void MyClass::paintEvent(QPaintEvent *) 
{ 
    QPainter painter(this); 
    QPen myPen; 
    myPen.setWidth(5); 
    painter.drawRect(QRect(QPoint(5, 5), QSize(190, 190))); 
} 

QSize MyClass::sizeHint() { 
    qDebug() << "sizeHint"; 
    return QSize(200, 200); 
} 


#define OK 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 

    QWidget container; 
    QVBoxLayout layout; 
    MyClass customWidget; 

#ifdef OK 
    // It works, but I want the same behaviour with layout 
    customWidget.setParent(&container); 
#else 
    // Doesn't work, 
    layout.addWidget(&customWidget); 
    container.setLayout(&layout); 
#endif 

    container.show(); 
    return a.exec(); 
} 

實例總結:

如果我使用建築像這樣一切就OK了:

Qwidget container; 
MyQwidget custom(&container); 
container.show(); 

如果建築看起來像這樣,沒什麼g發生:

Qwidget container; 
MyQwidget custom; 
Qlayout layout; 
layout.addWidget(custom); 
container.addLayout(layout); 
container.show(); 

是否有任何正確的方法將自定義子類小部件放入佈局?

回答

0

我找到了答案。我將小心實現sizeHint()。這是明確的C++錯誤,忘記了const。正確的方法來實現:

QSize MyClass::sizeHint() const { ... } 
+1

如果你的編譯器是兼容I如果你不覆蓋虛函數,建議使用C++ 11'override'關鍵字來獲得編譯器反饋。 – OnWhenReady

+1

@DominikSelzer更好:如果編譯器是C++ 11,不用擔心,而是使用'Q_DECL_OVERRIDE'。 –

1

旁註:你main可以通過一條線通過讓佈局知道它的作用是什麼小部件被縮短,具體如下:

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 

    QWidget container; 
    QVBoxLayout layout(&container); 
    MyClass customWidget; 
    layout.addWidget(&customWidget); 

    container.show(); 
    return a.exec(); 
} 
相關問題