我正在与 Qt 战斗。无法为我的特定问题找到可靠的解决方案。
我们有自定义 class MyWidget
必须:
- 派生自
QWidget
以覆盖closeEvent
方法 - 具有必须在构造函数中初始化的字段
问题:
QWidget
的内部使用.ui
文件中的QUiLoader
初始化。所以我只有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
,我可以检查它是否已关闭(也许您知道另一种简单的方法) - 我使用 MSVC 2013 RC 和 GCC 4.8.1,所以 C++11 解决方案会很棒
不要犹豫,我感谢任何建议和批评。
最佳答案
.ui
文件可以使用派生自 QWidget
的自定义类,因此您可以在 Designer 中使用您的类 - 即使不编写任何 Designer 插件(它不会被显示)。右键单击小部件并选择“升级”。
您需要创建您自己的 QUiLoader
派生版本,并提供可以创建您的小部件的工厂方法 QUiLoader::createWidget
的实现。参见 this answer一个完整的例子。
然后将初始化代码放入派生小部件中。
关于c++ - 使用指向对象的指针初始化不可复制的第三方基类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19326126/