3.2 停靠窗口类-QDockWidget

3.2 停靠窗口类-QDockWidget
在一些应用程序中经常可以看到窗口可以被单独拖出来停靠在界面上的某一个位置,在Qt中就可以使用QDockWidget来解决各种Widget的
停靠问题
3.2.1 QDockWidget类中常用的几个成员函数
常用的成员方法:
QDockWidget(QWidget *parent = nullptr, Qt::WindowFlags flags = Qt::WindowFlags())//构造器,用于构造一个QDockWidget对象
QDockWidget(const QString &title, QWidget *parent = nullptr, Qt::WindowFlags flags = Qt::WindowFlags())//构造器,用于构造一个带标题栏的QDockWidget对象
virtual ~QDockWidget()//虚析构
Qt::DockWidgetAreas allowedAreas() const//返回当前的DockWidget支持停靠的位置
QDockWidget::DockWidgetFeatures features() const//返回当前DockWidget的特征属性
bool isAreaAllowed(Qt::DockWidgetArea area) const//判断当前的DockWidget是否支持在area这个枚举所描述的位置可停靠
bool isFloating() const//判断当前DockWidget是否可浮动在其他窗口上
void setAllowedAreas(Qt::DockWidgetAreas areas)//设置停靠窗口可以停靠的位置
void setFeatures(QDockWidget::DockWidgetFeatures features)//设置停靠窗口的特征属性
void setFloating(bool floating)//设置停靠窗口是否浮动
void setTitleBarWidget(QWidget *widget)//将其他的Widget窗口设置到当前的DockWidget的标题栏上
void setWidget(QWidget *widget)//设置停靠窗口的Widget
QWidget *titleBarWidget() const//获取标题栏上的Widget指针
QAction *toggleViewAction() const//切换视角的事件(当该DockWidget的窗口发生变化时,会有一个QAction指针被返回)
QWidget *widget() const//返回当前DockWidget的Widget的指针
其中:
void setAllowedAreas(Qt::DockWidgetAreas areas)//设置停靠窗口可以停靠的位置,areas参数有这些枚举
LeftToolBarArea:只能在主窗口左边停靠
RightToolBarArea:只能在主窗口右边停靠
TopToolBarArea:可停靠在工具栏上
BottomToolBarArea:可停靠在底部工具栏上
AllToolBarAreas:主窗口所有的的区域都可以停靠
NoToolBarArea:停靠在除了工具栏以外的区域
void setFeatures(QDockWidget::DockWidgetFeatures features)//设置停靠窗口可以支持的操作
enum DockWidgetFeature {
DockWidgetClosable = 0x01,//该停靠窗口可被关闭
DockWidgetMovable = 0x02,//该停靠窗口可以移动
DockWidgetFloatable = 0x04,//该停靠窗口可以浮动
DockWidgetVerticalTitleBar = 0x08,//该停靠窗口可以有垂直的标题栏
AllDockWidgetFeatures = DockWidgetClosable|DockWidgetMovable|DockWidgetFloatable//以上属性都具备
};
我们可以用|运算符来设置多个属性
3.2.2 停靠窗口的案例(见DockWidgetDemo)
3.2.2.1 新建一个Qt桌面项目,项目名称为QDockWidgetDemo,取消"创建UI界面"的复选框,将类名命名为QDockWidgetDemo
3.2.2.2 在qdockwidgetdemo.h中加入以下代码

#ifndef QDOCKWIDGETDEMO_H
#define QDOCKWIDGETDEMO_H
#include <QDebug>
#include <QTextEdit>
#include <QHBoxLayout>
#include <QGridLayout>
#include <QVBoxLayout>
#include <QMainWindow>
#include <QDockWidget>
class QDockWidgetDemo : public QMainWindow
{
    Q_OBJECT
public:
    QDockWidgetDemo(QWidget *parent = nullptr);
    ~QDockWidgetDemo();
private:
    QGridLayout*m_mainLayout;
private:
    QTextEdit*m_leftTextEdit;
    QTextEdit*m_rightTopTextEdit;
    QTextEdit*m_rightBottomTextEdit;
private:
    QDockWidget*m_leftDockWidget;
    QDockWidget*m_rightTopDockWidget;
    QDockWidget*m_rightBottomDockWidget;
};
#endif // QDOCKWIDGETDEMO_H

3.2.2.3 在qdockwidgetdemo.cpp中加入以下代码

#include "qdockwidgetdemo.h"

QDockWidgetDemo::QDockWidgetDemo(QWidget *parent):QMainWindow(parent)
{
    //左边的DockWidget和TextEdit
    this->m_leftTextEdit = new QTextEdit(QString("左边的TextEdit"));//new出右边的TextEdit
    this->m_leftDockWidget = new QDockWidget(QString("左边的Dock窗口"),this);//new出左边的DockWidget,并且指定父窗口
    this->m_leftDockWidget->setWidget(m_leftTextEdit);//将TextEdit添加到左边的DockWidget中
    this->m_leftDockWidget->setFeatures(QDockWidget::DockWidgetFeature::DockWidgetVerticalTitleBar
                                        |QDockWidget::DockWidgetFeature::DockWidgetMovable|
                                        QDockWidget::DockWidgetClosable|
                                        QDockWidget::DockWidgetFloatable);//设置垂直的TitleBar,该Dock可移动,可关闭,可浮动在其他窗口上
    this->m_leftDockWidget->setAllowedAreas(Qt::DockWidgetArea::TopDockWidgetArea|Qt::DockWidgetArea::LeftDockWidgetArea);//设置Dock的停靠范围(顶部和左边)
    this->m_leftDockWidget->move(0,0);
    //右上角的DockWidget和TextEdit
    this->m_rightTopTextEdit = new QTextEdit(QString("右上角的TextEdit"));//new出右上角的TextEdit
    this->m_rightTopDockWidget = new QDockWidget(QString("右上角的Dock窗口"),this);//new出右上角的DockWidget,并且指定父窗口
    this->m_rightTopDockWidget->setWidget(m_rightTopTextEdit);//将TextEdit添加到Dock中
    this->m_rightTopDockWidget->setFeatures(QDockWidget::DockWidgetFeature::DockWidgetMovable|QDockWidget::DockWidgetFloatable);//设置Dock的属性(可移动,可浮动)
    this->m_leftDockWidget->setAllowedAreas(Qt::DockWidgetArea::RightDockWidgetArea);//该Dock可在右边停靠
    this->m_rightTopDockWidget->move(200,0);
    //右下角的DockWidget和TextEdit
    this->m_rightBottomTextEdit = new QTextEdit(QString("右下角的TextEdit"));//new出右下角的TextEdit
    this->m_rightBottomDockWidget = new QDockWidget(QString("右下角的Dock窗口"),this);//new出右下角的DockWidget,并且指定父窗口
    this->m_rightBottomDockWidget->setWidget(m_rightBottomTextEdit);//将TextEdit添加到Dock中
    this->m_rightBottomDockWidget->setFeatures(QDockWidget::DockWidgetFeature::DockWidgetMovable|QDockWidget::DockWidgetFloatable);//设置Dock的属性(可移动,可浮动)
    this->m_rightBottomDockWidget->setAllowedAreas(Qt::DockWidgetArea::BottomDockWidgetArea);//该Dock仅可在底部停靠
    this->m_rightBottomDockWidget->move(200,200);

}
QDockWidgetDemo::~QDockWidgetDemo()
{
}
//本节案例代码:https://files.cnblogs.com/files/blogs/792763/QDockWidgetDemo.zip?t=1697437376&download=true
posted @ 2023-10-16 14:23  蜡笔小新Pointer  阅读(179)  评论(0)    收藏  举报