日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

修復Qt程序長時間運行控件停止刷新

作者:菜鳥清清 更新時間: 2022-05-13 編程語言

問題描述

我的Qt程序有一個時間顯示的功能,由于需要保持長期運行,這個時間控件就需要長期持續刷新。但是,當程序運行一段時間后,這個控件就似乎累了一樣,不再繼續刷新了。為了解決這個問題,我嘗試過很多方法,包括:

  • 每隔一段時間,獲取時間settext到控件上
  • 通過update(),repaint()等頁面刷新方法
  • 使用qApp.processEvent()強制執行操作

但是,無論怎么努力,都無法解決問題,我開始懷疑這是Qt的底層bug。

與我遇到同樣問題的人也有很多,下面這些都是例子。
Qt長時間運行界面停止刷新的解決辦法
Qt bug(?) display stops updating

解決方法

之前,這段代碼運行在一個持續刷新的定時器里。

void Example::clockSlot()
{
    datetime = QDateTime(QDateTime::currentDateTime());
    QString str1 = datetime.toString("hh:mm:ss");
    QString str2 = datetime.toString("yyyy年MM月dd日");

    curTime -> setText(str1);
    curDate -> setText(str2);
}

我推測定時器QTimer應該比較特殊,雖然它看起來運行在主線程中,因為它有時確實會阻塞主線程,但是它還是會被算作線程。

當GUI相關的東西運行在線程里,確實就會出現這種現象。這里的settext()就與GUI相關。

修改方法就是使用信號,代碼如下:

connect(this,SIGNAL(time_update()),this,SLOT(updateTime()));

//原來計時器的函數
void Example::clockSlot()
{
    emit(time_update());
}

void Example::updateTime()
{
    datetime = QDateTime(QDateTime::currentDateTime());
    QString str1 = datetime.toString("hh:mm:ss");
    QString str2 = datetime.toString("yyyy年MM月dd日");

    curTime -> setText(str1);
    curDate -> setText(str2);
}

果然,問題解決了。

結論

GUI相關代碼不要放在線程或QTimer中,多用信號處理。

原文鏈接:https://blog.csdn.net/nchu_zhangyiqing/article/details/124689373

欄目分類
最近更新