QObject::connect: Cannot connect QTimer::timeout() to (null)::fuction()

本文分享了一次解决Qt中信号与槽无法连接的问题经历。通过调整代码顺序,将对象初始化提前到connect调用之前,成功解决了信号与槽连接不上这一困扰。此问题常见于初学者,希望本文能帮助遇到类似情况的开发者。

这几天连接一对信号与槽怎么也连接不上,后来在下面的这个网站找到了答案。

https://stackoverflow.com/questions/6238486/qt-qobjectconnect-cannot-connect-null

问题在于connect的时候没有初始化使用fuction()的对象

结果是只要将初始化的代码移到connect之前就行了,也不知道这么低级的错误怎么卡了我这么久:(

linux QT4调用websocket库环境下,此段代码class connection_metadata_no_tls: public QObject { Q_OBJECT public: typedef websocketpp::lib::shared_ptr<connection_metadata_no_tls> ptr; connection_metadata_no_tls(websocketpp::connection_hdl hdl, std::string uri) : m_hdl(hdl) , m_status("Connecting") , m_uri(uri) , m_server("N/A") {} void on_open(client_no_tls *client, websocketpp::connection_hdl hdl) { m_status = "Open"; status_new = true; client_no_tls::connection_ptr con = client->get_con_from_hdl(hdl); m_server = con->get_response_header("Server"); //QMetaObject::invokeMethod(m_timer, "start", Qt::QueuedConnection); m_timer = new QTimer(); connect(m_timer, SIGNAL(timeout()), this, SLOT(send_ping())); m_timer->start(30000); // 30秒间隔 qDebug()<<"on_open hdl"<<hdl._empty(); websocketpp::lib::error_code ec; client->ping(hdl,"heartbeat",ec); } void send_ping() { } void on_ping(client_no_tls *client, websocketpp::connection_hdl hdl) { // m_status = "Open"; // status_new = true; // client_no_tls::connection_ptr con = client->get_con_from_hdl(hdl); // m_server = con->get_response_header("Server"); qDebug()<<"on_ping hdl"<<hdl._empty(); websocketpp::lib::error_code ec; client->ping(hdl,"heartbeat",ec); } // if connection failed, the function will be invoke. void on_fail(client_no_tls *client, websocketpp::connection_hdl hdl) { m_status = "Failed"; status_new = false; client_no_tls::connection_ptr con = client->get_con_from_hdl(hdl); m_server = con->get_response_header("Server"); m_error_reason = con->get_ec().message(); QDEBUG<<"Err"<<QString::fromStdString(m_error_reason); } void on_close(client_no_tls *client, websocketpp::connection_hdl hdl) { m_status = "Closed"; status_new = false; client_no_tls::connection_ptr con = client->get_con_from_hdl(hdl); std::stringstream s; s << "close code: " << con->get_remote_close_code() << " (" << websocketpp::close::status::get_string(con->get_remote_close_code()) << "), close reason: " << con->get_remote_close_reason(); m_error_reason = s.str(); QDEBUG<<"Close Net"<<QString::fromStdString(m_error_reason); } void on_message(websocketpp::connection_hdl, client_no_tls::message_ptr msg) { if (msg->get_opcode() == websocketpp::frame::opcode::text) { m_messages.push_back(msg->get_payload()); // m_textMessage.append(QString::fromStdString(msg->get_payload()));//Utf8toAscii // m_textMessage = QString::fromUtf8(msg->get_payload()); // QDEBUG<<"得到了数据1"<<m_textMessage; m_binaryMessage.clear(); m_binaryMessage.append(QString::fromStdString(msg->get_payload())); QString string; string.append(m_binaryMessage);// QByteArray转QString方法2 QDEBUG<<"Get Server Message:"<<string; for(int i = 0 ; i < 20 ; i++) { if(messageback[i].is_used == 0 ) { memset(messageback[i].data,0,sizeof(messageback[i].data)); memcpy(messageback[i].data,m_binaryMessage,m_binaryMessage.length()); messageback[i].len = m_binaryMessage.length(); messageback[i].is_used =1 ; break; } } } else { m_messages.push_back(websocketpp::utility::to_hex(msg->get_payload())); // QDEBUG<<"得到了数据2"; } } websocketpp::connection_hdl get_hdl() const { return m_hdl; } std::string get_status() const { return m_status; } std::string get_uri() const { return m_uri; } void record_sent_message(std::string message) { m_messages.push_back(">> " + message); } friend std::ostream & operator<< (std::ostream & out, connection_metadata_no_tls const & data); private: websocketpp::connection_hdl m_hdl; std::string m_status; std::string m_uri; std::string m_server; std::string m_error_reason; std::vector<std::string> m_messages; QTimer *m_timer; private slots: void send_ping(); }; 编制提示 错误:'void connection_metadata_no_tls::send_ping()' cannot be overloaded void send_ping();和with 'void connection_metadata_no_tls::send_ping()' void send_ping() ^ ^
07-05
`QObject::connect(timer, &QTimer::timeout, performTask);` 报错通常是因为 `performTask` 不符合信号连接的要求。`QObject::connect` 函数要求函数必须是 `QObject` 派生类的成员函数,或者是一个可调用对象(如 lambda 表达式)。 #### 解决方案 ##### 1. 使用 lambda 表达式 如果 `performTask` 是一个普通函数,可以使用 lambda 表达式将其封装,使其能够作为函数使用。 ```cpp #include <QCoreApplication> #include <QTimer> #include <QDebug> void performTask() { qDebug() << "Task is performed after the delay."; } int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QTimer* timer = new QTimer; QObject::connect(timer, &QTimer::timeout, [&]() { performTask(); }); timer->start(2000); return a.exec(); } ``` ##### 2. 将 `performTask` 改为 `QObject` 派生类的成员函数 如果 `performTask` 需要作为函数,可将其定义为 `QObject` 派生类的成员函数。 ```cpp #include <QCoreApplication> #include <QTimer> #include <QDebug> #include <QObject> class MyClass : public QObject { Q_OBJECT public: explicit MyClass(QObject *parent = nullptr) : QObject(parent) {} public slots: void performTask() { qDebug() << "Task is performed after the delay."; } }; int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); MyClass myObject; QTimer* timer = new QTimer; QObject::connect(timer, &QTimer::timeout, &myObject, &MyClass::performTask); timer->start(2000); return a.exec(); } #include "main.moc" ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值