Qt在程序执行的过程中刷新界面

qt程序执行的过程中,一般是不会仅仅通过setText函数将文字刷新到界面上,如果想根据需要不断地显示文字到主界面上该怎么做呢?

    为什么不会刷新界面呢,这是由于调用show函数之后,并不能显示界面,必须调用如下图片的中的a.exec函数才能刷新出界面,而这个函数肯定最后才能执行到,所以一般在主线程中进行的setText向界面上添加文字的操作,只有a.exec()执行后才显示。

 

自己给自己发信号,编译之后还是在主线程中。因为自己发的信号连接的槽中写个死循环,那主线程也就死掉了,出不来了。自己给自己发信号来刷新界面也是行不通的。

方法一:开启线程,创建一个C++类继承QThread,也能实现,但我认为有以下三个缺点。

        缺点一:

        线程一般是进行一些费时较长的操作。所以主线程就先执行完,先调到a.exec这个函数。支路线程就可以通过发信号,指导主界面上文字的显示了。但是支路线程发一次信号,而槽函数中调用100次setText,那也是100次执行完之后,只显示最后的一个结果,还是看不到中间的过程,那就采取的方式就是发一次信号setText一次。

        缺点二:

        让主界面与线程对象通信,线程发信号(信号参数为要发的文字),主界面槽函数连接这个信号,这样线程->start()就能启动线程,执行重写的run函数,在run函数中发信号,刷新界面了。由于start(),run()都不带参数,那我们线程发信号(信号参数为要发的文字)所需要的参数,就只能从线程执行的函数(比如说转移本地数据到远程数据库)当中获取了。这就意味着,我们创建一个本地数据转移到远程的界面之后,本地数据转移到远程这个函数,不能写在界面同名的那个cpp当中,却要写在另外开的一个线程类中。

       缺点三:

       如果支路线程中,转移数据时,出现了可处理的异常,这时想弹出一个界面,让人工选择判断处理,这是做不到的,因为线程中不能出现ui界面相关的东西,如果出现了,一编译就会报错。

     注:或许你能发信号让主界面弹出ui界面,将选择的结果,再通过发信号通知线程,如果这样的话,就得让线程再给主界面发弹出ui界面的信号后,等待一下选择的结果。如何等待呢?我的等待方法是 

         while(flag)

              QThread::sleep(1)

每隔一秒,看看flag是否为true,如果选择完毕后,主界面发信号回来,将flag赋值false,此时支路线程继续往下走。也可行,比较折腾。

方法二:向界面上添加文字时,setText(文字);然后紧接着 qApp->processEvents(),这句代码能及时刷新界面,a.exec()当中其实调用的也是这个函数。

    如果初始化的过程中想不停地刷新界面,那就在构造函数中,刷新界面前,调用this->show,然后qApp->processEvents()。

 

[static] void QCoreApplication::processEvents(QEventLoop::ProcessEventsFlags flags = QEventLoop::AllEvents)

Processes all pending events for the calling thread according to the specified flags until there are no more events to process.

You can call this function occasionally when your program is busy performing a long operation (e.g. copying a file).

In the event that you are running a local loop which calls this function continuously, without an event loop, the DeferredDelete events will not be processed. This can affect the behaviour of widgets, e.g. QToolTip, that rely on DeferredDelete events to function properly. An alternative would be to call sendPostedEvents() from within that local loop.

Calling this function processes events only for the calling thread.

Note: This function is thread-safe.

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章