2014-06-09 2 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(); 
} 

예 요약 :

나는 확인이 모두 같은 구성을 사용하는 경우 :

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

경우 가상 함수를 오버라이드하지 않는다면 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(); 
}