0

我正在与 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 解决方案会很棒

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

4

1 回答 1

1

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

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

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

于 2013-10-11T21:22:17.110 回答