gpt4 book ai didi

c++ - 如何在不从 QObject 派生的情况下使用 SIGNAL 和 SLOT?

转载 作者:IT老高 更新时间:2023-10-28 22:19:32 25 4
gpt4 key购买 nike

或其他方式来表达我的问题(虽然它没有解决我的问题):'QObject::QObject' cannot access private member declared in class 'QObject'

我的类(class)需要 SIGNAL 和 SLOTS 功能,但我认为不从 QObject 派生就不可能?

class MyClass
{
signals:
importantSignal();
public slots:
importantSlot();
};

问题似乎是我需要从 QObject 派生来使用信号和槽……但我需要 MyClass 的默认构造函数。但由于 QObject 的以下特性,我无法构造它们: No Copy Constructor or Assignment Operator .

我尝试了很多...

所以我的类(class)应该是这样的:

#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' 中声明的私有(private)成员”错误?

或者作为替代方案,是否有可能在没有 QObject 的情况下使用信号和插槽?

很高兴有任何建议。

最佳答案

如果你想要一个具有 QObject 特性的可复制对象,你需要成员资格(通过指针)而不是继承。

您可以从 QObject 派生一个类 Handler,其中 Handler 的插槽在其上调用 SomeInterface 虚函数 parent 。

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);
}

关于c++ - 如何在不从 QObject 派生的情况下使用 SIGNAL 和 SLOT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7502600/

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