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

标签 c++ qt inheritance

我正在与 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/

相关文章:

api - 在没有包装器的情况下在 QT 上使用 OpenGL

c++ - Qt自定义QPushButton不在布局上显示

Java继承

c++ - 如果原始文件被锁定,是否可以从挂载点读取?

c++ - MSVC 和 gcc 之间的调用约定

C++ - 返回 bool 值然后验证它

java - 如何传递祖 parent 对象来调用父方法

c++ - 模板化类构造函数在结构中使用错误的重载

c++ - Qt 6.2 : QMediaPlayer & QByteArray

objective-c - 子类可以在继承方法的参数中的 block 中添加参数吗?