Qt的textBrowser更新显示,想实现每秒刷出一条信息;而不是函数执行完毕后,一起刷出全部的内容。
voidWidget::on_pushButton_clicked(){inti=3;while(i--){ui->textBrowser->append(QString...
void Widget::on_pushButton_clicked()
{
int i = 3;
while(i--)
{
ui->textBrowser->append(QString("hello ===>> %1").arg(i));
sleep(1);
}
}
我想实现的效果是每秒钟append一条信息,可是上面的执行效果是在3秒钟后,一起刷出的。请问哪位有没有什么办法实现我想要的那样子,每一秒钟更新一条,而不是等到该函数执行完后再一起刷出!!
感激不尽。。。 展开
{
int i = 3;
while(i--)
{
ui->textBrowser->append(QString("hello ===>> %1").arg(i));
sleep(1);
}
}
我想实现的效果是每秒钟append一条信息,可是上面的执行效果是在3秒钟后,一起刷出的。请问哪位有没有什么办法实现我想要的那样子,每一秒钟更新一条,而不是等到该函数执行完后再一起刷出!!
感激不尽。。。 展开
3个回答
展开全部
写一个时间函数,定义一个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必须是你的类成员对象,或者指针对象,不能是局部的哈)
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控件,而是发消息给父线程,让父线程处理子线程的消息
展开全部
在while里面调用processEvent()方法让系统自动完成画图事件。
while(i--)
{
.... sleep(1);
QCoreApplication::processEvents();
}
//不过调用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,是强制去取出后面的事件并执行,这样做会破坏事件的执行顺序的(本事件还没有处理完,就去做后面的事件了),会有不可预计的影响的。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这个是由于线程阻塞导致的现象,
你用的是C++.net还是C++?
可以采用线程来执行该效果,
如果是C++.net的话可以用到时间控件工具和线程类Thread;
C++的话就查查如何用线程吧
你用的是C++.net还是C++?
可以采用线程来执行该效果,
如果是C++.net的话可以用到时间控件工具和线程类Thread;
C++的话就查查如何用线程吧
更多追问追答
追问
我用的是Qt,C++来的。刚学,没多东西都不懂。之前也试过用Qthread,可是,没办法访问到ui->textBrowser。。可能是我的方法不对、、
之前我还以为是不是像标准C那样,满缓冲的问题。所以,想问问,textBrowser有没有什么刷新显示的成员函数呢
追答
这是因为副线程是无法访问主线程里面的东西
如果是.NET的话我就比较清楚如何解决,因为Qt我没用过,但应该支持回调函数
就是线程调用回调函数,
你while死循环是一种阻塞,用副线程来工作主线程就不会假死,
然后工作中利用回调函数改变textBrowser的值,
利用回调函数这个中介去操作主线程里面的元素
至于Qt在线程中如何用回调函数,这个就要查查咯,毕竟我也不是很熟悉,
就只能提供个思想啦
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询