最小化窗口后冻结的小部件

rot*_*age 1 user-interface qt qmainwindow qt5

我正在为应用程序使用Qt5 Creator,并且在主窗口的构造函数中调用this->setWindowState(Qt::WindowMaximized)。当窗口最初最大化时,单选按钮和复选框可以正常工作(即,轻松地在选中和未选中之间切换)。

但是,如果我将其最小化并最大化,则单选按钮和复选框似乎会冻结并且不会随意切换。但是,如果我再次恢复原状,一切都会好起来的。

我尝试this->update在单选按钮和复选框的插槽中包括a ,但这没有用。任何帮助,将不胜感激。

Joh*_*man 5

我遇到类似的问题

环境: Windows7 + Qt5.3 +无框架QMainWindow

我做了什么:最小化窗口,QMainWindow::showMinimized然后再次显示它。

发生了什么:窗口停止重新绘制。看起来很冰冻。

我正在调试它,发现以下内容:

Qt::WA_Mapped从QMainWindow中删除了最小化窗口属性后(您可以将breakpoint设置为setAttribute_internalin qwidget.cpp进行检查)。但是在显示窗口后未再次设置此属性。这导致未满足该条件if (discardSyncRequest(tlw, tlwExtra))QWidgetBackingStore::sync并且dirtyWidgets未清除它。在Qt更新系统的其他部分,这导致没有其他渲染。

我所做的变通办法:还原窗口(处理changeEvent)时,手动子类化QMainWindow并设置属性Qt::WA_Mapped

void MainWindow::changeEvent(QEvent *event) {
  if(event->type() == QEvent::WindowStateChange) {
    if(!isMinimized()) {
      setAttribute(Qt::WA_Mapped);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

这对我很好。正确的解决方案可能是修复Qt中的错误。

有关问题的更多信息

我在Qt项目历史记录中发现了类似的错误(标记为已关闭): QTBUG-34147

Qt论坛中的类似问题:最小化无框架窗口...

我在提到的条件旁边找到了此评论 QWidgetBackingStore::sync

// If the top-level is minimized, it's not visible on the screen so we can delay the
// update until it's shown again. In order to do that we must keep the dirty states.
// These will be cleared when we receive the first expose after showNormal().
// However, if the widget is not visible (isVisible() returns false), everything will
// be invalidated once the widget is shown again, so clear all dirty states.
Run Code Online (Sandbox Code Playgroud)

似乎Qt内核中存在一个错误(也许提到了QTBUG-34147),该错误已解决,但仍然存在一些问题。