Я сражаюсь с Qt. Не удается найти надежное решение для моей конкретной проблемы.
У нас есть пользовательский class MyWidget
который должен:
QWidget
для переопределения метода closeEvent
Проблемы:
QWidget
QUiLoader
инициализируется с помощью QUiLoader
из файла .ui
. Поэтому у меня есть только указатель QWidget*
QWidget
не копируется.QWidget
не имеет конструктора перемещенияКод (проверка ошибок и управление памятью для простоты опущены):
class MyWidget : public QWidget
{
bool m_Closed;
public:
MyWidget(QWidget* qw) :
QWidget(*qw), // error: copy constructor is private
m_Closed(false)
{}
bool IsClosed() const { return m_Closed; }
virtual void closeEvent(QCloseEvent *) override { m_Closed = true; }
};
QFile file("main.ui");
QUiLoader uiLoader;
MyWidget* uiMain = new MyWidget(uiLoader.load(&file));
uiMain->show();
Вопросов:
Обратите внимание, что:
QWidget
, поскольку мне нужно переопределить его метод.MyWidget::Init()
, чтобы инициализировать этот флаг bool
, который должен вызываться после каждого экземпляра. Но я считаю это решение ненадежным.QWidget
, я могу проверить, закрыт он или нет (возможно, вы знаете другой, простой способ)Не стесняйтесь, я ценю любые предложения и критику.
.ui
файлы могут использовать пользовательские классы, которые происходят из QWidget
, поэтому вы можете использовать свой класс в Designer - даже без написания плагинов Designer (он не будет показан). Щелкните правой кнопкой мыши виджет и выберите "Продвигать".
Вам необходимо создать собственную производную версию QUiLoader
и обеспечить реализацию заводского метода QUiLoader::createWidget
который может создавать ваши виджеты. См. Этот ответ для полного примера.
Затем вы вводите код инициализации в производном виджете.