Qt次线程向主程序发送信号收不到的问题

问题的提出:

Qt次线程向主程序发送信号收不到,信号槽connect返回也是true,排查原因如下:

信号或槽函数中的参数用到了自定义类型,如果要在Qt信号槽中使用自定义类型,需要注意使用qRegisterMetaType对自定义类型进行注册,当然在不跨线程时使用自定义类型signal/slot来传递,可能不会出现什么问题;一旦涉及跨线程就很容易出错,回想下信号槽的作用就是用来对象与对象之间通信的,难免会跨线程,建议在使用自定义类型利用信号槽通信时,最好先通过qRegisterMetaType()将自定义类型进行注册,以免出错。

总结qRegisterMetaType使用方法如下:
1、注册位置:在第一次使用此类链接跨线程的signal/slot之前,一般在当前类的构造函数中进行注册;
2、注册方法:在当前类的顶部包含:#include<QMetaType > ,构造函数中加入代码:qRegisterMetaType<Myclass>("Myclass");
3、Myclass的引用类型需单独注册:qRegisterMetaType<Myclass&>("Myclass&");

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以给你提供一个基本的思路。 首先,你需要定义一个IP地址范围,以及要扫描的端口范围。接下来,你需要创建多个线程,每个线程负责扫描一段IP地址。 在每个线程中,你需要使用socket库来连接每个IP地址和端口号,如果连接成功,则表示该主机在线,并将其输出。 以下是一个简单的示例代码: ```cpp #include <QCoreApplication> #include <QThread> #include <QTcpSocket> #include <QDebug> const int THREAD_NUM = 10; // 创建10个线程 const int PORT_START = 1; // 扫描端口从1开始 const int PORT_END = 65535; // 扫描端口到65535结束 class ScanThread : public QThread { public: ScanThread(const QString &ip, int portStart, int portEnd) : m_ip(ip), m_portStart(portStart), m_portEnd(portEnd) { } protected: void run() override { for (int port = m_portStart; port <= m_portEnd; ++port) { QTcpSocket sock; sock.connectToHost(m_ip, port); if (sock.waitForConnected(100)) { qDebug() << m_ip << ":" << port << "is open."; } sock.close(); } } private: QString m_ip; int m_portStart; int m_portEnd; }; int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QStringList ips; ips << "192.168.1.1/24" << "192.168.2.1/24" << "192.168.3.1/24"; // 定义要扫描的IP地址范围 QList<ScanThread*> threads; for (const auto& ip : ips) { for (int i = 0; i < THREAD_NUM; ++i) { threads.append(new ScanThread(ip, PORT_START + i * (PORT_END - PORT_START) / THREAD_NUM, PORT_START + (i + 1) * (PORT_END - PORT_START) / THREAD_NUM)); } } for (auto thread : threads) { thread->start(); } for (auto thread : threads) { thread->wait(); } return a.exec(); } ``` 在这个示例代码中,我们定义了要扫描的IP地址范围,然后创建了多个线程来扫描每个IP地址和端口号。每个线程都会连接指定IP地址和端口号,如果连接成功,则将其输出。注意,在每个线程中我们使用了`waitForConnected`函数来等待连接成功,如果超时则表示该端口不可达。 希望这个示例代码可以帮助你完成IP端口扫描程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值