QT之QDockWidget使用详解

一、描述

QDockWidget提供了dock widget的概念,也称为工具面板或实用工具窗口。停靠窗口是放置在QMainWindow中央小部件周围的停靠小部件区域中的次要窗口。如图所示:

标记处即为dockwidget可停靠位置,在QT中这部分的设置是用一个枚举来实现的,如图

 可访问这些枚举的函数为:

其中
void setAllowedAreas(Qt::DockWidgetAreas areas) 可以设置dockwidget可停靠的位置,如果不设置,那么默认是上下左右都可停靠的

举例设置停靠位置为左右时

  QDockWidget *dock = new QDockWidget(tr("Customers"), this);
  dock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);

 而Qt::DockWidgetAreas allowedAreas() const 函数是返回窗口可停靠区域的,返回值是枚举类型,这个函数一般用不到

下面还有一个信号,这个信号是在allowedAreas属性改变时发出的。allowedAreas参数给出了属性的新值。

关于QDockWidget还有另外一个枚举,是设置dockwidget的窗口属性的


QDockWidget::DockWidgetClosable 0x01 可关闭

QDockWidget::DockWidgetMovable 0x02 dock小部件可以由用户在dock之间移动。

QDockWidget::DockWidgetFloatable 0x04 可以将dock小部件与主窗口分离,并作为独立窗口浮动。

QDockWidget::DockWidgetVerticalTitleBar 0x08 dock小部件在左侧显示一个垂直的标题栏

QDockWidget::AllDockWidgetFeatures DockWidgetClosable|DockWidgetMovable|DockWidgetFloatable 前三个的集合

QDockWidget::NoDockWidgetFeatures 0x00 无法关闭、移动或浮动dock小部件。

关于这个特征QT也给出了相关函数的设置, 比如
void  setFeatures(QDockWidget::DockWidgetFeatures features)  可以设置窗口特征,默认值是AllDockWidgetFeatures
QDockWidget::DockWidgetFeatures features() const用获取窗口部件的特征
void featuresChanged(QDockWidget::DockWidgetFeatures features)此信号在特性属性更改时发出。

二、使用

主要使用这个函数

void QDockWidget::setWidget(QWidget *widget)

在DockWidget中添加一个控件,这里用一个Label显示

 1.实例化一个dock对象和Label对象

QDockWidget *dock = new QDockWidget(tr("New Dock"), this);
QLabel *label_1 = new QLabel(dock);
label_1->setText("向dock中添加一个控件");

2.将控件label添加到dock中

dock->setWidget(label_1);

3.设置dock的特征属性

  dock->setFeatures(QDockWidget::AllDockWidgetFeatures); 
  dock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
  this->addDockWidget(Qt::LeftDockWidgetArea, dock); /* 初始化显示在窗口左侧 */

ok 看下效果

在DockWdiget中添加多个控件

这里添加三个按钮,需要注意的是当添加多个控件时,需要一个Widget作为载体,

官方文档上有说明

Note that you must add the layout of the widget before you call this function; if not, the widget will not be visible.

我们需要将部件添加布局才能显示出来

1.实例化对象

  QDockWidget *dock = new QDockWidget(tr("New Dock"), this);
  QWidget *m_widget = new QWidget(dock);
  QHBoxLayout *hBoxLayout_1 = new QHBoxLayout(m_widget);

  QPushButton *button_1 = new QPushButton();
  QPushButton *button_2 = new QPushButton();
  QPushButton *button_3 = new QPushButton();
  button_1->setText("start");
  button_2->setText("stop");
  button_3->setText("pause");

2.添加布局

  hBoxLayout_1->addWidget(button_1);
  hBoxLayout_1->addWidget(button_2);
  hBoxLayout_1->addWidget(button_3);

  dock->setWidget(m_widget);

3.属性设置

  dock->setFeatures(QDockWidget::AllDockWidgetFeatures); 
  dock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
  addDockWidget(Qt::TopDockWidgetArea, dock); /* 初始化显示在窗口顶端 */
  

ok, 看下效果

 使用QLIstWidget添加文本

  QListWidget *customerList;
  QDockWidget *dock = new QDockWidget(tr("Customers"), this);
  dock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
  customerList = new QListWidget(dock);
  customerList->addItems(QStringList()
		  << "John Doe, Harmony Enterprises, 12 Lakeside, Ambleton"
		  << "Jane Doe, Memorabilia, 23 Watersedge, Beaton"
		  << "Tammy Shea, Tiblanka, 38 Sea Views, Carlton"
		  << "Tim Sheen, Caraba Gifts, 48 Ocean Way, Deal"
		  << "Sol Harvey, Chicos Coffee, 53 New Springs, Eccleston"
		  << "Sally Hobart, Tiroli Tea, 67 Long River, Fedula");
  dock->setWidget(customerList);
  addDockWidget(Qt::RightDockWidgetArea, dock);

效果

 三、其他

关于QDockWidget还有一些函数

比如 void setTitleBarWidget(QWidget *widget)
QAction *toggleViewAction() const

这里先介绍一下QAction *toggleViewAction() const,这个函数的返回值是一个QAction类,它可以显示的来开启和关闭dcokwidget,它的名称就是dockwidget窗口的标题

首先创建一个菜单栏

QMenu *fileMenu = menuBar()
QMenu *viewMenu;
viewMenu = menuBar()->addMenu(tr("&View"));

在viewMenu中添加动作

viewMenu->addAction(dock->toggleViewAction());

这样就可以了,可以看下效果,这样就可以通过点击按钮进行控制dock窗口的显示与关闭了

另一种方法是你可以先在UI设计师里面手动创建QAction,然后通过`toggled(bool)`信号来绑定QDockerWidget的`setHidden(bool)`函数,也可以实现相同的效果,代码如下:

ui->actionItem->setCheckable(true);
ui->actionProperty->setCheckable(true);
ui->actionItem->setChecked(true);
ui->actionProperty->setChecked(true);
connect(ui->actionItem, &QAction::toggled, ui->dockWidget, [=](bool state){
    ui->dockWidget->setHidden(!state);
});
connect(ui->actionProperty, &QAction::toggled, ui->dockWidget_4, [=](bool state){
   ui->dockWidget_4->setHidden(!state);
});
connect(ui->dockWidget, &QDockWidget::visibilityChanged, ui->actionItem, &QAction::setChecked);
connect(ui->dockWidget_4, &QDockWidget::visibilityChanged, ui->actionProperty, &QAction::setChecked);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值