中易网

Qt的textBrowser更新显示,想实现每秒刷出一条信息;而不是函数执行完毕后,一起刷出全部的内容。

答案:3  悬赏:60  
解决时间 2021-03-07 00:23
Qt的textBrowser更新显示,想实现每秒刷出一条信息;而不是函数执行完毕后,一起刷出全部的内容。
最佳答案
写一个时间函数,定义一个QTimer对象,这个timer的interval设置为1000,时间一到就输出:
QTimer timer;
timer.setInterval(1000);
timer.start();
connect(&timer,SIGNAL(timeOut()),this,SLOT(myTimerout()));

void thisObject::myTimerOut()
{
ui->textBrowser->append(QString("hello ===>> %1").arg(i));
}

(这个timer必须是你的类成员对象,或者指针对象,不能是局部的哈)追答
追问:嗯嗯,,真不好意思,可能是我没说清楚;其实我的那个函数没这么简单的;它里面有个while(1)的死循环。在while(1)前面就有很多,要追加打印的信息,所以,QTimer这个,不怎么行得通。
追答:如果是while(1)这种,而且里面的工作量很大的话,建议你开辟新线程来做,否则你这个线程会阻塞导致while外面的工作。一般ui线程不建议存在while(1)这样工作大的死循环,毕竟ui线程有自己的消息要处理
在子线程不是去访问父线程的ui控件,而是发消息给父线程,让父线程处理子线程的消息
追问:非常感谢,我才刚开始学习Qt,开辟新线程这个,不怎么懂。有没有什么demo之类的代码可以借鉴一下呢。
追答:class ThreadProcess : public QObject
{
Q_OBJECT
public:
ThreadProcess(QObject* parent=0);
voidmyProcessEvent(){
while(1){
//do something..............
emit message("message");
}
}
signals:
void message(const QString&);

}

int main(int,char**)
{
QApplaction(.......;
YourMainWindow w;
//这里就是你的主线程
ThreadProcess subThreadProcess;
QThread subThread;
subThread.start();
//下面会把subThreadProcess放到子线程中
subThreadProcess.movetoThread(&subThread);
connect(&subThreadProcess,SIGNAL(message(const QString&)),&w,SLOT(yourslot(const QString&)));
return a.exec();
}

void YourMainWindow::yourslot(const QString& str)
{
ui->textBrowser->append(QString("hello ===>> %1").arg(str));
}
全部回答
这个是由于线程阻塞导致的现象,
你用的是C++.net还是C++?
可以采用线程来执行该效果,
如果是C++.net的话可以用到时间控件工具和线程类Thread;
C++的话就查查如何用线程吧追答
追问:我用的是Qt,C++来的。刚学,没多东西都不懂。之前也试过用Qthread,可是,没办法访问到ui->textBrowser。。可能是我的方法不对、、
之前我还以为是不是像标准C那样,满缓冲的问题。所以,想问问,textBrowser有没有什么刷新显示的成员函数呢
追答:这是因为副线程是无法访问主线程里面的东西
如果是.NET的话我就比较清楚如何解决,因为Qt我没用过,但应该支持回调函数
就是线程调用回调函数,
你while死循环是一种阻塞,用副线程来工作主线程就不会假死,
然后工作中利用回调函数改变textBrowser的值,
利用回调函数这个中介去操作主线程里面的元素
至于Qt在线程中如何用回调函数,这个就要查查咯,毕竟我也不是很熟悉,
就只能提供个思想啦
追问:嗯嗯,好的,谢谢
在while里面调用processEvent()方法让系统自动完成画图事件。
while(i--)
{
.... sleep(1);
QCoreApplication::processEvents();
}
//不过调用processEvent()是个很勉强的办法,不建议你这样做(虽然某些情况下可行)。最好的办法是用计时器。追答
追问:谢谢,为什么您会说调用processEvent()是个很勉强的办法呢。
而且,调用processEvent()输出挺不稳定的,有时候会两两出来的,不是一秒一个。。并且,while(1){PS:我的那个函数没上面那个这么简单的,我只是方便说明问题,才简单写了函数的,不好意思!}死循环前一两条信息,还是出不来。。
因为我的那个函数没这上面那个这么简单,里面还有while(1)死循环的,所以用不了计时器。
追答:因为窗体是按照事件(或信号)来响应的。你的按钮点击事件会启动on_pushButton_clicked()处理,
在on_pushButton_clicked()没有执行完,是不会去响应其他事件的(包括绘图事件)。
只有on_pushButton_clicked()保证在1秒内执行完,才会保证绘图事件每个1秒发生一次。
所以,通常没有在一个事件中去写while的。如果想写while就要在背景线程里面去做(会涉及到线程通信),这样做会复杂。
在while中processEvent,是强制去取出后面的事件并执行,这样做会破坏事件的执行顺序的(本事件还没有处理完,就去做后面的事件了),会有不可预计的影响的。
追问:很详细,谢谢!
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
喜夜古客栈在什么地方啊,我要过去处理事情
请问高中时代身高没长的人,成年了还有可能长
吞食天地复刻版 景帝墓2 怎末走啊
三乙胺是不是危险化学品重大危险源物质
苹果5S屏幕摔花了出现竖条亮线竖道道维修多少
康家坡这个地址在什么地方,我要处理点事
求游戏王2011时代的血代齿轮卡组
gta5这个画面无限加载怎么办
马上到我生日了,该怎么过?
爸爸过生日我没时间陪她过说说
中国移动孝里营业厅地址有知道的么?有点事想
负二又二分之一等于多少
单峰驼和双峰驼用英语怎么说啊?
是不是可以凭借SAT成绩来申请香港的大学会比
华享莱炸鸡汉堡怎么去啊,有知道地址的么
推荐资讯
我的世界怎么把猪头砍下来
进口蜂蜜比国产的好吗
湖南卫视天天有喜和追鱼传奇是什么时候播出?
商丘到林州汽车时刻表 m.mipang.com
华晶电动车修理铺我想知道这个在什么地方
介绍窗帘的亮点有关的短文
有一首歌词里面有春眠,有三字经又有锄禾的歌
我失去了 小作文
本人去年秋报考了西南大学函授大专觉得学的没
雅马哈jym110活塞剑头是对排气门还是进气门
如图,怎么把管理我的手机和苹果设备管理删除
死飞实心胎好累啊怎么办?
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?