我正在编写一个简单的EchoServer
类,继承自QTcpServer
。当我在构造函数中连接信号和插槽时,它并不顺利。
class EchoServer : public QTcpServer {
//Q_OBJECT
public:
EchoServer(int listenling_port) {
this->listen(QHostAddress(), listenling_port);
connect(this, SIGNAL(newConnection()), this, SLOT(HandleIncomingConnection()));
}
public slots:
void HandleIncomingConnection() {
auto echo_handler = EchoServerHandler(this->nextPendingConnection());
echo_handler.Echo();
}
private:
};
应用程序会侦听端口,并且可以进行telneted。但控制台显示
“ QObject :: connect:没有这样的插槽QTcpServer :: HandleIncomingConnection()”,
似乎它将this
识别为基类QTcpServer
指针。
此外,如果我在代码中留下Q_OBJECT
,则无法编译,说
“错误LNK2001:未解析的外部符号”public:virtual struct QMetaObject const * __thiscall EchoServer :: metaObject(void)const“(?metaObject @ EchoServer @@ UBEPBUQMetaObject @@ XZ)”,< / p>
他们有关系吗?
答案 0 :(得分:2)
您需要在代码中留下Q_OBJECT
,并且需要一个析构函数来与您的班级一起使用。
您可能需要在代码上运行“Clean Project”来修复该链接器错误。
希望有所帮助。
答案 1 :(得分:0)
phyatt答案中的链接Q_OBJECT linker error!帮助我找到问题所在。所以我会自己回答。
问题中的代码完全放在一个main.cpp
文件中,这会阻止Qt的元处理。将类定义放入单独的hpp
标头并重新编译,问题就消失了。我使用的是Visual Studio 2012 + Qt 5.0。