我和Qt打架。无法找到针对我的具体问题的可靠解决方案。
我们必须自定义class MyWidget
:
QWidget
以覆盖closeEvent
方法问题:
QWidget
使用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
,我可以检查它是否已经关闭(也许你知道另一种简单的方法)不要犹豫,我感谢任何建议和批评。
答案 0 :(得分:1)
.ui
文件可以使用派生自QWidget
的自定义类,因此您可以在Designer中使用您的类 - 即使不编写任何Designer插件(也不会显示)。右键单击窗口小部件,然后选择“提升”。
您需要创建自己的QUiLoader
派生版本,并提供可以创建窗口小部件的工厂方法QUiLoader::createWidget
的实现。有关完整示例,请参阅this answer。
然后将初始化代码放在派生小部件中。