如果主窗口最小化,QDockWidget 将关闭。

6
我正在使用在Windows 7 Ultimate 32位上的Qt 4.7。
我的程序中的QMainWindow有一个QDockWidget。我注意到,如果我通过标题栏上的最小化按钮最小化主窗口,在恢复后,dock widget会关闭。我没有编写支持这种功能的代码!
这是如何发生的,如何防止它发生?
谢谢。
2个回答

7

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

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)):
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获取它:
// 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的关闭。


8年过去了,这个解决方案仍然有效,但Qt文档仍然没有任何关于此的内容。 - Bobur

3

我曾经面临过同样的问题... 我通过使用一种称为StoreWindowsLayout和RestoreWindowsLayout的方法成功解决了它。

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

RestoreWindowsLayout将恢复该字节数组,因此恢复您的窗口布局、QDockWidget的可见状态等...

我在ApplicationMainFrm :: changeEvent、ApplicationMainFrm :: closeEvent(可能需要这个事件)和ApplicationMainFrm :: hide()上调用StoreWindowsLayout。

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

我的MainForm中使用restoreWindowsLayout的示例:

void ApplicationMainFrm::showEvent(QShowEvent* pEvent)
{
    QMainWindow::showEvent(pEvent);

    restoreWindowsLayout();
}

希望能对您有所帮助!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接