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

时间:2013-01-28 03:07:07

标签: qt user-interface qt5 qmainwindow

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

但是,如果我最小化它并最大化它,那么单选按钮和复选框似乎冻结并且不能自由切换。但如果我再次恢复原状,事情就会变得很好。

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

3 个答案:

答案 0 :(得分:4)

我遇到了类似的问题

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

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

发生了什么:窗口停止了重绘。它看起来很冷冻。

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

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

解决方法我做了:子窗口QMainWindow并在窗口恢复后手动设置属性Qt::WA_Mapped(处理changeEvent):

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

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

有关此问题的更多信息

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

Qt论坛中的类似问题:Minimizing frameless windows...

我在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.

似乎Qt内核中有一个错误(可能提到QTBUG-34147)已经解决,但是它仍然存在一些问题。

答案 1 :(得分:0)

当您使用this->setWindowState(Qt::WindowMaximized);时,您可能会覆盖窗口的其他状态属性。特别是,您要删除Qt::WindowActive。所以使用

中的任何一个
this->setWindowState(this->windowState() | Qt::WindowMaximized);
this->setWindowState(Qt::WindowMaximized | Qt::WindowActive);

但我想知道你为什么要玩窗户状态。你不能在构造函数中使用show()来使窗口可见吗?

答案 2 :(得分:0)

请尝试使用this->showMaximized()。窗口状态可用于执行通过任何其他方法无法实现的棘手问题,但如果另一种方法提供所需的功能(在这种情况下为QWidget :: showMaximized())则使用该状态。

相关问题