我是Qt的新手,当我研究老虎机/信号时,我发现了奇怪的行为。
如果我写下面的代码,那就没关系。
class A;
class B;
class A : public QObject {
Q_OBJECT
signals:
void signal(B*);
};
class B : public QObject {
Q_OBJECT
public slots:
void slot(B*) {};
public:
void f(A* a) {
connect(a, SIGNAL(signal(B*)), this, SLOT(slot(B*)));
}
};
但如果我交换A类和B类的定义:
class A;
class B;
class B : public QObject {
Q_OBJECT
public slots:
void slot(B*) {};
public:
void f(A* a) {
connect(a, SIGNAL(signal(B*)), this, SLOT(slot(B*)));
}
};
class A : public QObject {
Q_OBJECT
signals:
void signal(B*);
};
我收到错误:
main.cpp:30:9: error: no matching member function for call to 'connect'
connect(a, SIGNAL(signal(B*)), this, SLOT(slot(B*)));
^~~~~~~
/Users/Alexander/Qt/5.3/clang_64/lib/QtCore.framework/Headers/qobject.h:198:36:
note: candidate function not viable:
cannot convert argument of incomplete type 'A *' to 'const QObject *'
static QMetaObject::Connection connect(const QObject *sender, const char *signal,
为什么会这样?
我使用QT 5.3。
感谢。
P.S。抱歉我的英文。
答案 0 :(得分:5)
摆脱所有残障以了解正在发生的事情可能是一个好主意:
class QObject {};
class A;
void connect(QObject*) {}
void f(A* a) {
connect(a);
}
class A : public QObject {};
int main()
{
A a;
f(&a);
}
这是您拥有的简化版本并遇到同样的问题。问题是,在调用connect
时,A
只是向前声明了。编译器还不知道A
是否继承自QObject
。只有在稍后您定义A
并指定它。为此,A
的定义必须在调用connect
之前。