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

Don*_*alo 6 c++ qt

我在Windows 7旗舰版32位上使用Qt 4.7.

QMainWindow我的计划中有一个QDockWidget.我注意到如果我通过标题栏上的最小化按钮最小化主窗口,则在恢复它之后,停靠停靠窗口小部件.我没有写任何支持这样的功能!

这是怎么发生的以及如何防止这种情况?

谢谢.

cal*_*ole 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)));
Run Code Online (Sandbox Code Playgroud)

连接顺序并不重要.然后当我最小化应用程序时,QDockWidget可见,在我恢复后,QDockWidget被关闭,actionMenu被取消选中.

实际上有两种解决方案.首先对我有用的是使用SIGNAL(触发(bool))而不是SIGNAL(切换(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)));
Run Code Online (Sandbox Code Playgroud)

第二个解决方案使用您可以从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);
Run Code Online (Sandbox Code Playgroud)

我确信SIGNAL(切换(bool))在我的应用程序关闭QDockWidget时导致了.


And*_*y M 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();
}
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你 !