>我正在使用Qt5 Creator进行应用程序,并且在主窗口的构造函数中我调用this->setWindowState(Qt::WindowMaximized)
。当窗口最初最大化时,单选按钮和复选框工作正常(即在选中和未选中之间轻松切换)。
但是,如果我最小化它并最大化它,那么单选按钮和复选框似乎会冻结并且不会自由切换。但是,如果我再次恢复,事情就会变得好起来。
我尝试在单选按钮和复选框的插槽中包含this->update
,但这不起作用。任何帮助将不胜感激。
我遇到了类似的问题
环境: Windows7 + Qt5.3 + Frameless QMainWindow
我做了什么:最小化了带有QMainWindow::showMinimized
的窗口,然后再次显示它。
发生的情况:窗口停止重绘。它看起来很僵硬。
我正在调试它并发现以下内容:
最小化窗口属性后,Qt::WA_Mapped
从 QMainWindow 中删除(您可以在qwidget.cpp
中将断点设置为setAttribute_internal
以进行检查)。但是在显示窗口后没有再次设置此属性。这导致QWidgetBackingStore::sync
中的条件if (discardSyncRequest(tlw, tlwExtra))
未得到满足,并导致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论坛中也有类似的问题:最小化无框窗口...
我在上述条件旁边找到了这条评论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)已经解决,但仍然存在一些问题。
当你使用this->setWindowState(Qt::WindowMaximized);
时,你可能会覆盖窗口的其他状态属性。特别是,您正在删除Qt::WindowActive
.因此,请使用以下任一
this->setWindowState(this->windowState() | Qt::WindowMaximized);
this->setWindowState(Qt::WindowMaximized | Qt::WindowActive);
但我想知道你为什么要玩窗口状态。不能在构造函数中使用show()
来使窗口可见吗?
请尝试this->showMaximized()
。窗口状态可用于执行任何其他方法都无法实现的棘手操作,但如果其他方法提供了所需的功能(在本例中为 QWidget::showMaximized()),请改用它。