在派生的QObject构造函数中连接Qt信号和插槽

时间:2013-04-25 04:07:54

标签: c++ qt signals-slots

我正在编写一个简单的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>

他们有关系吗?

2 个答案:

答案 0 :(得分:2)

您需要在代码中留下Q_OBJECT,并且需要一个析构函数来与您的班级一起使用。

您可能需要在代码上运行“Clean Project”来修复该链接器错误。

另请查看Q_OBJECT linker error!

希望有所帮助。

答案 1 :(得分:0)

phyatt答案中的链接Q_OBJECT linker error!帮助我找到问题所在。所以我会自己回答。

问题中的代码完全放在一个main.cpp文件中,这会阻止Qt的元处理。将类定义放入单独的hpp标头并重新编译,问题就消失了。我使用的是Visual Studio 2012 + Qt 5.0。