有一种解决方案来创建纯虚函数,它将给定的插槽连接到信号,反之亦然。例如为:
class IBaseInterface
{
public:
virtual bool connectToSignal1(QObject* pReceiver, const char* pszSlot, bool bConnect) const = 0;
};
class CDerived : public QObject, public IBaseInterface
{
Q_OBJECT
public:
virtual bool connectToSignal1(QObject* pReceiver, const char* pszSlot, bool bConnect) const;
signals:
void signal1(const QString& msg);
};
bool CDerived::connectToSignal1(QObject* pReceiver, const char* pszSlot, bool bConnect) const
{
if(bConnect)
return connect(this, SIGNAL(signal1(QString)), pReciever, pszSlot);
return disconnect(this, SIGNAL(signal1(QString)), pReciever, pszSlot);
}
进一步在客户代码之一可以输入:
class CSomeClass : public QObject
{
Q_OBJECT
protected /*or public, or private*/ slots:
void someSlot(const QString& msg);
};
void CSomeClass::somefunction()
{
IBaseInterface* p = new CDerived;
if (!p->connectToSignal1(this, SLOT(someSlot(QString)), true))
QMessageBox::warning(this, tr("Warning"), tr("Cannot connect ...."), QMessageBox::Ok);
}
[在不相关的说明Qt确实允许纯虚拟插槽......但没有提到纯虚拟信号。](http://stackoverflow.com/questions/2998216/does-qt-support-virtual-pure-slots ) – 2012-04-05 13:08:24
为什么你认为你想让信号变为虚拟? – Chris 2012-04-05 14:05:54
在此答案中给出了一种使用CRTP和泛型基类的不同方法(http://stackoverflow.com/a/32124726/1329652)。它允许容易地分解多个'QObject'派生类的通用代码,即使它们来自不同的基类(当然,它们不需要直接从'QObject'派生)。尽管如此, – 2015-08-20 17:51:22