我是 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。
谢谢。
附注对不起我的英语。
最佳答案
摆脱所有的麻烦以了解正在发生的事情可能是个好主意:
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
之前。
关于c++ - Qt,无法将不完整类型 'A *' 的参数转换为 'const QObject *',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24341565/