使用指向对象的指针初始化不可复制的第三方基类

时间:2013-10-11 19:51:03

标签: c++ qt inheritance

我和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,我可以检查它是否已经关闭(也许你知道另一种简单的方法)
  • 我使用MSVC 2013 RC和GCC 4.8.1,因此C ++ 11解决方案会很棒

不要犹豫,我感谢任何建议和批评。

1 个答案:

答案 0 :(得分:1)

.ui文件可以使用派生自QWidget的自定义类,因此您可以在Designer中使用您的类 - 即使不编写任何Designer插件(也不会显示)。右键单击窗口小部件,然后选择“提升”。

您需要创建自己的QUiLoader派生版本,并提供可以创建窗口小部件的工厂方法QUiLoader::createWidget的实现。有关完整示例,请参阅this answer

然后将初始化代码放在派生小部件中。