Qt中怎么实现textEdit实时更新?
我用qt写一个串口收发软件,当收到数据后显示在面板的textEdit中,但我不知道应该怎么让数据不断显示。这个显示的函数应该放到哪里?如果放到主函数中用一个while(1...
我用qt写一个串口收发软件,当收到数据后显示在面板的textEdit中,但我不知道应该怎么让数据不断显示。这个显示的函数应该放到哪里?如果放到主函数中用一个while(1)循环的话就响应不了其他的消息了。还是应该开辟一个线程给它?
图片是程序的主界面,它是一个自定义的类usartMW,继承自QMainWindow类,类里就只有一些鼠标点击的信号槽:
void on_uart_activated(int index); void on_bps_activated(int index); void on_stopBit_activated(int index); void on_uartSw_clicked(); void on_displaySw_clicked();
程序的主函数如下:
int main(int argc, char *argv[]){ QApplication a(argc, argv); QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));//显示中文 usartMW w; w.show(); return a.exec();} 展开
图片是程序的主界面,它是一个自定义的类usartMW,继承自QMainWindow类,类里就只有一些鼠标点击的信号槽:
void on_uart_activated(int index); void on_bps_activated(int index); void on_stopBit_activated(int index); void on_uartSw_clicked(); void on_displaySw_clicked();
程序的主函数如下:
int main(int argc, char *argv[]){ QApplication a(argc, argv); QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));//显示中文 usartMW w; w.show(); return a.exec();} 展开
展开全部
用信号槽机制。
你应该是用qt中的串口模块写的吧,这个模块在接收到新数据时可以发出消息。将这个消息和你textEdit设置text的槽连接起来就行了。
我估计串口模块已经默认开了一个新线程了吧,C#中是这样,我还没用过qt的串口模块,你看看文档。如果没有开,那自然最好放在新线程中。不过通常串口接收数据频率不会太高,你如果放在主线程中估计也不会影响界面的交互。
你应该是用qt中的串口模块写的吧,这个模块在接收到新数据时可以发出消息。将这个消息和你textEdit设置text的槽连接起来就行了。
我估计串口模块已经默认开了一个新线程了吧,C#中是这样,我还没用过qt的串口模块,你看看文档。如果没有开,那自然最好放在新线程中。不过通常串口接收数据频率不会太高,你如果放在主线程中估计也不会影响界面的交互。
追问
串口的读写函数是我自己写的,如果用单线程的话应该把读写函数放到哪里呢?我把部分代码贴到问题补充里了,你看一下,主函数最后是进入了一个消息循环(a.exec())里面,我的读写函数不可能放到里面去吧?
初学Qt,很多东西还不懂,请多指教。
追答
我刚看了一下QSerialPort类,这个类模块是在Qt 5.1中引入的,如果你用的是低版本的就没这个类了,只能自己编写或者用网上的第三方类,当然我更建议后者。
第三方类库多用qextserialport,你可以参考下面这个网址:
http://lhqvip.blog.51cto.com/2211973/636193
http://blog.csdn.net/yafeilinux/article/details/4717706
另,关于QSerialPort类,我估计是因为刚刚加入的新模块,功能还不全。从QAssist看到,这个类只支持阻塞式的串口通信,也就是说没有事件循环,并不会通知你串口有数据到来了,需要你写一个死循环,在其中不断循环接收串口数据,也许根本就没数据,这就是阻塞式不好的地方。
这样说来,QSerialPort就不会自己开新线程了,与C#不同。所以你要自己开一个新线程,把那个读数据的死循环所在的函数放到这个新线程中,以免GUI线程没有响应,这个你自己看Qt多线程的用法吧。
如果是你自己写的串口通信类,我就不清楚你的程序了,你自己应该最清楚。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询