如何在c++中通过指针复制QWidget

How to copy QWidget through pointers in C++

本文关键字:指针 复制 QWidget c++      更新时间:2023-10-16

我的目标是:

QWidget *p = new QSpinBox(0); // This can be any type of QWidget.
QWidget* Get()
{
  /*
  Here using p, I need to return a NEW object of QSpinBox or whatever 
  the qwidget assigned to p. I can't return p because it will be deleted
  after this method, so the next time p would be empty.
  */
}

它用于qstyleditemdelegate::createEditor()方法。当委托编辑完成后,从get返回的小部件将被删除。

根据定义,所有QObjects都是不可复制的。请参阅其头文件。QSpinBox也一样。

原因是简单的克隆信号槽内存管理可能导致不可预测的结果,所以它被设计为禁用。

对象指针的复制并不以任何方式复制对象。在Qt的QObject派生类的复制确实是禁用的,但你可以复制指针到对象周围你想要的,或者直到你用完内存…

由于Qt QObject的设计,派生类具有唯一的标识。这意味着它们不能被复制,至少在理性意义上是这样。但是,您可以编写自己的"克隆函数",该函数创建具有唯一标识的新实例,并将p所指向的对象的所有属性应用于新实例。例如,你可以把它伪造到一定的数量,但不要指望得到一个功能与原件相同的副本。如果你想获得一个功能完全相同的克隆,你将不得不实现你自己的信号和插槽机制,而不是使用Qt提供的机制。

你确实可以返回p -但是如果你对它调用delete,它将不指向任何东西。请记住,返回p将简单地复制指针,它与实际指向的对象无关。p只是一个数字。

编辑:

在更深的看看Qt提供的"反射设施",它看起来像你可以得到信号与槽克隆,但它不是漂亮,你必须查询的每个QMetaMethod QMetaObject与特定实例找到相关的信号,然后你碰壁——你将不得不诉诸使用私有api(大禁忌在99.9999%的情况下),以便查询信号接收器为了连接新副本。这绝对不是我们想要做的。简而言之,你需要重新考虑解决问题的策略。

总的来说,正如我在评论中提到的,你的问题似乎是糟糕的设计,即使从技术上讲可能使糟糕的设计发挥作用,如果你只是改进你的设计,避免艰苦的甚至是自虐的努力,你会做得更好。

s是指针,可以随意复制和修改;对复制件的修改不会影响原件。如果你指的实际上是s引用的对象,那么为它提供复制构造函数和复制赋值操作符就足够了;根据类的内容,编译器可能已经为您生成了这些内容。

根据内容的不同,编译器生成的版本也有可能不满足您的需求。

根据类的名称,我怀疑它是Qt的一部分,在这种情况下,检查文档。它可能支持克隆,在这种情况下,您可能想要的是克隆。