是否可以为 QObject 的父级使用共享指针?

Posted

技术标签:

【中文标题】是否可以为 QObject 的父级使用共享指针?【英文标题】:Is It Possible to Use a Shared Pointer for the Parent of a QObject? 【发布时间】:2014-09-29 07:59:22 【问题描述】:

我有一个这样的启动类,它在构造中设置了SystemController

m_systemController(new SystemController(this,
                                                 Provider::getSettingsAsSingleton())),

基本上满足:

public:
        explicit SystemController(QObject *parent,
                                  Settings& config);

我最近想在线程类中使用这个类,它不喜欢我将SystemController 传递给我,因为线程类没有父类。我试着这样传递它:

public:
explicit DataTestWorker(QObject *parent=0);//,
                                //SystemController &sysCtrl); //Obviously in my setup, it would complain about this

DataTestWorker 类实际上是线程类,在 DataTest 类中初始化。我想传递SystemController 的内存位置的原因是,Controller 类已经在类中设置了重要数据,我希望无需再次在其中运行所有初始化方法即可访问这些数据。

有没有办法以某种方式将某种“共享”指针传递给它 - 不仅这个类 - 其他类都可以访问它。我能想到的唯一解决方法是我可以使用DataTestDataTestWorker 类之间的信号和槽来操作SystemController 中的值,但这会很长而且很冗长。

有什么想法吗?如果您需要更多信息,请询问。

【问题讨论】:

不要使用单例。 99.9% 的情况下是个坏主意。 @UmNyobe - 有什么想法吗? I've recently though wanted to use this class in a threaded class, which doesn't like me passing me the SystemController as the threaded class doesn't have a parent 这行好难懂 DataTestWorker class 没有父级。如果我将SystemController 传递给它,编译器会抱怨我无法将SystemController 的地址传递给它,因为DataTestWorker 没有父级。如果我在DataTestWorker 中创建SystemController 的新实例,它会起作用,但这违背了我想要做的事情的目的。清楚吗? 那么你会怎么做 - 如果你只想要一个 Settings 类的实例和一个 SystemController 的实例?我目前正在阅读有关共享指针的信息 - 但我不确定这是否是正确的方向。 【参考方案1】:

是否可以为 QObject 的父级使用共享指针?

没有。没有共享指针,它是 QObject 的子类。而且我不明白为什么会有意义。

之所以要传递SystemController的内存位置, 是控制器类已经在类中设置了重要数据, 我希望无需运行所有初始化即可访问 再次调用其中的方法。

为什么不将SystemController settings 的概念分离到另一个 POD 类\结构中。然后你可以有任何一个

class SystemController : public QObject, public SystemSettings

class SystemController : public QObject

   SystemSettings m_settings;
   SystemSettings systemSettings() m_settings;


并根据需要使用设置。

【讨论】:

其实我想我才明白你的意思。你的意思是我应该创建一个 SystemController 设置类,它将我的变量保存在一个简单的 POD 中? 是的,一个只是为了重新组合这些变量的类。没有信号。没有插槽。没有复杂的逻辑。这个SystemSettings 类可以由 SystemController 以信号形式发送,采用第二种设计选择。 @UmNyobe,我认为您应该在答案中添加“SystemSettings 类可以由 SystemController 在信号中发送”【参考方案2】:

您可以将SystemController 调整为Singleton,并设置QMutex 保护以访问并发线程中使用的SystemController's 私有数据。

【讨论】:

我会再试一次,但我记得当我尝试过时,编译器抛出了一个错误,因为它在其构造函数中使用了 Settings 单例。我再试一次。我只是想知道是否有比这更好的替代/更好的方法

以上是关于是否可以为 QObject 的父级使用共享指针?的主要内容,如果未能解决你的问题,请参考以下文章

强制 QObject 作为 QWidget 的父级有啥后果?

从 C++ 设置创建的 qml 对象的父级不起作用

QWidget 失去了它的父级

PyQt4 & flask:无法为不同线程中的父级创建子级

QObject 使用 setParent() 将 QList 设置为父级

QSystemTrayIcon in 4.8 - 如何删除这个东西?