1

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

但是,如果我将其最小化并最大化,那么单选按钮和复选框似乎会冻结并且不能自由切换。但如果我再次恢复,一切都会好起来的。

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

4

3 回答 3

5

我遇到了类似的问题

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

我所做的:最小化窗口,QMainWindow::showMinimized然后再次显示。

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

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

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

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

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)已解决,但仍然存在一些问题。

于 2015-02-04T22:10:15.760 回答
0

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

this->setWindowState(this->windowState() | Qt::WindowMaximized);
this->setWindowState(Qt::WindowMaximized | Qt::WindowActive);

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

于 2013-01-28T08:54:54.860 回答
0

试试this->showMaximized()吧。窗口状态可用于执行任何其他方法无法完成的棘手事情,但如果其他方法提供所需的功能(在这种情况下为 QWidget::showMaximized()),请改用它。

于 2013-01-29T13:10:45.760 回答