今天小豆君来分享下Qt的停靠窗口QDockWidget。
QDockWidget可以停靠在QMainWindow内,或者作为桌面的顶层窗口。
QDockWidget一般会作为工具面板或实用工具窗口。比较类似与我们vs中的查找替换窗口。
QDockWidget由标题栏和内容区域组成。标题栏显示窗口标题、浮动按钮和关闭按钮。
4.5.1 属性
QDockWidget继承于QWidget。
1 allowedAreas 规定了悬停窗口可以被放置在哪些区域
-
Qt::LeftDockWidgetArea 可停靠在左侧
-
Qt::RightDockWidgetArea 可停靠在右侧
-
Qt::TopDockWidgetArea 可停靠在上侧
-
Qt::BottomDockWidgetArea 可停靠在下侧
-
Qt::AllDockWidgetAreas 可停靠在上下左右
-
Qt::NoDockWidgetArea 不可停靠
这个属性是QFlags<DockWidgetArea>的,也就是说彼此之间可以使用或运算符(|),取并集。
2 features 窗口标识
-
QDockWidget::DockWidgetClosable 可以关闭停靠窗口
-
QDockWidget::DockWidgetMovable 可以移动停靠窗口
-
QDockWidget::DockWidgetFloatable 停靠窗口可以跟主窗口分离,变成一个浮动窗口
-
QDockWidget::DockWidgetVerticalTitleBar 当停靠窗口在左侧时,标题可以垂直排列
-
QDockWidget::AllDockWidgetFeatures 可关闭,移动和浮动
-
QDockWidget::NoDockWidgetFeatures 不可关闭,移动和浮动
这个属性也是QFlags<DockWidgetFeature>的。
3 floating 是否处于浮动状态
为true时,其作为独立的窗口呈现给用户,而不是被停靠在QMainWindow上。
4 windowTitle 窗口标题
4.5.2 常用函数
-
setTitleBarWidget(QWidget* widget)
为停靠窗口设置自定义标题栏。
-
setWidget(QWidget* widget)
为停靠窗口设置自定义的内容区域。
4.5.3 示例
新建项目MainWindowDock,类名MainWindowDock,继承于QMainWindow
在ui界面拖入四个QDockWidget,并分别命名为上侧,下侧,左侧,右侧。
在中心窗口区域拖入一个QTabWidget,第一页标题为allowedAreas,并在里面拖入一个QListWidget,并新增四个item。同理编辑第二页features,如图二。
mainwindow.h
#ifndef MAINWINDOWDOCK_H
#define MAINWINDOWDOCK_H
#include <QMainWindow>
namespace Ui {
class MainWindowDock;
}
class QListWidgetItem;
class MainWindowDock : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindowDock(QWidget *parent = 0);
~MainWindowDock();
private slots:
void on_listWidget_areas_itemChanged(QListWidgetItem *item);
void on_listWidget_features_itemChanged(QListWidgetItem *item);
private:
Ui::MainWindowDock *ui;
};
#endif // MAINWINDOWDOCK_H
mainwindow.cpp
#include "mainwindowdock.h"
#include "ui_mainwindowdock.h"
MainWindowDock::MainWindowDock(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindowDock)
{
ui->setupUi(this);
}
MainWindowDock::~MainWindowDock()
{
delete ui;
}
void MainWindowDock::on_listWidget_areas_itemChanged(QListWidgetItem *item)
{
//获取该item所代表的位置flag
int row = ui->listWidget_areas->row(item);
int flg = Qt::LeftDockWidgetArea << row;
//获取停靠窗口原来的位置flag,并设置新的可放置区域
QList<QDockWidget *> allDocks = findChildren<QDockWidget *>();
foreach (QDockWidget* dock, allDocks)
{
Qt::DockWidgetAreas areas = dock->allowedAreas();
areas.setFlag((Qt::DockWidgetArea)flg, item->checkState() == Qt::Checked);
dock->setAllowedAreas(areas);
}
}
void MainWindowDock::on_listWidget_features_itemChanged(QListWidgetItem *item)
{
//获取该item所代表的停靠窗口标识
int row = ui->listWidget_features->row(item);
int flg = QDockWidget::DockWidgetClosable << row;
//获取停靠窗口原来的窗口flag,并设置新的标识
QList<QDockWidget *> allDocks = findChildren<QDockWidget *>();
foreach (QDockWidget* dock, allDocks)
{
QDockWidget::DockWidgetFeatures features = dock->features();
features.setFlag((QDockWidget::DockWidgetFeature)flg, item->checkState() == Qt::Checked);
dock->setFeatures(features);
}
}
现在我们来编译运行程序,并且勾选不同的属性,拖拽移动停靠窗口,看看都有哪些变化。
下图展示停靠窗口位于左侧并且标题垂直排列
下图展示左侧和右侧停靠窗口重叠在一起,上下侧窗口悬浮。
好的,今天的分享就到这里啦,最后也希望大家多多支持小豆君的创作,关注小豆君的公众号“小豆君Qt分享”,最新文章都会在公众号第一时间发布,或者你有不懂的问题,关注公众号后,可加好友或进Qt群获得答案。
网友评论