gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 07:21:55 30 4
gpt4 key购买 nike

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

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com