Qt QThread线程中Getter/Setter方法无法正常取值问题求解
问题根因
你的Getter/Setter失效和Qt线程机制无关,是基础的作用域与实例不共享错误:
- 你在
main函数中创建了msge类的实例myObj,仅给这个实例的stra、strb属性赋了值 - 但在线程执行入口
run()函数内,你又重新声明了一个局部的msge myObj,这个全新实例和main里的实例没有任何关联,它的成员变量是默认构造的空QString,自然读不到之前设置的值 - 额外的逻辑冗余:你给线程套了while循环,但循环体执行一次就break,完全没有循环的必要。
修复方案
核心思路是把主线程中已经赋值的参数传递给线程对象,而不是在线程内部新建空实例读取。
1. 修改NetworkThread类定义,增加参数存储成员
更新networkthread.h代码:
#ifndef NETWORKTHREAD_H #define NETWORKTHREAD_H #include <QThread> #include <QString> #include "msg.h" class NetworkThread : public QThread { public: // 新增构造函数,支持外部传入已赋值的msge对象 explicit NetworkThread(const msge& obj, QObject *parent = nullptr) : QThread(parent), m_msg(obj) {} void run() override; private: // 成员变量存储传入的参数实例 msge m_msg; }; #endif // NETWORKTHREAD_H
2. 修改run函数逻辑,读取成员变量的值
更新networkthread.cpp代码:
#include "networkthread.h" #include <QDebug> #include <QCoreApplication> void NetworkThread::run() { // 移除无意义的循环,直接读取成员变量存储的值 QString str = m_msg.getstra(); QString strb = m_msg.getstrb(); qDebug() << str << "str first"; qDebug() << strb << "str second"; QCoreApplication::quit(); }
3. 修改main函数,启动线程前传入已赋值的对象
更新main.cpp代码:
#include "networkthread.h" #include <QCoreApplication> #include "msg.h" #include <QString> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // 增加参数合法性校验,避免未传参时访问argv越界崩溃 if (argc < 3) { qDebug() << "启动时需传入两个字符串参数"; return -1; } QString str = argv[1]; QString strb = argv[2]; msge myObj; myObj.setstra(str); myObj.setstrb(strb); // 线程创建时传入已经赋值好的myObj实例 NetworkThread networkThread(myObj); networkThread.start(); int result = a.exec(); networkThread.requestInterruption(); networkThread.wait(2000); return result; }
代码规范优化建议
- 不要在头文件中写
using namespace std;,极易造成命名空间污染,标准库命名空间引用应该放在cpp文件内,或使用时写全std::前缀 msge类的getter方法不会修改成员变量,应该标记为const符合C++规范,例如QString getstra() const { return stra; }- 跨线程读写共享对象时,如果存在多线程并发写的场景,必须加
QMutex做线程同步,避免数据竞争;当前场景是主线程先完成赋值再启动子线程,不存在并发访问,不需要加锁 - 如果参数逻辑简单,不需要单独封装
msge类,直接给NetworkThread增加两个QString成员存储参数即可,代码更简洁。
内容的提问来源于stack exchange,提问作者Poorvaja
相关产品推荐
相关产品推荐

