QT界面:QDockWidget停靠窗口使用小结

QDockWidget停靠窗口

Qt构建停靠窗口使用的是QDockWidget类。

窗口特性

停靠窗口特性可以通过setFeatures(QDockWidget::AllDockWidgetFeatures)方法进行设置:

常亮描述
QDockWidget::DockWidgetClosable0x01窗口可关闭
QDockWidget::DockWidgetMovable0x02窗口可移动
QDockWidget::DockWidgetFloatable0x04停靠窗口可以与主窗口分离,作为独立窗口浮动
QDockWidget::DockWidgetVerticalTitleBar0x08停靠窗口在左侧显示垂直标题栏。 用于增加QMainWindow中的垂直空间。
QDockWidget::AllDockWidgetFeaturesDockWidgetClosable /DockWidgetMovable / DockWidgetFloatable(不建议使用)可以关闭,移动和浮动停靠窗口
QDockWidget::NoDockWidgetFeatures0x00停靠窗口不可关闭、移动、浮动
停靠区域

通过setAllowedAreas(Qt::DockWidgetAreas areas)设置窗口停靠区域:

常亮
Qt::LeftDockWidgetArea0x1
Qt::RightDockWidgetArea0x2
Qt::TopDockWidgetArea0x4
Qt::BottomDockWidgetArea0x8
Qt::AllDockWidgetAreasDockWidgetArea_Mask
Qt::NoDockWidgetArea0
隐藏与显示

窗口的隐藏与显示可通过hide()、show()实现,判断窗口的显示与隐藏状态可用isHidden()。

示例

环境:Win10+VS2015+Qt5.9.7

首先创建一个Qt GUI Application。工程名:myDockWidget。然后,在资源文件中添加一幅图像资源:

在这里插入图片描述

头文件

myDockWidget.h:

#pragma once

#include <QtWidgets/QMainWindow>
#include <QHBoxLayout>
#include <QPushButton>
#include <QRadioButton>
#include <QCheckBox>
#include <QSpinBox>
#include <QLabel>
#include <QTextEdit>
#include <QDockWidget>

#include "ui_myDockWidget.h"

#pragma execution_character_set("utf-8")

class myDockWidget : public QMainWindow
{
	Q_OBJECT

public:
	myDockWidget(QWidget *parent = Q_NULLPTR);

private:
	Ui::myDockWidgetClass ui;
};

源文件

myDockWidget.cpp:

在停靠窗口中添加一些控件资源。

#include "myDockWidget.h"

myDockWidget::myDockWidget(QWidget *parent)
	: QMainWindow(parent)
{
	ui.setupUi(this);

	//显示——停靠窗口
	QLabel *m_qLabel = new QLabel("", this);
	m_qLabel->setAlignment(Qt::AlignCenter);
	m_qLabel->setStyleSheet("border-image: url(:/myDockWidget/Resources/image.jpg);");
	m_qLabel->setMinimumWidth(500);
	m_qLabel->setMinimumHeight(300);

	QHBoxLayout *hlayout0 = new QHBoxLayout;
	hlayout0->addWidget(m_qLabel);
	QGridLayout *vlayout0 = new QGridLayout;
	vlayout0->addLayout(hlayout0, 0, 0);

	QWidget *cornerWidget0 = new QWidget;
	cornerWidget0->setLayout(vlayout0);
	setCentralWidget(cornerWidget0);

	//调试——停靠窗口
	QDockWidget *debugging = new QDockWidget("调试", this);//构建停靠窗口,指定父类
	debugging->setFeatures(QDockWidget::DockWidgetMovable | QDockWidget::DockWidgetClosable);//设置停靠窗口特性,可移动,可关闭
	debugging->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);//设置可停靠区域为主窗口左边和右边
	debugging->setMinimumWidth(200);

	QTextEdit *debuggingEdit = new QTextEdit("调试——停靠窗口);
	debugging->setWidget(debuggingEdit);
	addDockWidget(Qt::RightDockWidgetArea, debugging);

	//测试——停靠窗口
	QDockWidget *dw3 = new QDockWidget("测试", this);//构建停靠窗口,指定父类
	dw3->setFeatures(QDockWidget::DockWidgetMovable);//设置停靠窗口特性,可移动,可关闭
	dw3->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);//设置可停靠区域为主窗口左边和右边

	QHBoxLayout *hlayout31 = new QHBoxLayout;
	QPushButton *runPushButton = new QPushButton(tr("运行"));
	QPushButton *stopPushButton = new QPushButton(tr("停止"));
	hlayout31->addWidget(runPushButton);
	hlayout31->addWidget(stopPushButton);

	QGridLayout *vlayout3 = new QGridLayout;
	vlayout3->addLayout(hlayout31, 0, 0);
	QWidget *cornerWidget3 = new QWidget;
	cornerWidget3->setLayout(vlayout3);
	dw3->setWidget(cornerWidget3);
	dw3->setMaximumHeight(100);
	dw3->setMaximumWidth(300);
	addDockWidget(Qt::LeftDockWidgetArea, dw3);

}

效果如图:
在这里插入图片描述

为停靠窗口中的控件添加槽函数

头文件

myDockWidget.h:

#pragma once

#include <QtWidgets/QMainWindow>
#include <QHBoxLayout>
#include <QPushButton>
#include <QRadioButton>
#include <QCheckBox>
#include <QSpinBox>
#include <QLabel>
#include <QTextEdit>
#include <QDockWidget>
#include <QMessageBox>

#include "ui_myDockWidget.h"

#pragma execution_character_set("utf-8")

class myDockWidget : public QMainWindow
{
	Q_OBJECT

public:
	myDockWidget(QWidget *parent = Q_NULLPTR);

private:
	Ui::myDockWidgetClass ui;
	QPushButton *runPushButton;

private slots:
	void runPushButtonSlot();

};

源文件

myDockWidget.cpp:

#include "myDockWidget.h"

myDockWidget::myDockWidget(QWidget *parent)
	: QMainWindow(parent)
{
	ui.setupUi(this);

	//显示——停靠窗口
	QLabel *m_qLabel = new QLabel("", this);
	m_qLabel->setAlignment(Qt::AlignCenter);
	m_qLabel->setStyleSheet("border-image: url(:/myDockWidget/Resources/image.jpg);");
	m_qLabel->setMinimumWidth(500);
	m_qLabel->setMinimumHeight(300);

	QHBoxLayout *hlayout0 = new QHBoxLayout;
	hlayout0->addWidget(m_qLabel);
	QGridLayout *vlayout0 = new QGridLayout;
	vlayout0->addLayout(hlayout0, 0, 0);

	QWidget *cornerWidget0 = new QWidget;
	cornerWidget0->setLayout(vlayout0);
	setCentralWidget(cornerWidget0);

	//调试——停靠窗口
	QDockWidget *debugging = new QDockWidget("调试", this);//构建停靠窗口,指定父类
	debugging->setFeatures(QDockWidget::DockWidgetMovable | QDockWidget::DockWidgetClosable);//设置停靠窗口特性,可移动,可关闭
	debugging->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);//设置可停靠区域为主窗口左边和右边
	debugging->setMinimumWidth(200);

	QTextEdit *debuggingEdit = new QTextEdit("调试——停靠窗口");
	debugging->setWidget(debuggingEdit);
	addDockWidget(Qt::RightDockWidgetArea, debugging);

	//测试——停靠窗口
	QDockWidget *dw3 = new QDockWidget("测试", this);//构建停靠窗口,指定父类
	dw3->setFeatures(QDockWidget::DockWidgetMovable);//设置停靠窗口特性,可移动,可关闭
	dw3->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);//设置可停靠区域为主窗口左边和右边

	QHBoxLayout *hlayout31 = new QHBoxLayout;
	runPushButton = new QPushButton(tr("运行"));
	runPushButton->setStyleSheet("background-color: rgb(0, 255, 127);");
	QObject::connect(runPushButton, SIGNAL(clicked()), this, SLOT(runPushButtonSlot()));

	QPushButton *stopPushButton = new QPushButton(tr("停止"));

	hlayout31->addWidget(runPushButton);
	hlayout31->addWidget(stopPushButton);

	QGridLayout *vlayout3 = new QGridLayout;
	vlayout3->addLayout(hlayout31, 0, 0);
	QWidget *cornerWidget3 = new QWidget;
	cornerWidget3->setLayout(vlayout3);
	dw3->setWidget(cornerWidget3);
	dw3->setMaximumHeight(100);
	dw3->setMaximumWidth(300);
	addDockWidget(Qt::LeftDockWidgetArea, dw3);

}

void myDockWidget::runPushButtonSlot()
{
	runPushButton->setStyleSheet("background-color: rgb(255, 100, 100);");
	QMessageBox::information(this, "提示:", "开始运行");
}

在这里插入图片描述
在这里插入图片描述

  • 8
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值