4.5 停靠窗口

简介: 4.5 停靠窗口

今天小豆君来分享下Qt的停靠窗口QDockWidget。

QDockWidget可以停靠在QMainWindow内,或者作为桌面的顶层窗口。

QDockWidget一般会作为工具面板或实用工具窗口。比较类似与我们vs中的查找替换窗口

01ebd755782e4c909dad0843d3544acf.jpeg

QDockWidget由标题栏和内容区域组成。标题栏显示窗口标题、浮动按钮和关闭按钮。


4.5.1 属性

QDockWidget继承于QWidget。

01ebd755782e4c909dad0843d3544acf.jpeg

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,如图二。

01ebd755782e4c909dad0843d3544acf.jpeg

01ebd755782e4c909dad0843d3544acf.jpeg

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);
    }
}

现在我们来编译运行程序,并且勾选不同的属性,拖拽移动停靠窗口,看看都有哪些变化。

下图展示停靠窗口位于左侧并且标题垂直排列

01ebd755782e4c909dad0843d3544acf.jpeg

下图展示左侧和右侧停靠窗口重叠在一起,上下侧窗口悬浮。

01ebd755782e4c909dad0843d3544acf.jpeg

好的,今天的分享就到这里啦,我们下期再见。


如果你想要获得更多编程干货,请关注我的微信公众号:小豆君,只要关注,便可加入小豆君为大家创建的C++\Qt交流群,方便讨论学习。

相关文章
|
3月前
|
安全 C语言
snprintf的用法
简要介绍了snprintf的常用方法,能大大的简化我们的代码
Halcon区域region的生成,使用点坐标
Halcon区域region的生成,使用点坐标
780 0
|
9月前
《QT从基础到进阶·八》QDockWidget使用
《QT从基础到进阶·八》QDockWidget使用
84 0
|
数据安全/隐私保护
Qt之对话框(QDialog)
Qt之对话框(QDialog)
184 0
|
C++ Windows
C++读取WINDOWS注册表
C++读取WINDOWS注册表
136 0
VC里如何改变Static,Edit等控件的字体大小
VC里如何改变Static,Edit等控件的字体大小
267 0
|
前端开发
Qt | 关于样式表的使用 QStyleSheet
关于Qt样式表的使用。
544 0
halcon模板匹配实践(2)算子find_shape_model里的参数Row, Column, Angle含义是什么?
halcon模板匹配实践(2)算子find_shape_model里的参数Row, Column, Angle含义是什么?
684 0
halcon模板匹配实践(2)算子find_shape_model里的参数Row, Column, Angle含义是什么?