如何在不从 QObject 派生的情况下使用 SIGNAL 和 SLOT?
或其他方式来表达我的问题(虽然它没有解决我的问题): 'QObject::QObject' 无法访问在类 'QObject' 中声明的私有成员
我需要类中的 SIGNAL 和 SLOTS 功能,但我认为如果不从其派生,这是不可能的QObject
?
class MyClass
{
signals:
importantSignal();
public slots:
importantSlot();
};
问题似乎是我需要从 QObject
派生来使用信号和插槽......但我需要 MyClass
的默认构造函数。但由于 QObject
的以下功能,我无法构造它们: 没有复制构造函数或赋值运算符。
我尝试了很多......
所以我的应该类看起来像这样:
#include <QObject>
class MyClass: public QObject
{
Q_OBJECT
public:
explicit MyClass(QObject *parent = 0); //autogenerated by qtcreator for QObject derived class
MyClass(const MyClass * other);
signals:
importantSignal();
public slots:
importantSlot();
};
我需要 MyClass
的默认构造函数。
那么是否有可能避免“'QObject::QObject'无法访问类'QObject'中声明的私有成员”错误?
或者作为替代方案,是否有可能在没有 QObject
的情况下使用信号和槽?
我很高兴收到任何建议。
OR other way to formulate my question (though it didn't solve my problem): 'QObject::QObject' cannot access private member declared in class 'QObject'
I need SIGNALs and SLOTS functionality in my class, but I assume it is not possible without to derive from QObject
?
class MyClass
{
signals:
importantSignal();
public slots:
importantSlot();
};
The Problem seems to be that I need to derive from QObject
to use signals and slots ... but I need the default contructor of MyClass
. But I can't construct them because of the following feature of QObject
:
No Copy Constructor or Assignment Operator.
I tried a lot ...
So my shoul Class look like that:
#include <QObject>
class MyClass: public QObject
{
Q_OBJECT
public:
explicit MyClass(QObject *parent = 0); //autogenerated by qtcreator for QObject derived class
MyClass(const MyClass * other);
signals:
importantSignal();
public slots:
importantSlot();
};
I need the default contructor of MyClass
.
So is there any possibility do avoid the "'QObject::QObject' cannot access private member declared in class 'QObject'" error?
Or as an alternative is there any possibility to use signals and slots without QObject
?
I'm glad for any advice.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
如果您想要一个具有 QObject 功能的可复制对象,您需要成员资格(通过指针)而不是继承。
您可以从
QObject
派生类Handler
,其中Handler
的插槽调用其父级上的SomeInterface
虚拟函数。If you want a copyable object with
QObject
features you need membership (by pointer) rather than inheritence.You can derive a class
Handler
fromQObject
whereHandler
's slots callSomeInterface
virtual functions on its parent.如果您想使用信号/槽模式实现事件驱动功能,但不想在 Qt 的范围内工作(即您想在需要复制构造函数的 STL 容器等内部使用您的类),我建议使用 Boost::signal。
否则,不,如果不从 QObject 派生,您就不可能做您想做的事情,因为该基类是处理 Qt 运行时信号/槽功能的。
If you want to implement event-driven functionality using a signals/slots pattern, but do not want to work inside the confines of Qt (i.e., you want to use your class inside of STL containers, etc. that require copy-constructors), I would suggest using Boost::signal.
Otherwise, no, you can't possibly do what you're wanting without deriving from
QObject
since that base class is what handles the Qt runtime signals/slots functionality.如果不使用
QObject
/Q_OBJECT
,则无法使用Qt 的信号/槽机制。理论上,您可以创建一个虚拟 QObject 并将其组合到您的类中。然后,虚拟人会将插槽调用转发到您的班级。由于 Liz 在她的评论中描述的原因,您可能会遇到生命周期管理问题。
You cannot use Qt's signal/slot mechanisms without using
QObject
/Q_OBJECT
.You theoretically could create a dummy QObject and compose it into your class. The dummy would then forward the slot calls to your class. You will probably run in to issues with lifetime management, for the reasons that Liz has described in her comment.
从 Qt5 开始你可以连接到任何函数
Since Qt5 you can just connect to any function
在 Qt5 中,您使用
QObject::connect
将signal
与slot
连接:结果:
In Qt5, you use
QObject::connect
to connectsignal
withslot
:The result:
仅仅因为
QObject
不可复制并不意味着您在复制或分配类等时必须复制它。具体来说,您需要做的就是将您的类与 QObject 的副本隔离和赋值运算符(因为它们已被删除)。通常,您会将“可复制的不可复制的 QObject”分解为一个单独的类:
您可以在
QObject
实例之间复制所需的任何属性。上面复制了父对象名称和对象名称。此外,当从另一个对象移动时,其子对象将被重新设置父级,并且动态属性名称也会被传输。现在,CopyableQObject 适配器实现了所有允许派生类进行复制构造、复制分配、移动构造和移动分配的构造函数。
您的类需要做的就是从上面的适配器类派生:
我们可以测试它是否有效:
这就是完整的、可编译的示例。
Just because
QObject
is not copyable doesn't mean that you have to copy it when your class is copied, or assigned to, etc. Specifically, all you need to do is to insulate your class from QObject's copy and assignment operators (because they are deleted).Typically, you'd factor out the "copyable non-copyable QObject" into a separate class:
You can copy whatever attributes you desire between the
QObject
instances. Above, the parent and object name are copied. Furthermore, when moving from another object, its children are reparented, and dynamic property names are transferred as well.Now the
CopyableQObject
adapter implements all the constructors that will allow derived classes to be copy-constructible, copy-assignable, move-constructible and move-assignable.All your class needs to do is derive from the adapter class above:
We can test that it works:
This concludes the complete, compileable example.