qt4 子线程给主线程发消息,发数据,通信,qthread gui postevent emit

【转帖请注明出处:blog.csdn.net/lanmanck】

用了qthread后,自然想起给gui线程发送数据。

在qt4中,QCustomEvent已经不使用了。因为qthread是从QObject继承的,所以可以使用signal,slot机制来通信。

1、在线程定义signal:

class aa:public QThread

{

Q_OBJECT

...

signals:

void sendData(char*p,int len);

}

然后在线程的cpp里面发射此信号:

emit sendData(buf,124);

注意:不需要实现此函数,因为此函数被连接到下面的slot了。

2、在gui线程,或者别的线程里面建立slot来接受此信号:

头文件:

class MyGUIClass:public QMainWindow

{

private slot:

  void receiveData(char*p,int len);

}

cpp文件:

在构造函数里先connect:

aa1 = new aa();

connect(aa1,SIGNAL(sendData(char*p,int len)),this,SLOT(receiveData(char*p,int len));

然后实现这个接收函数:

void MyGUIClass:receiveData(char*p,int len)

{

//

}

构建过程有点罗嗦,没有mfc简单。

注意:定义signals后,要加上Q_OBJECT,并且要make distclean.否则连接的时候提示找不到那个signal函数。

 

Qt 中,你可以使用 `QThread` 类来创建子线程,并使用 `QTimer` 定时器来逐行读取文本并将数据发送主线程。下面是一个示例代码: ```cpp #include <QThread> #include <QTimer> #include <QFile> #include <QTextStream> #include <QDebug> class WorkerThread : public QThread { Q_OBJECT public: explicit WorkerThread(QObject *parent = nullptr) : QThread(parent) { } signals: void dataReady(const QString& data); protected: void run() override { QFile file("your_file.txt"); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { qDebug() << "无法打开文件"; return; } QTextStream in(&file); while (!in.atEnd()) { QString line = in.readLine(); // 发送数据主线程 emit dataReady(line); // 等待一段时间,模拟定时器 msleep(1000); } file.close(); } }; class MainWindow : public QObject { Q_OBJECT public: explicit MainWindow(QObject *parent = nullptr) : QObject(parent) { WorkerThread *workerThread = new WorkerThread(this); connect(workerThread, &WorkerThread::dataReady, this, &MainWindow::handleData); workerThread->start(); } public slots: void handleData(const QString& data) { // 在主线程中处理接收到的数据 qDebug() << "收到数据:" << data; } }; int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); MainWindow mainWindow; return a.exec(); } #include "main.moc" ``` 在上面的示例中,`WorkerThread` 类继承自 `QThread`,它负责在子线程中逐行读取文本,并使用信号 `dataReady` 发送数据主线程。`MainWindow` 类是主线程的类,它在构造函数中创建了 `WorkerThread` 实例,并连接了信号槽来处理接收到的数据。 注意:为了使 `WorkerThread` 类能够使用信号和槽,需要在类定义前加上 `Q_OBJECT` 宏,并在文件末尾添加 `#include "main.moc"` 来启用 Qt 的元对象编译器(MOC)。 这样,子线程将按照一定时间间隔逐行读取文本并将数据发送主线程进行处理。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值