Qt程式最小化執行,還原後窗體不重新整理的問題
阿新 • • 發佈:2018-11-07
程式執行現象是這樣的,一個包含有QTableWidget的窗體,Item上使用setCellWidget方法嵌入的自定義的widget,上面顯示下載進度條、按鈕等等。當下載任務進行的時候,進度條是動態顯示完成百分比的,此時將其最小化。當任務完成後,重新還原該窗體,進度條還保留在最小化時的程度,直到其它列表操作後才瞬間重新整理到應該的樣子。
判斷問題原因是Qt窗體在最小化並沒有進行實際上的update操作,直到它show出來後才進行重新整理的,這樣能夠比較節省資源,提高執行效率和速度。本例中窗體在還原時雖然重新整理,但是其中的QTableWidget卻沒有收到update的操作,這樣就導致了顯示內容不正常。 解決的辦法是在Qt窗體中處理changeEvent(QEvent *e),當e->type()== QEvent::WindowStateChange 時控制QTableWidget重新整理介面。
void CloudStore::changeEvent(QEvent *e) { qDebug()<< "CloudStore::changeEvent()"; switch (e->type()) { case QEvent::WindowStateChange: if(m_usualAppTable){ //m_usualAppTable 即為QtableWidget m_usualAppTable->update(); } } this->repaint(); e->ignore(); default: break; } }
qt QWidget窗體最小化(showMinimized)後點工作列恢復後介面卡死
方法1 重寫changeEvent //標頭檔案申明 void changeEvent(QEvent *e); //函式實現 void myWidgetWindow::changeEvent(QEvent *e) { switch (e->type()) { case QEvent::WindowStateChange: { this->update(); this->repaint(); e->ignore(); break; } default: break; } }
方法2 重寫showEvent
//標頭檔案申明
void showEvent(QShowEvent *e);
//函式實現
void myWidgetWindow::showEvent(QShowEvent *e)
{
this->setAttribute(Qt::WA_Mapped);
QWidget::showEvent(e);
}