关于c ++:如果最小化主窗口,则QDockWidget关闭

QDockWidget is closed if main window is minimized

我在Windows 7 Ultimate 32位上使用Qt 4.7。

我程序的QMainWindow有一个QDockWidget。 我注意到,如果我通过标题栏上的"最小化"按钮来最小化主窗口,则在还原它之后,停靠窗口小部件将关闭。 我没有为此功能提供任何支持!

这是如何发生的以及如何预防呢?

谢谢。


在编写自己的应用程序时遇到了此错误。我有QDockWidget及其应用程序选项。使用Qt Creator,我使用QAction actionMenu创建了可检查的菜单。然后我像这样连接QDockWidget和QAction:

1
2
3
4
QObject::connect(ui->dockWidget, SIGNAL(visibilityChanged(bool)),
                 ui->actionMenu, SLOT(setChecked(bool)));
QObject::connect(ui->actionMenu, SIGNAL(toggled(bool)),
                 ui->dockWidget, SLOT(setVisible(bool)));

连接的顺序并不重要。然后,当我在最小化QDockWidget的情况下最小化应用程序时,我将其还原后关闭了QDockWidget且未选中actionMenu。

实际上有两种解决方案。首先对我有用的是使用SIGNAL(triggered(bool))而不是SIGNAL(toggled(bool)):

1
2
3
4
QObject::connect(ui->dockWidget, SIGNAL(visibilityChanged(bool)),
                 ui->actionMenu, SLOT(setChecked(bool)));
QObject::connect(ui->actionMenu, SIGNAL(triggered(bool)),
                 ui->dockWidget, SLOT(setVisible(bool)));

第二种解决方案使用可从QDockWidget获得的操作:

1
2
3
4
5
6
7
8
9
// Retrieve action from QDockWidget.  
QAction *action = ui->dockWidget->toggleViewAction();  
// Adjust any parameter you want.  
action->setText(QString("&Menu"));  
action->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_M));  
action->setStatusTip(QString("Press to show/hide menu widget."));  
action->setChecked(true);  
// Install action in the menu.  
ui->menuOptions->addAction(action);

我肯定知道SIGNAL(toggled(bool))导致了我的QDockWidget应用程序关闭。


我遇到了同样的问题...通过使用称为StoreWindowsLayout和RestoreWindowsLayout的方法,我设法摆脱了这个问题。

StoreWindowsLayout将保存由QMainwindow :: saveState()方法返回的ByteArray的内容。

RestoreWindowsLayout将还原该字节数组,并因此还原您的Windows布局,qdockwidget可见性状态等等。

我在ApplicationMainFrm :: changeEvent,ApplicationMainFrm :: closeEvent(可能是您需要的那个)和ApplicationMainFrm :: hide()中调用StoreWindowsLayout。

然后,我在ApplicationMainFrm :: showEvent中使用restoreWindowsLayout。

在MainForm中使用restoreWindowsLayout的示例:

1
2
3
4
5
6
void ApplicationMainFrm::showEvent(QShowEvent* pEvent)
{
    QMainWindow::showEvent(pEvent);

    restoreWindowsLayout();
}

希望能帮助到你 !