一.问题描述
当使用继承自QWidget的QT对象时,如果设置了窗口风格(FramelessWindowHint)为无边框,则在使用 包括 窗口最大化、windows系统(win+D),图标来回点击显示等操作时,导致界面刷新出现异常(QT的ui界面没有及时刷新绘制)
二.解决方法
这有可能是QT5之后的BUG,原因是窗口Qt::WA_Mapped属性被修改为未启用,导致窗口显示的时候未刷新显示,解决方法是把该属性设置为True即可
对窗口重载showEven,实现以下代码即可
void JMain::showEvent(QShowEvent *event)
{
#if QT_VERSION >= 0x050000
this->setAttribute(Qt::WA_Mapped);
#endif
QWidget::showEvent(event);
}
参考资料:
我遇到过类似的问题 环境:Windows7 + Qt5.3 +无框架QMainWindow 我做了什么:用QMainWindow::showMinimized
最小化窗口然后再次显示它。 发生了什么:窗口停止重绘。它看起来很冷冻。 我正在调试它并发现以下内容: 最小化窗口属性后,Qt::WA_Mapped
已从QMainWindow中删除(您可以在qwidget.cpp
中将断点设置为setAttribute_internal
以进行检查)。但是在显示窗口后没有再次设置此属性。这导致QWidgetBackingStore::sync
中的条件if (discardSyncRequest(tlw, tlwExtra))
未得到满足,并且导致dirtyWidgets
未被清除。在Qt更新系统的其他部分,这导致没有进行其他渲染。 解决方法我做了:Subclassed 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)已经解决了,但是它仍然存在一些问题。
参考文章:最小化窗口后窗口小部件冻结 - qmainwindow - 码客
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)