rot*_*age 1 user-interface qt qmainwindow qt5
我正在为应用程序使用Qt5 Creator,并且在主窗口的构造函数中调用this->setWindowState(Qt::WindowMaximized)
。当窗口最初最大化时,单选按钮和复选框可以正常工作(即,轻松地在选中和未选中之间切换)。
但是,如果我将其最小化并最大化,则单选按钮和复选框似乎会冻结并且不会随意切换。但是,如果我再次恢复原状,一切都会好起来的。
我尝试this->update
在单选按钮和复选框的插槽中包括a ,但这没有用。任何帮助,将不胜感激。
我遇到类似的问题
环境: Windows7 + Qt5.3 +无框架QMainWindow
我做了什么:最小化窗口,QMainWindow::showMinimized
然后再次显示它。
发生了什么:窗口停止重新绘制。看起来很冰冻。
我正在调试它,发现以下内容:
Qt::WA_Mapped
从QMainWindow中删除了最小化窗口属性后(您可以将breakpoint设置为setAttribute_internal
in 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),该错误已解决,但仍然存在一些问题。