6e6*_*d65 16 c++ qt qobject slot qt-signals
或其他方式来表达我的问题(虽然它没有解决我的问题):'QObject :: QObject'无法访问类'QObject'中声明的私有成员
我的课程中需要SIGNALs和SLOTS功能,但我认为不可能从中衍生出来QObject?
class MyClass
{
signals:
importantSignal();
public slots:
importantSlot();
};
Run Code Online (Sandbox Code Playgroud)
问题似乎是我需要派生QObject来使用信号和插槽......但我需要默认的构造函数MyClass.但由于以下特性,我无法构造它们QObject:
No Copy Constructor或Assignment Operator.
我试了很多......
所以我的上课看起来像这样:
#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();
};
Run Code Online (Sandbox Code Playgroud)
我需要默认的构造函数MyClass.
那么有没有可能避免"'QObject :: QObject'无法访问类'QObject'中声明的私有成员"错误?
或者作为替代方案是否有可能没有使用信号和插槽QObject?
我很高兴有任何建议.
spr*_*aff 11
如果您想要一个具有QObject功能的可复制对象,则需要成员资格(通过指针)而不是继承.
您可以派生一个类Handler从QObject那里Handler的插槽调用SomeInterface其父虚函数.
struct NonQObjectHandler {
virtual ~ NonQObjectHandler () {}
virtual void receive (int, float) = 0;
};
class Handler : public NonQObjectHandler {
struct Receiver;
std :: unique_ptr <Receiver> m_receiver;
void receive (int, float); // NonQObjectHandler
public:
Handler ();
Handler (const Handler &); // This is what you're really after
};
class Handler :: Receiver : public QObject {
Q_OBJECT
private:
NonQObjectHandler * m_handler;
private slots:
void receive (int, float); // Calls m_handler's receive
public:
Receiver (NonQObjectHandler *);
};
Handler :: Handler ()
: m_receiver (new Receiver (this))
{
}
Handler :: Handler (const Handler & old)
: m_receiver (new Receiver (this))
{
// Copy over any extra state variables also, but
// Receiver is created anew.
}
Handler :: Receiver :: Receiver (NonQObjectHandler * h)
: m_handler (h)
{
connect (foo, SIGNAL (bar (int, float)), this, SLOT (receive (int, float)));
}
void Handler :: Receiver :: receive (int i, float f)
{
m_handler -> receive (i, f);
}
Run Code Online (Sandbox Code Playgroud)
如果你想使用信号/槽模式实现事件驱动的功能,但又不想在Qt的范围内工作(即,你想在STL容器内使用你的类,需要复制构造函数等),我建议使用Boost :: signal.
否则,不,你不可能在没有派生的情况下做你想要的东西,QObject因为那个基类是处理Qt运行时信号/槽功能的.