【Qt】窗口部件

概述

在Qt Creator中,提供了默认的基类有QMainWindow、QWidget和QDialog三种。

  • QMainWindow是带有菜单栏和工具栏的主窗口类;
  • QDialog是各种对话框类的基类;
  • 所有的窗口部件都继承自QWidget。QWidget类是所有用户界面对象的基类,被称为基础窗口部件。QWidget继承自QObject类和QPaintDevice类。其中QObject类是所有Qt对象模型(Qt Object Model)对象的基类,QPaintDevice类是所有可绘制对象的基类。
    【Qt】窗口部件_第1张图片

窗口部件

QWidget

窗口类型

QWidget的构造函数需要2个参数:

QWidget::QWidget(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags())
  • parent指父窗口部件,默认是0表示没有父窗口。
  • f是窗口类型,是Qt::WindowType枚举类型值或组合。为部件指定各种窗口系统的属性。默认值是Qt::Widget,表示如果有父类型它就是子部件,否则就是独立窗口。

Qt::WindowType详解:

类型 说明
Qt::Widget 构造函数的默认值,如果新的部件没有父窗口部件,则是独立窗口,否则就是一个子窗口
Qt::Window 无论是否有父窗口,新窗口部件都是一个窗口,通常带有一个窗口的边框和标题
Qt::Dialog 新窗口是一个对话框
Qt::Sheet 新窗口是一个Macintosh表单
Qt::Drawer 新窗口是一个Macintosh抽屉
Qt::Popup 新窗口是一个弹出式顶层窗口
Qt::Tool 新窗口是一个工具窗口,通常是一个用于显示工具按钮的小窗口,如果一个工具窗口有父窗口部件,则将他显示在父窗口部件上,否则相当于使用了Qt::WindowStaysOnTopHint展示
Qt::Tooltip 新窗口是一个提示窗口,没有标题栏和边框
Qt::SplashScreen 新窗口是一个欢迎窗口,他是QSplashScreen构造函数的默认值
Qt::Desktop 新窗口是桌面,是QDesktopWidget构造函数的默认值
Qt::SubWindow 新窗口是一个子窗口,无论该窗口是否有父窗口
Qt::FramelessWindowHint 产生一个无窗口边框的窗口,此时用户无法移动该窗口和改变他的大小
Qt::CustomizeWindowHint 关闭默认的窗口标题提示
Qt::WindowStaysOnTopHint 使窗口停留在所有其他窗口上面

窗口状态

QWidget使用setWindowState()函数来设置窗口状态,其参数由Qt::WindowState指定,是Qt::WindowState的枚举类型或其组合。

Qt::WindowState详解:

  • WindowNoState:没有状态,默认值
  • WindowMinimized:窗口最小化
  • WindowMaximized:窗口最大化,带窗口边框
  • WindowFullScreen:全屏,不带窗口边框
  • WindowActive:激活当前的窗口,获取键盘的焦点。

窗口的几何布局

【Qt】窗口部件_第2张图片

  • x()、y()、pos()是指整个窗口(包含标题和边框)的位置
  • geomotry()是没有边框窗口矩形值,frameGeometry()是包含边框窗口的矩形值,类型都是QRect,包含了坐标(x、y)、大小(width、height)信息

调试qDebug()函数

调试过程在经常使用qDebug()函数将调试信息直接输出到控制台,在Qt Creator是输出到应用程序的输出栏。有2种输出方式:

qDebug("x:%d", x);

直接将字符串作为参数传给qDebug()函数。可以不用添加头文件。

qDebug() << "geometry" << geometry << "frame" << frame;

使用输出流的方式,一次性输出多个值,他们的类型可以是不同的。必须添加头文件。
如果需要输出换行,需要添加endl(end line)标识

qDebug() << "geometry" << geometry << endl << "frame" << frame;

QDialog

QDialog类是所有对话框窗口类的基类。对话框窗口是一个经常用来完成短小任务或者和用户进行简单交互的顶层窗口。

模态和非模态对话框

按照运行对话框时是否还可以和该程序的其他窗口进行交互,对话框分为模态(modal)和非模态(modeless)。模态和非模态对话框,主要体现在是否“阻塞”应用程序。

  • 模态:在该窗口弹出后,会阻塞应用程序的窗口,使其不可操作。
  • 非模态:不会阻塞应用程序的窗口,两者可独立运行。

一般情况下,使用窗口的show()函数,默认使用的是非模态对话框。

QDialog *dialog = new QDialog(this);
dialog->show();

如果要使用模态对话框的效果,需要使用exec()函数

QDialog *dialog = new QDialog(this);
dialog->exec();

使用show()函数也可以建立模态对话框,需要设置模态属性setModal()。

QDialog *dialog = new QDialog(this);
dialog->setModal(true);
dialog->show();

但是show()和exec()设置的模态不同,show()函数调用完会立即将控制权交给调用者,所以父窗口如果有窗口可以继续绘制出来;exec()只有在当前窗口被关闭后,才会把控制权交给调用者,所以父窗口等其他未绘制的窗口不会被绘制。

setModal()是QDialog类对话框类的方法,QWidget类提供了类似的setWindowModality()函数,可以设置要阻塞的窗口类型:

  • Qt::NonModal:不阻塞任何窗口,就是非模态
  • Qt::WindowModal:阻塞它的父窗口、所有祖先窗口以及他们的子窗口
  • Qt::ApplicationModal:阻塞整个应用程序的所有窗口。
    setModal()默认设置的是Qt::ApplicationModal。

标准对话框

Qt提供了一些常用的对话框,它们全部继承自QDialog类,并增加自己的特色功能。

颜色对话框
QColor color = QColorDialog::getColor(Qt::red, this, tr("颜色对话框"));

使用QColorDialog的静态函数getColor()来获取颜色。Qt::red是Qt预定义的颜色对象。函数返回一个QColor类型数据,如QColor(ARGB1,1,0,0)(代表透明度alpha、红色red、绿色green、蓝色blue),它们的数值都是0.0~1.0。对于alpha透明度:1.0表示完全不透明,0.0表示完全透明。三基色可以用0~255来表示,与0.0~1.0表示可以通过数学运算来转换。

默认颜色对话框没有透明度的设置,如果需要有透明度设置,可以添加参数

QColor color = QColorDialog::getColor(Qt::red, this, tr("颜色对话框"), 
										QColorDialog::ShowAlphaChannel);
文件对话框

文本对话框QFileDialog类提供了一个允许用户选择文件或文件夹的对话框。

QString fileName = QFileDialog::getOpenFileName(this, tr("文件对话框"), "D:", 
												tr("图片文件(*png *jpg)"));

使用getOpenFileName()的静态方法获取选择的文件名,这个对话框默认以模态的方式运行,返回选择的文件名。参数是父窗口、对户口标题、指定默认打开的目录路径、设置文件类型的过滤器。如果不指定文件过滤器,则默认选择所有文件。这里指定了2种图片格式(注意:代码中png和jpg之间需要有个空格),还可以设置多种不同类别的过滤器,使用“;;”隔开。

QString fileName = QFileDialog::getOpenFileName(this, tr("文件对话框"), "D:", 
										tr("图片文件(*png *jpg);;文本文件(*txt)"));

如果需要选择多个文件:

QStringList fileNames = QFileDialog::getOpenFileNames(this, tr("文件对话框"), "D:", 
										tr("图片文件(*png *jpg);;文本文件(*txt)"));

此外还提供了getSaveFileName()函数来实现保存文件对话框和另存为对话框,getExistingDirectory()函数来获取一个已存在的文件夹路径。

字体对话框

QFontDialog类提供了一个可以选择字体的对话框部件。

bool ok;
QFont font = QFontDialog::getFont(&ok, this);
if (ok)
{
	ui->pushButton->setFont(font);
}

使用QFontDialog类的getFont()静态函数获取选择的字体。第一个参数bool型用来存放是否已经选择了字体。

输入对话框

QInputDialog类提供了一个对话框,让用户输入一个单一的数值或字符串。

bool ok;

/* 获取字符串,参数:父窗口、设置窗口标题、设置对话框中的标签显示文本、设置输入字符串的显示模式(如密码可以显示显示成点)、输入框中默认显示的字符串、接收按键的信息 */
QString string = QInputDialog::getText(this, tr("输入字符串对话框"),
				tr("请输入用户名:"), QLineEdit::normal,
				tr("admin"), &ok);

/* 获取整数,参数:100表示默认值、最小值、最大值、10表示使用箭头上下每次步进10 */
int value1 = QInputDialog::getInt(this, tr("输入整数对话框"),
				tr("请输入-1000到1000之间的数值"),
				100, -1000, 1000, 10, &ok);

/* 获取浮点数,参数:2表示输入2位小数 */
double value2 = QInputDialog::getDouble(this, tr("输入浮点数对话框"),
				tr("请输入-1000到1000之间的数值"),
				0.00, -1000, 1000, 2, &ok);

QStringList items;
items << tr("条目1") << tr("条目2");
QString item = QInputDialog::getItem(this, tr("输入条目对话框"),
                                     tr("请选择或输入一个条目"),
                                     items, 0, true, &ok);
消息对话框

QMessageBox类提供了一个模态对话框来通知用户一些信息,或者向客户提出一个问题并获取答案。

int ret = QMessage::question(this, tr("问题对话框"), tr("你了解Qt吗?"),
					QMessageBox::Yes, QMessageBox::No);
int ret = QMessage::information(this, tr("提示对话框"), tr("这是Qt书籍"),
					QMessageBox::Ok);
int ret = QMessage::warning(this, tr("警告对话框"), tr("不能提前结束"),
					QMessageBox::Abort);
int ret = QMessage::critical(this, tr("严重错误对话框"), 
					tr("发现一个严重错误"), QMessageBox::YesAll);
int ret = QMessage::about(this, tr("关于对话框"), tr("关于Qt"));

这4种不同的对话框分别对应不同的系统提示音。
返回值是标准的按钮类型QMessageBox::StandardButton,用来接收用户按下哪个按键。

进度对话框

QProgressDialog类对一个耗时较长的操作进度提供反馈。

QProgressDialog dialog(tr("文件复制进度"), tr("取消"), 0, 500000, this);
dialog.setWindowTitle(tr("进度对话框"));
dialog.setModal(true);
dialog.show();
for (int i = 0; i <= 500000; i++)
{
    dialog.setValue(i);
//        QCoreApplication::processEvents();
    if (dialog.wasCanceled())
    {
        break;
    }
}

这里使用了模态对话框,也可以使用非模态对话框,但是需要定时器来实现进度条更新。

错误信息对话框

QErrorMessage类提供了一个现实错误信息的对话框,默认以非模态的形式展现。对话框中有个show this message again复选框,选择以后是否需要展示相同的信息,为了实现这个复选框,我们需要定义全局的错误信息对话框对象。

QErrorMessage *errorMsg;

errorMsg = new QErrorMessage(this);
errorMsg->setWindowTitle(tr("错误信息对话框"));
errorMsg->showMessage(tr("这里是出错信息"));
向导对话框

向导对话框QWizard类提供了一个向导界面的框架。QWizard之所以被称之为框架,是因为它具有设计一个向导的全部功能。

其他窗口部件

布局管理

Qt主要提供了QLayout类及其子类作为布局管理器,他们可以实现常用的布局管理功能。
【Qt】窗口部件_第3张图片
所有QWidget的子类对象,都可以使用布局管理器管理位于他们之中的子部件。使用QWidget::setLayout()函数可以在一个部件上应用布局管理器。

布局管理器

常用属性:

设置部件大小

可扩展窗口

分裂器(QSplitter)

设置伙伴(buddy)

设置tab键顺序

定位器

QWidget、QMainWindow和QDialog的区别

类型 说明
QWidget QWidget类是所有用户界面对象的基类。 窗口部件是用户界面的一个基本单元:它从窗口系统接收鼠标、键盘和其它事件,并且在屏幕上绘制自己。每一个窗口部件都是矩形的,并且它们按Z轴顺序排列。一个窗口部件可以被它的父窗口部件或者它前面的窗口部件盖住一部分。
QMainWindow QMainWindow 类提供一个有菜单条、锚接窗口(例如工具条)和一个状态条的主应用程序窗口。主窗口通常用在提供一个大的中央窗口部件(例如文本编辑或者绘制画布)以及周围 菜单、工具条和一个状态条。QMainWindow常常被继承,因为这使得封装中央部件、菜单和工具条以及窗口状态条变得更容易,当用户点击菜单项或者工具条按钮时,槽会被调用。
QDialog QDialog类是对话框窗口的基类。对话框窗口是主要用于短期任务以及和用户进行简要通讯的顶级窗口。是一个不会被嵌入到父窗口部件的窗口部件叫做顶级窗口部件。
通常情况下,顶级窗口部件是有框架和标题栏的窗口(尽管使用了一定的窗口部件标记,创建顶级窗口部件时也可能没有这些装饰。)
QDialog可以是模态对话框也可以是非模态对话框。
QDialog支持扩展性并且可以提供返回值。
它们可以有默认按钮。
QDialog也可以有一个QSizeGrip在它的右下角,使用setSizeGripEnabled()。

应用

如果是顶级对话框,那就基于QDialog创建,如果是主窗体,那就基于QMainWindow,如果不确定,或者有可能作为顶级窗体,或有可能嵌入到其他窗体中,则基于QWidget创建。

当然了,实际中,你还可以基于任何其他部件类来派生。看实际需求了,比如QFrame、QStackedWidget等等。

QWidget

大小策略QSizePolicy

Fixed:不会发生任何伸缩

Minimum:推荐的大小是它的最小尺寸,它不会变的更小,但是可以变的更大。

Maximum:推荐的大小是它的最大尺寸,它不会变的更大。

Preferred:推荐大小为优先选择,可以变大或者变小

expanding:能够感知到推荐大小,但是会以尽可能大的空间来放置窗口部件。

ignore:不能感知到推荐大小,会以尽可能大的空间来放置窗口。

QMainWindow

QMainWindow继承与QWidget,通过子类化QMainWindow可以创建一个桌面应用程序的窗口。

QMainWindow分为五个部分:菜单栏、工具栏、停靠窗口、状态栏和中央窗口。

【Qt】窗口部件_第4张图片

中央窗口可以使用任何形式的QWidget来填充,一般不建议中央窗口为空。

可以使用setCentralWidget()函数来填充。

Menu Bar

QMenuBar是菜单栏,QMenu是菜单,多个QMenu组成一个QMenuBar。

对于每个QMenu,可以添加动作列表QAction对象。

QMenu *menuFile     = this->menuBar()->addMenu("文件");
QMenu *menuEdit     = this->menuBar()->addMenu("编辑");
QMenu *menuView     = this->menuBar()->addMenu("视图");
QMenu *menuSettings = this->menuBar()->addMenu("设置");
QMenu *menuHelp     = this->menuBar()->addMenu("帮助");

QAction *actionFileNew   = menuFile->addAction("新建");
QAction *actionFileOpen  = menuFile->addAction("打开");
menuFile->addSeparator();
QAction *actionFileClose = menuFile->addAction("关闭");

QAction *actionSettingsCommMode = menuSettings->addAction("通讯方式");

Tool Bars

需要注意的是,一个窗口只能有一个菜单栏,但是可以有多个工具栏。所以QMainWindow可以直接返回menuBar对象,但是不能直接返回toolBar对象,需要自己调用addToolBar()来创建一个工具栏。

QDialog

模态与非模态

  • 模态:启动模态界面时,例如弹出对话框强制用户从其他正在进行的业务中聚焦到当前对话框,除了该对话框整个应用程序窗口都无法接受用户响应,无法切换界面,无法切换当前Qt应用。这可以保证用户按照自己设计的操作逻辑进行动作。只有关闭和退出该模态界面,才可以访问本应用程序的其他界面和功能。
  • 非模态:与模态相反,默认状态为非模态,即可以随意切换,可以在同一应用下的各个窗口界面任意切换。
  • 半模态:介于二者之间,冻结窗口界面,但其他应用继续执行响应。

你可能感兴趣的:(系统平台开发,qt,开发语言,visual,studio)