目录
- 1、停靠窗口(dock windows)
- 2、尝试编写一个停靠窗口
- 3、保存停靠窗口状态并且能够恢复
- 3.1、使用QSettings保存记录
- 3.2 测试效果
- 3.3、注册表查看配置
1、停靠窗口(dock windows)
停靠窗口(dock window)是指一些可以停靠在 OMainWindow 中或是浮动为独立窗口的窗口。OMainWindow提供了4个停靠窗口区域分别在中央窗口部件的上部、下部、左侧和右侧。
例如Microsoft Visual Studio 和 0t Linguist 这样的应用程都广使用了停靠窗口以提供一种非常灵活的用户接口方式。
每一个停靠窗口都有自己的标题栏,它处于停靠时也会显示。通过拖拽这一标题栏,用户可以把停靠窗口从一个停靠区域移动到另外一个停靠区域。通过把这个停靠窗口拖动到其他停靠区域的外面,就可以把停靠窗口从一个停靠区域中分离出来,让它成为一个独立的窗口。
自由浮动的停靠窗口总是显示在它们的主窗口的上面。通过点击窗口部件标题栏上的“关闭"按钮,就可以关闭 QDockWidget
。通过调用 QDockWidget::setFeatures()
,就可以禁用所有这些特性以及它们的任意组合。
用虚线显示的四个角可以属于两个相邻停靠区域中的任何一个。例如,假定我们需要让左上角属于左侧的停靠区域,则只需调用QMainWinidow::setCorner(Qt::TopLeftCorner, Qt::LeftDockWid-getArea)
即可。
2、尝试编写一个停靠窗口
下面这段代码很简单,你只需要创建一个QT工程,将这段放到你主窗口的构造函数运行程序就可以使用了。当然记得添加QDockWidget
头文件。
QDockWidget* shapesDockWidget = new QDockWidget(tr("Shapes"));
shapesDockWidget->setObjectName("shapesDockWidgt");
QTreeWidget *treeWidget = new QTreeWidget(this);
shapesDockWidget->setWidget(treeWidget);
shapesDockWidget->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
addDockWidget(Qt::RightDockWidgetArea, shapesDockWidget);
setAllowedAreas()
调用说明对停靠区域加以限定即可以接受停靠窗口。在此给出的代码中,只允许把停靠窗口拖拽到左侧和右侧的停靠区域,这两个地方都有显示它的足够垂直空间,因而可以合理地把它显示出来。如果没有明确地设置所允许的区域,那么用户就可以把该停靠窗口拖动到这四个可停靠区域中的任何一个地方。
3、保存停靠窗口状态并且能够恢复
每个QObject
都可以给定一个“对象名”。在创建一些停靠窗口和工具栏时,如果希望使用QMainWindow ::saveState()
和 QMainWindow::restoreStatee()
来保存、恢复停靠窗口和工具栏的几何形状及状态。
3.1、使用QSettings保存记录
Qt提供了QSetting类对配置进行管理,可以显示的指定为ini格式的配置文件,如果不显示的指定,则默认为:
windows系统,在注册表中(注册表位置:计算机\HKEY_CURRENT_USER\Software\软件名称)
maxos系统,在xml文件中
unix系统,在ini文件中
想了解更多关于QSetting的资料,请跳转Qt通过QSttings类读取*.ini配置文件
那么我们需要提供一对用来存储和读取停靠窗口形状及状态。
#include <QSettings>
void MainWindow::WriteSettings()
{
QSettings setting("Linxi07", "DockWindows");
setting.beginGroup("mainWindow");
setting.setValue("geometry", saveGeometry());
setting.setValue("state", saveState());
setting.endGroup();
}
void MainWindow::ReadSettings()
{
QSettings setting("Linxi07", "DockWindows");
setting.beginGroup("mainWindow");
restoreGeometry(setting.value("geometry").toByteArray());
restoreState(setting.value("state").toByteArray());
setting.endGroup();
}
同样为了方便测试,在构造函数中增加一些状态栏代码。
QToolBar* frontToolBar = new QToolBar(this);
frontToolBar->setObjectName("frontToolBar");
QComboBox* comboBox = new QComboBox(this);
frontToolBar->addWidget(comboBox);
QSpinBox* spinBox = new QSpinBox(this);
frontToolBar->addWidget(spinBox);
QAction* a1 = new QAction("a1", this);
frontToolBar->addAction(a1);
frontToolBar->setAllowedAreas(Qt::TopToolBarArea | Qt::BottomToolBarArea);
addToolBar(frontToolBar);
那么我们还需要最后一步,就是调用。在构造函数最后一行调用ReadSettings()
,在析构函数第一行调用WriteSettings()
。
3.2 测试效果
这里我录制了一个视频可以看到首次打开状态栏在上册,停靠窗口在右侧。当我把状态栏移动至下侧,停靠窗口移动到左侧。再次启动程序就发现保留了上次的操作。
3.3、注册表查看配置
因为测试平台是windows,所以配置默认存储在注册表,路径为:计算机\HKEY_CURRENT_USER\Software\Linxi07\DockWindows\mainWindow