我使用QT5造物主一个应用程序,并在主窗口的构造我叫this->setWindowState(Qt::WindowMaximized)
单选按钮和复选框,做工精细的(即之间轻松切换选中和未选中),在最初窗口最大化。
不过,如果我最小化和最大化,那么单选按钮和复选框似乎冻结和不自由切换。 但如果我再次还原下来的东西变细。
我试着包括this->update
的单选按钮的插槽和复选框,但没有奏效。 任何帮助,将不胜感激。
我使用QT5造物主一个应用程序,并在主窗口的构造我叫this->setWindowState(Qt::WindowMaximized)
单选按钮和复选框,做工精细的(即之间轻松切换选中和未选中),在最初窗口最大化。
不过,如果我最小化和最大化,那么单选按钮和复选框似乎冻结和不自由切换。 但如果我再次还原下来的东西变细。
我试着包括this->update
的单选按钮的插槽和复选框,但没有奏效。 任何帮助,将不胜感激。
我遇到过类似的问题
环境: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中的bug。
更多问题
我发现在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);
你可能重写Windows的其他状态属性。 特别是,要删除Qt::WindowActive
。 因此,使用任一
this->setWindowState(this->windowState() | Qt::WindowMaximized);
this->setWindowState(Qt::WindowMaximized | Qt::WindowActive);
但我不知道为什么你与窗口状态玩耍。 你不能用show()
在构造函数中,使你的窗口可见?
试试this->showMaximized()
来代替。 窗口状态可用于做棘手的事情是不可能通过任何其他方法,但如果另一个方法提供了(QWidget的:: showMaximized()在这种情况下)所需的功能使用该代替。