在布局中显示自定义小部件



我想把我的自定义小部件放入布局中,并在另一个小部件中显示它。我可以把我的小部件作为第二个(容器)小部件的孩子,它工作正常,但如果我把它放到第二个(容器)小部件的布局,它失败了。我创建了一个简单的例子来描述它。

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(); 

如果结构像这样,什么也不会发生:

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

是否有任何适当的方式把自定义子类小部件进入布局?

旁注:你的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();
}

我找到了答案。我将认真执行sizeHint()。很明显c++的错误,忘记了const。正确的实现方法:

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

相关内容

  • 没有找到相关文章

最新更新