Показать пользовательский виджет в макете

Я хочу поместить свой пользовательский виджет в макет и показать это в другом виджете. Я могу поместить свой виджет в качестве дочернего для второго (контейнерного) виджета, и он работает нормально, но если я помещу его в макет для второго (контейнерного) виджета, он потерпит неудачу. Я создал простой пример, чтобы описать это.

заголовок

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

Если конструкция выглядит так, ничего не происходит:

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

Есть ли какой-нибудь правильный способ поместить пользовательский виджет в макет?

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

Другие решения

Я нашел ответ. Я буду осторожно реализовывать sizeHint (). Была понятна ошибка C ++, забыл про const. Правильный способ реализовать это:

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

По вопросам рекламы [email protected]