Qt的textBrowser更新显示,想实现每秒刷出一条信息;而不是函数执行完毕后,一起刷出全部的内容。
答案:3 悬赏:60
解决时间 2021-03-07 00:23
- 提问者网友:欲望失宠
- 2021-03-06 17:03
Qt的textBrowser更新显示,想实现每秒刷出一条信息;而不是函数执行完毕后,一起刷出全部的内容。
最佳答案
- 二级知识专家网友:三千妖杀
- 2021-03-06 18:33
写一个时间函数,定义一个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));
}
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));
}
全部回答
- 1楼网友:从此江山别
- 2021-03-06 19:30
这个是由于线程阻塞导致的现象,
你用的是C++.net还是C++?
可以采用线程来执行该效果,
如果是C++.net的话可以用到时间控件工具和线程类Thread;
C++的话就查查如何用线程吧追答
追问:我用的是Qt,C++来的。刚学,没多东西都不懂。之前也试过用Qthread,可是,没办法访问到ui->textBrowser。。可能是我的方法不对、、
之前我还以为是不是像标准C那样,满缓冲的问题。所以,想问问,textBrowser有没有什么刷新显示的成员函数呢
追答:这是因为副线程是无法访问主线程里面的东西
如果是.NET的话我就比较清楚如何解决,因为Qt我没用过,但应该支持回调函数
就是线程调用回调函数,
你while死循环是一种阻塞,用副线程来工作主线程就不会假死,
然后工作中利用回调函数改变textBrowser的值,
利用回调函数这个中介去操作主线程里面的元素
至于Qt在线程中如何用回调函数,这个就要查查咯,毕竟我也不是很熟悉,
就只能提供个思想啦
追问:嗯嗯,好的,谢谢
你用的是C++.net还是C++?
可以采用线程来执行该效果,
如果是C++.net的话可以用到时间控件工具和线程类Thread;
C++的话就查查如何用线程吧追答
追问:我用的是Qt,C++来的。刚学,没多东西都不懂。之前也试过用Qthread,可是,没办法访问到ui->textBrowser。。可能是我的方法不对、、
之前我还以为是不是像标准C那样,满缓冲的问题。所以,想问问,textBrowser有没有什么刷新显示的成员函数呢
追答:这是因为副线程是无法访问主线程里面的东西
如果是.NET的话我就比较清楚如何解决,因为Qt我没用过,但应该支持回调函数
就是线程调用回调函数,
你while死循环是一种阻塞,用副线程来工作主线程就不会假死,
然后工作中利用回调函数改变textBrowser的值,
利用回调函数这个中介去操作主线程里面的元素
至于Qt在线程中如何用回调函数,这个就要查查咯,毕竟我也不是很熟悉,
就只能提供个思想啦
追问:嗯嗯,好的,谢谢
- 2楼网友:舍身薄凉客
- 2021-03-06 18:54
在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,是强制去取出后面的事件并执行,这样做会破坏事件的执行顺序的(本事件还没有处理完,就去做后面的事件了),会有不可预计的影响的。
追问:很详细,谢谢!
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,是强制去取出后面的事件并执行,这样做会破坏事件的执行顺序的(本事件还没有处理完,就去做后面的事件了),会有不可预计的影响的。
追问:很详细,谢谢!
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯