本帖最后由 正点原子运营 于 2022-7-23 15:23 编辑
1)实验平台:正点原子阿尔法Linux开发板
2) 章节摘自【正点原子】《I.MX6U 嵌入式Qt开发指南》
3)购买链接:https://detail.tmall.com/item.htm?id=609033604451
4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/arm-linux/zdyz-i.mx6ull.html
5)正点原子官方B站:https://space.bilibili.com/394620890
6)正点原子阿尔法Linux交流群:1027879335
第七章 Qt控件
老子曾说:“天下难事,必做于易;天下大事,必做于细”。再复杂的项目,都是由一个个小小的部分组成,只有掌握了Qt的基本,遇到大项目也不用担心了!从这章开始我们开始学习Qt的窗口部件,其中每种类型的窗口部件都选取一个作为例子讲解它们的用法,通过例子大家能举一反三。本章也是纯代码编程,不使用Qt Designer图形界面开发程序。编者认为纯代码编程的代码容易让人看懂,在Qt Designer里设计就显得没有过多逻辑可言。在这章里我们可以学习常用的控件初始化方法,设置窗体的大小位置,颜色,文本,设计创意的例子快速学习各类控件的使用方法,力求把例子写的实用,代码注释详细。因为控件非常多,如果觉得学习控件枯燥,可以等用到这个控件(部件)时再参考,不必要一次性全部掌握,这章节的目的是了解Qt控件类型及使用方法。 值得留意的小节是7.1.3小节,该小节讲解如何添加资源图片和qss文件。后面的例程都可以参考7.1.3小节添加资源图片,不再重复写这种添加步骤。 第7.8和7.9小节,我们在嵌入式里经常用于处理数据,建立模型,应该花多点时间学习这两个小节。
7.1 按钮 在Qt里,最常用使用的控件就是按钮了,有了按钮,我们就可以点击,从而响应事件,达到人机交互的效果。不管是嵌入式或者PC端,界面交互,少不了按钮。 Qt 按钮部件是一种常用的部件之一,Qt内置了六种按钮部件如下:
(1) QPushButton:下压按钮 (2) QToolButton:工具按钮 (3) QRadioButton:选择按钮 (4) QCheckBox:检查框 (5) QCommandLinkButton:命令链接按钮 (6) QDialogButtonBox:对话框按钮 这六种按钮部件作用简介如下: QPushButton继承QAbstractButton类,被QCommandLinkButton继承。通常用于执行命令或触发事件。 QToolButton继承QAbstractButton类。是一种用于命令或者选项的可以快速访问的按钮,通常在ToolBar里面。工具按钮通常显示的是图标,而不是文本标签。ToolButton支持自动浮起。在自动浮起模式中,按钮只有在鼠标指向它的时候才绘制三维的框架。 QRadioButton继承QAbstractButton类。RadioButton单选按钮(单选框)通常成组出现,用于提供两个或多个互斥选项。 QCheckBox继承QAbstractButton。复选按钮(复选框)与RadioButton的区别是选择模式,单选按钮提供多选一,复选按钮提供多选多。 QCommandLinkButton控件中文名是“命令链接按钮”。QCommandLinkButton继承QPushButton。QCommandLinkButton控件和RadioButton相似,都是用于在互斥选项中选择一项。表面上同平面按钮一样,但是CommandLinkButton除带有正常的按钮上的文字描述文本外,默认情况下,它也将携带一个箭头图标,表明按下按钮将打开另一个窗口或页面。 QDialogButtonBox按钮盒子(按钮框),是由QDialogButtonBox类包装成的。QDialogButtonBox继承QWidget。常用于对话框里自定义按钮,比如“确定”和“取消”按钮。 上面说的六种按钮的可用属性,信号和槽,需要用到时可在Qt帮助文档里查看。这里我们就略过介绍它们可用属性和信号与槽了。下面我们通过例子讲解每种按钮是如何使用,一起探究它们究竟能实现什么效果。
7.1.1 QPushButton7.1.1.1 控件简介 在第四章里我们就已经接触过QPushButton了,在Qt Designer里连接信号与槽,从而实现了关闭程序的功能。下面开始重新用编写程序的方法实现使用QPushButton连接信号和槽实现一个小例子。
7.1.1.2 用法示例 例04_qpushbutton窗口换肤(难度:简单),通过单击不同的按钮,改变窗口的颜色。 新建一个项目名称为为04_qpushbutton,在新建例程中不要勾选“Generate form”,默认继承QMainWindow类即可。如果还不会新建一个项目,建议回到3.6小节查看如何新建一个项目。完成如下图。 在头文件“mainwindow.h”具体代码如下。 - mainwindow.h编程后的代码
- 1 #ifndef MAINWINDOW_H
- 2 #define MAINWINDOW_H
- 3
- 4 #include <QMainWindow>
- 5 /* 引入QPushButton类 */
- 6 #include <QPushButton>
- 7
- 8 class MainWindow : public QMainWindow
- 9 {
- 10 Q_OBJECT
- 11
- 12 public:
- 13 MainWindow(QWidget *parent = nullptr);
- 14 ~MainWindow();
- 15
- 16 private:
- 17 /* 声明一个QPushButton对象pushButton1 */
- 18 QPushButton *pushButton1;
- 19 /* 声明一个QPushButton对象pushButton2 */
- 20 QPushButton *pushButton2;
- 21
- 22 private slots:
- 23 /* 声明对象pushButton1的槽函数 */
- 24 void pushButton1_Clicked();
- 25 /* 声明对象pushButton2的槽函数 */
- 26 void pushButton2_Clicked();
- 27 };
- 28 #endif // MAINWINDOW_H
复制代码 第6行,引入QPushButton类。 第18和20行,声明两个QPushButton的对象。 第24和26行,声明两个QPushButton对象的槽函数。 在源文件“mainwindow.cpp”具体代码如下。 - mainwindow.cpp编程后的代码
- 1 #include "mainwindow.h"
- 2
- 3 MainWindow::MainWindow(QWidget *parent)
- 4 : QMainWindow(parent)
- 5 {
- 6 /* 设置宽高为800×480,位置在0, 0。(0, 0)代表原点,Qt默认最左上角的点为原点 */
- 7 this->setGeometry(0, 0, 800, 480);
- 8
- 9 /* 实例化两个按钮对象,并设置其显示文本为窗口皮肤1和窗口皮肤2 */
- 10 pushButton1 = new QPushButton("窗口皮肤1", this);
- 11 pushButton2 = new QPushButton("窗口皮肤2", this);
- 12
- 13 /* 设定两个QPushButton对象的位置 */
- 14 pushButton1->setGeometry(300,200,80,40);
- 15 pushButton2->setGeometry(400,200,80,40);
- 16
- 17 /* 信号槽连接 */
- 18 connect(pushButton1, SIGNAL(clicked()), this, SLOT(pushButton1_Clicked()));
- 19 connect(pushButton2, SIGNAL(clicked()), this, SLOT(pushButton2_Clicked()));
- 20 }
- 21
- 22 MainWindow::~MainWindow()
- 23 {
- 24 }
- 25
- 26 /* 槽函数的实现 */
- 27 void MainWindow::pushButton1_Clicked()
- 28 {
- 29 /* 设置主窗口的样式1 */
- 30 this->setStyleSheet("QMainWindow { background-color: rgba(255, 245, 238, 100%); }");
- 31 }
- 32
- 33 /* 槽函数的实现 */
- 34 void MainWindow::pushButton2_Clicked()
- 35 {
- 36 /* 设置主窗口的样式2 */
- 37 this->setStyleSheet("QMainWindow { background-color: rgba(238, 122, 233, 100%); }");
- 38 }
复制代码 第7行,设置程序窗口的显示位置和显示大小,如果不设置,运行的程序窗口在Ubuntu里有可能在某个位置出现,而在Windows一般出现在中间。 第10和11行,实际化QPushButton对象。在初始化的时候可以传入QString类型串,作为按钮的显示文本。 第14行,设置按钮的大小和位置,按钮的大小不能设置过小,否则按钮上的文本可能显示不全。 第18行和19行,连接两个QPushButton对象的信号与槽。 第27行至38行,两个QPushButton的槽函数实现,设置主窗体的样式表,其中设置background-color的rgba参数即可改变窗体的背景颜色。关于什么是样式表,如何设置样式表,以后会以一个小节专门讲解。 在源文件“main.cpp”具体代码如下,由新建项目时生成,无改动。 - mainwindow.cpp源代码
- 1 #include "mainwindow.h"
- 2
- 3 #include <QApplication>
- 4
- 5 int main(int argc, char *argv[])
- 6 {
- 7 QApplication a(argc, argv);
- 8 MainWindow w;
- 9 w.show();
- 10 return a.exec();
- 11 }
复制代码
7.1.1.3 运行效果
程序编译及运行后,点击窗口皮肤1按钮,主窗体显示效果如下。 点击窗口皮肤2按钮,主窗体显示效果如下。
7.1.2 QToolButton7.1.2.1 控件简介 工具按钮(QToolButton)区别于普通按钮(QPushButton)的一点是,工具按钮(QToolButton)可以带图标。这里区别下图标和按钮的背景图片是不一样的。通常我们在QToolBar这种工具条(工具栏)上设置不同的按钮,如果这些按钮还带图标和文本,那么QToolButton是个不错的选择。
7.1.2.2 用法示例 例05_qtoolbutton自定义工具栏(难度:简单)。 新建一个项目名称为05_qtoolbutton。在新建例程中不要勾选“Generate form”,默认继承QMainWindow类即可。项目新建完成如下图。 在头文件“mainwindow.h”具体代码如下。 - mainwindow.h编程后的代码
- 1 #ifndef MAINWINDOW_H
- 2 #define MAINWINDOW_H
- 3
- 4 #include <QMainWindow>
- 5 /* 引入QToolButton类 */
- 6 #include <QToolButton>
- 7 /* 引入QToolBar类 */
- 8 #include <QToolBar>
- 9
- 10 class MainWindow : public QMainWindow
- 11 {
- 12 Q_OBJECT
- 13
- 14 public:
- 15 MainWindow(QWidget *parent = nullptr);
- 16 ~MainWindow();
- 17
- 18 private:
- 19 /* 声明一个QToolButton对象 */
- 20 QToolButton *toolButton;
- 21 /* 声明一个QToolBar对象 */
- 22 QToolBar *toolBar;
- 23 };
- 24 #endif // MAINWINDOW_H
复制代码 第20和22行,声明QToolButton对象和QtoolBar对象。 在源文件“mainwindow.cpp”具体代码如下。 - mainwindow.cpp编程后的代码
- 1 #include "mainwindow.h"
- 2 #include <QApplication>
- 3 #include <QStyle>
- 4
- 5 MainWindow::MainWindow(QWidget *parent)
- 6 : QMainWindow(parent)
- 7 {
- 8 /* 设置主窗体的位置和大小 */
- 9 this->setGeometry(0, 0, 800, 480);
- 10
- 11 /* 实例化QToolBar对象 */
- 12 toolBar = new QToolBar(this);
- 13 /* 设置toolBar的位置和大小 */
- 14 toolBar->setGeometry(0, 0, 800, 100);
- 15
- 16 /* 实例化QStyle类对象,用于设置风格,调用系统类自带的图标 */
- 17 QStyle *style = QApplication::style();
- 18
- 19 /* 使用Qt自带的标准图标,可以在帮助文档里搜索QStyle::StandardPixmap */
- 20 QIcon icon = style->standardIcon(QStyle::SP_TitleBarContextHelpButton);
- 21
- 22 /* 实例化QToolButton对象 */
- 23 toolButton = new QToolButton();
- 24
- 25 /* 设置图标 */
- 26 toolButton->setIcon(icon);
- 27 /* 设置要显示的文本 */
- 28 toolButton->setText("帮助");
- 29 /* 调用setToolButtonStyle()方法,设置toolButoon的样式,设置为文本置于图标下方 */
- 30 toolButton->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
- 31
- 32 /* 最后将toolButton添加到ToolBar里 */
- 33 toolBar->addWidget(toolButton);
- 34 }
- 35
- 36 MainWindow::~MainWindow()
- 37 {
- 38 }
复制代码 这段代码的流程是,初始化toolBar(工具条/工具栏)对象,然后初始化toolButton(工具按钮)对象,设置工具按钮的样式。最后将toolButton(工具按钮)添加到toolBar(工具条/工具栏)上。这样就完成了自定义工具栏的设计。 在源文件“main.cpp”具体代码如下,由新建项目时生成,无改动。 - mainwindow.cpp源代码
- 1 #include "mainwindow.h"
- 2
- 3 #include <QApplication>
- 4
- 5 int main(int argc, char *argv[])
- 6 {
- 7 QApplication a(argc, argv);
- 8 MainWindow w;
- 9 w.show();
- 10 return a.exec();
- 11 }
复制代码
7.1.2.3 运行效果 最终程序实现的效果如下。成功的将自定义的工具按钮嵌入工具栏中。在许多含有工具栏的软件都可以看到这种设计,都可以使用Qt来实现类似的功能。
7.1.3 QRadioButton
7.1.3.1 控件简介 QRadioButton部件提供了一个带有文本标签的单选框(单选按钮)。 QRadioButton是一个可以切换选中(checked)或未选中(unchecked)状态的选项按钮。单选框通常呈现给用户一个“多选一”的选择。也就是说,在一组单选框中,一次只能选中一个单选框。默认在同一个父对象下,初始化后点击它们是互斥状态。
7.1.3.2 用法示例 例06_radiobutton仿手机开关效果(难度:中等)。本例将实现手机开关效果,需要使用到Qt样式表,加载qss样式表文件,与7.1.1小节类似,只是把样式表写到qss文件里了。这里我们慢慢接触Qt的样式表了,正因为有样式表我们才能写一些比较有实际应用的例子和比较炫的例子。 在新建例程中不要勾选“Generate form”,默认继承QMainWindow类即可。项目新建完成如下图。 添加资源文件,按如下步骤。右键项目,选择Add New…。
选择一个模板,选择Qt模板,再选择Qt Resource Files,点击Choose。这里Qt模板我们就不详细说了,日后我们需要使用什么模板,用到再了解。现在没必要一下子各个模板的用法,实际上我们常用的不多。
填上资源文件的名称(可随意写一个,编者简写为res),默认添加项目路径下。后面的步骤默认即可,点击完成。 新建完成了资源文件后,默认会进入res.qrc文件编辑模式(如果关闭了,可以右键这个文件点击选择“Open in Editor”),点击Add Prefix添加前缀,添加前缀的目的是方便分类管理文件,比如我们现在第⑪处添加了前缀/。“/”一定需要写,否则会找不到路径,这有点像Linux的根节点一样。 添加了前缀后,我们添加资源图片,放在/images前缀的下面。这里我们准备了两张图片,在本项目路径images文件夹(images文件夹先手动创建)下。如下图步骤,添加完成需要按“Ctrl + S”保存res.qrc才会看到左边的结果。添加完成如下图。 添加qss文件。QSS文件是使用Qt程序相关联的样式表文件。它由GUI元素的外观和感觉,包括布局,颜色,鼠标的行为,大小和字体。它的风格,一个可以合并到一个UI(用户界面)。与HTML的CSS类似,Qt的样式表是纯文本的格式定义,在应用程序运行时可以载入和解析这些样式定义,从而使应用程序的界面呈现不同的效果。 新建一个style.qss文件,如下图,默认添加到项目的路径下,后面步骤默认即可,直至完成。 qss文件添加后如下图。
在头文件“mainwindow.h”具体代码如下。 - mainwindow.h编程后的代码
- 1 #ifndef MAINWINDOW_H
- 2 #define MAINWINDOW_H
- 3
- 4 #include <QMainWindow>
- 5 /* 引入QRadioButton */
- 6 #include <QRadioButton>
- 7
- 8 class MainWindow : public QMainWindow
- 9 {
- 10 Q_OBJECT
- 11
- 12 public:
- 13 MainWindow(QWidget *parent = nullptr);
- 14 ~MainWindow();
- 15
- 16 private:
- 17 /* 声明两个QRadioButton对象 */
- 18 QRadioButton *radioButton1;
- 19 QRadioButton *radioButton2;
- 20 };
- 21 #endif // MAINWINDOW_H
复制代码 在第18和19行声明两个QRadioButton对象。 在源文件“mainwindow.cpp”具体代码如下。 - mainwindow.cpp编程后的代码
- 1 #include "mainwindow.h"
- 2
- 3 MainWindow::MainWindow(QWidget *parent)
- 4 : QMainWindow(parent)
- 5 {
- 6 /* 主窗体设置位置和显示的大小 */
- 7 this->setGeometry(0, 0, 800, 480);
- 8 this->setStyleSheet("QMainWindow {background-color: rgba(200, 50, 100, 100%);}");
- 9
- 10 /* 实例化对象 */
- 11 radioButton1 = new QRadioButton(this);
- 12 radioButton2 = new QRadioButton(this);
- 13
- 14 /* 设置两个QRadioButton的位置和显示大小 */
- 15 radioButton1->setGeometry(300, 200, 100, 50);
- 16 radioButton2->setGeometry(400, 200, 100, 50);
- 17
- 18 /* 设置两个QRadioButton的显示文本 */
- 19 radioButton1->setText("开关一");
- 20 radioButton2->setText("开关二");
- 21
- 22 /* 设置初始状态,radioButton1的Checked为false,另一个为true*/
- 23 radioButton1->setChecked(false);
- 24 radioButton2->setChecked(true);
- 25 }
- 26
- 27 MainWindow::~MainWindow()
- 28 {
- 29 }
复制代码 第23行和24行,设置QRadioButton对象的初始化状态,让它们互斥。 在源文件“main.cpp”具体代码如下。我们需要在main.cpp里加载qss文件。 - main.cpp编程后的代码
- 1 #include "mainwindow.h"
- 2
- 3 #include <QApplication>
- 4 /* 引入QFile */
- 5 #include <QFile>
- 6
- 7 int main(int argc, char *argv[])
- 8 {
- 9 QApplication a(argc, argv);
- 10 /* 指定文件 */
- 11 QFile file(":/style.qss");
- 12
- 13 /* 判断文件是否存在 */
- 14 if (file.exists() ) {
- 15 /* 以只读的方式打开 */
- 16 file.open(QFile::ReadOnly);
- 17 /* 以字符串的方式保存读出的结果 */
- 18 QString styleSheet = QLatin1String(file.readAll());
- 19 /* 设置全局样式 */
- 20 qApp->setStyleSheet(styleSheet);
- 21 /* 关闭文件 */
- 22 file.close();
- 23 }
- 24 MainWindow w;
- 25 w.show();
- 26 return a.exec();
- 27 }
复制代码 第11行至23行,读取style.qss的内容。并设置全局样式。 在源文件“style.qss”具体代码如下,与HTML里的css语法相似。如果不会写qss的内容,可以参考Qt帮助文档的内容,在里面搜索“qt style”。在里面找相关的例子参考,这里我们只是初步了解下这个qt style。 - style.qss编程后的代码
- 1 QRadioButton{
- 2 spacing: 2px;
- 3 color: white;
- 4 }
- 5 QRadioButton::indicator {
- 6 width: 45px;
- 7 height: 30px;
- 8 }
- 9 QRadioButton::indicator:unchecked {
- 10 image: url(:/images/switch_off.png);
- 11 }
- 12 QRadioButton::indicator:checked {
- 13 image: url(:/images/switch_on.png);
- 14 }
复制代码 在第10行和第13行,设置QRadioButton的indicator的背景图片。这样当它们点击切换时就会看到类似开关切换的效果了。
7.1.3.3 运行效果 编译程序运行的效果如下。点击关闭开关一,开关二即打开;点击开关二,开关一即打开。因为它们默认是互斥的效果。在某种情况下我们需要使用这种效果,比如我们在网上看视频时经常需要切换线路,线路可能有几种,但是只有一种是激活状态的,我们就可以应用到这个方向上。 在这个例子里我们学习到如何添加资源,步骤也详细,后面的例程都可参考这个例程来添加资源文件,不再详细讲解添加过程。我们已经初步了解了Qt的样式表文件,如果要做好看的界面Qt的样式表文件是少不了的。可能我们还不懂Qt样式表的语法,不知道如何下手。我们可以边学边了解,可以参考Qt帮助文档里的用法,qss的功能不止这么点。现在的重点是学习QRadioButton这个控件。
7.1.4 QCheckBox
7.1.4.1 控件简介 QCheckBox继承QAbstractButton。复选按钮(复选框)与RadioButton的区别是选择模式,单选按钮提供多选一,复选按钮提供多选多。
7.1.4.2 用法示例 例07_qcheckbox,三态选择框(难度:简单)。使用一个QCheckBox,用户通过点击可改变当选择框的状态。 在新建例程中不要勾选“Generate form”,默认继承QMainWindow类即可。项目新建完成如下图。编者已经添加了qss文件和三张资源图片。如果还不会添加qss文件和资源图片,请参考7.1.3小节。 在头文件“mainwindow.h”具体代码如下。 - mainwindow.h编程后的代码
- 1 #ifndef MAINWINDOW_H
- 2 #define MAINWINDOW_H
- 3
- 4 #include <QMainWindow>
- 5 /* 引入QCheckBox */
- 6 #include <QCheckBox>
- 7
- 8 class MainWindow : public QMainWindow
- 9 {
- 10 Q_OBJECT
- 11
- 12 public:
- 13 MainWindow(QWidget *parent = nullptr);
- 14 ~MainWindow();
- 15
- 16 private:
- 17 /* 声明一个QCheckBox对象 */
- 18 QCheckBox *checkBox;
- 19 private slots:
- 20 /* 声明QCheckBox的槽函数,并带参数传递,用这个参数接收信号的参数 */
- 21 void checkBoxStateChanged(int);
- 22
- 23 };
- 24 #endif // MAINWINDOW_H
复制代码 在第18和19行声明两个QCheckBox对象。 在源文件“mainwindow.cpp”具体代码如下。 - mainwindow.cpp编程后的代码
- 1 #include "mainwindow.h"
- 2
- 3 MainWindow::MainWindow(QWidget *parent)
- 4 : QMainWindow(parent)
- 5 {
- 6 /* 主窗体设置位置和显示的大小及背景颜色 */
- 7 this->setGeometry(0, 0, 800, 480);
- 8 this->setStyleSheet("QMainWindow {background-color: rgba(100, 100, 100, 100%);}");
- 9
- 10 /* 实例化对象 */
- 11 checkBox = new QCheckBox(this);
- 12
- 13 /* 设置QCheckBox位置和显示大小 */
- 14 checkBox->setGeometry(350, 200, 250, 50);
- 15
- 16 /* 初始化三态复选框的状态为Checked */
- 17 checkBox->setCheckState(Qt::Checked);
- 18
- 19 /* 设置显示的文本 */
- 20 checkBox->setText("初始化为Checked状态");
- 21
- 22 /* 开启三态模式,必须开启,否则只有两种状态,即Checked和Unchecked */
- 23 checkBox->setTristate();
- 24
- 25 /* 连接checkBox的信号stateChanged(int),与我们定义的槽checkBoxStateChanged(int)连接 */
- 26 connect(checkBox, SIGNAL(stateChanged(int)), this, SLOT(checkBoxStateChanged(int)));
- 27 }
- 28
- 29 MainWindow::~MainWindow()
- 30 {
- 31 }
- 32
- 33 /* 槽函数的实现 */
- 34 void MainWindow::checkBoxStateChanged(int state)
- 35 {
- 36 /* 判断checkBox的state状态,设置checkBox的文本 */
- 37 switch (state) {
- 38 case Qt::Checked:
- 39 /* 选中状态 */
- 40 checkBox->setText("Checked状态");
- 41 break;
- 42 case Qt::Unchecked:
- 43 /* 未选中状态 */
- 44 checkBox->setText("Unchecked状态");
- 45 break;
- 46 case Qt::PartiallyChecked:
- 47 /* 半选状态 */
- 48 checkBox->setText("PartiallyChecked状态");
- 49 break;
- 50 default:
- 51 break;
- 52 }
- 53 }
复制代码 第23行,需要注意的是设置QCheckBox对象checkBox需要设置为三态模式。 在源文件“main.cpp”具体代码如下。我们需要在main.cpp里加载qss文件。 - main.cpp编程后的代码
- 1 #include "mainwindow.h"
- 2
- 3 #include <QApplication>
- 4 /* 引入QFile */
- 5 #include <QFile>
- 6
- 7 int main(int argc, char *argv[])
- 8 {
- 9 QApplication a(argc, argv);
- 10 /* 指定文件 */
- 11 QFile file(":/style.qss");
- 12
- 13 /* 判断文件是否存在 */
- 14 if (file.exists() ) {
- 15 /* 以只读的方式打开 */
- 16 file.open(QFile::ReadOnly);
- 17 /* 以字符串的方式保存读出的结果 */
- 18 QString styleSheet = QLatin1String(file.readAll());
- 19 /* 设置全局样式 */
- 20 qApp->setStyleSheet(styleSheet);
- 21 /* 关闭文件 */
- 22 file.close();
- 23 }
- 24 MainWindow w;
- 25 w.show();
- 26 return a.exec();
- 27 }
复制代码 第11行至23行,读取style.qss的内容。并设置全局样式。 在源文件“style.qss”具体代码如下。 - style.qss编程后的代码
- 1 QCheckBox{
- 2 spacing: 5px;
- 3 color: white;
- 4 }
- 5 QCheckBox::indicator {
- 6 width: 50px;
- 7 height: 50px;
- 8 }
- 9 QCheckBox::indicator:enabled:unchecked {
- 10 image: url(:/images/unchecked.png);
- 11 }
- 12 QCheckBox::indicator:enabled:checked {
- 13 image: url(:/images/checked.png);
- 14 }
- 15 QCheckBox::indicator:enabled:indeterminate {
- 16 image: url(:/images/indeterminate.png);
- 17 }
复制代码
在第10行和第13行,设置QCheckBox的indicator的背景图片。这样当它们点击切换时就会看到QCheckBox的三种选择状态了。
7.1.4.3 运行效果 编译程序运行的效果如下,多次点击checkBox,即可看到QCheckBox的三种状态切换。 选中状态时。 半选状态。
未选中状态。
我们经常在软件安装时可以看到这种三态选择框,如果我们设计的程序有多种选择的项也可以设计这种选择框。
7.1.5 QCommandLinkButton
7.1.5.1 控件简介 QCommandLinkButton控件中文名是“命令链接按钮”。QCommandLinkButton继承QPushButton。CommandLinkButton控件和RadioButton相似,都是用于在互斥选项中选择一项。表面上同平面按钮一样,但是CommandLinkButton除带有正常的按钮上的文字描述文本外,默认情况下,它也将携带一个箭头图标,表明按下按钮将打开另一个窗口或页面。
7.1.5.2 示例用法
例08_qcommandlinkbutton链接窗口(难度:简单)。使用一个QCommandLinkButton,点击打开系统的窗口。 在新建例程中不要勾选“Generate form”,默认继承QMainWindow类即可。项目新建完成如下图。 在头文件“mainwindow.h”具体代码如下。 - mainwindow.h编程后的代码
- 1 #ifndef MAINWINDOW_H
- 2 #define MAINWINDOW_H
- 3
- 4 #include <QMainWindow>
- 5 /* 引入QCommandLinkButton */
- 6 #include <QCommandLinkButton>
- 7
- 8 class MainWindow : public QMainWindow
- 9 {
- 10 Q_OBJECT
- 11
- 12 public:
- 13 MainWindow(QWidget *parent = nullptr);
- 14 ~MainWindow();
- 15
- 16 private:
- 17 /* 声明一个QCommandLinkButton对象 */
- 18 QCommandLinkButton *commandLinkButton;
- 19
- 20 private slots:
- 21 /* 声明槽函数,用于点击commandLinkButton后触发 */
- 22 void commandLinkButtonClicked();
- 23
- 24
- 25 };
- 26 #endif // MAINWINDOW_H
复制代码 在第18行,声明一个QCommandLinkButton对象。 在源文件“mainwindow.cpp”具体代码如下。 - mainwindow.cpp编程后的代码
- 1 #include "mainwindow.h"
- 2 /* 引入桌面服务,用来打开系统文件夹对话框 */
- 3 #include <QDesktopServices>
- 4 /* 引入QUrl */
- 5 #include <QUrl>
- 6
- 7 MainWindow::MainWindow(QWidget *parent)
- 8 : QMainWindow(parent)
- 9 {
- 10 /* 主窗体设置位置和显示的大小 */
- 11 this->setGeometry(0, 0, 800, 480);
- 12
- 13 /* 实例化对象 */
- 14 commandLinkButton = new QCommandLinkButton(
- 15 "打开/home目录", "点击此将调用系统的窗口打开/home目录",this);
- 16
- 17 /* 设置QCommandLinkButton位置和显示大小 */
- 18 commandLinkButton->setGeometry(300, 200, 250, 60);
- 19
- 20 /* 信号槽连接 */
- 21 connect(commandLinkButton, SIGNAL(clicked()), this,
- 22 SLOT(commandLinkButtonClicked()));
- 23 }
- 24
- 25 MainWindow::~MainWindow()
- 26 {
- 27 }
- 28
- 29 void MainWindow::commandLinkButtonClicked()
- 30 {
- 31 /* 调用系统服务打开/home目录 */
- 32 QDesktopServices::openUrl(QUrl("file:////home/") );
- 33 }
复制代码 第14行,实例化时原型是QCommandLinkButton:CommandLinkButton(const QString &text, const QString &description, QWidget *parent = nullptr)。 在源文件“main.cpp”具体代码如下。由新建项目时生成,无改动。 - main.cpp编程后的代码
- 1 #include "mainwindow.h"
- 2
- 3 #include <QApplication>
- 4
- 5 int main(int argc, char *argv[])
- 6 {
- 7 QApplication a(argc, argv);
- 8 MainWindow w;
- 9 w.show();
- 10 return a.exec();
- 11 }
复制代码 7.1.5.3 运行效果 程序编译运行的结果如下。 点击中间的打开/home目录按钮,结果如下。系统弹出一个窗口,直接打开到/home目录。 点击打开/home目录后,系统将弹出/home目录路径窗口。
7.1.6 QDialogButtonBox 7.1.6.1件简介 控
对话框和消息框通常以符合该平台界面指导原则的布局呈现按钮。不同平台的对话框总是有不同的布局。QDialogButtonBox允许开发人员向其添加按钮,并将自动使用适合用户桌面环境的布局。也就是说我们可以使用系统的自带的对话框按钮,也可以自己定义对话框按钮。 QDialogButtonBox常用的按钮有如下几种,更多的可以参考Qt帮助文档。 button_Box = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel | QDialogButtonBox::Open | QDialogButtonBox::Save | QDialogButtonBox::Close | QDialogButtonBox:iscard | QDialogButtonBox::Apply | QDialogButtonBox::Reset | QDialogButtonBox::RestoreDefaults | QDialogButtonBox::Help | QDialogButtonBox::SaveAll);
7.1.6.2 用法示例 例09_qdialogbuttonbox, 自定义QDialogButtonBox里的按钮(难度:简单)。使用一个QDialogButtonBox,在QDialogButtonBox添加Qt提供的按钮,或者自定义按钮。 在新建例程中不要勾选“Generate form”,默认继承QMainWindow类即可。项目新建完成如下图。
在头文件“mainwindow.h”具体代码如下。 - mainwindow.h编程后的代码
- 1 #ifndef MAINWINDOW_H
- 2 #define MAINWINDOW_H
- 3
- 4 #include <QMainWindow>
- 5 /* 引入QDialogButtonBox */
- 6 #include <QDialogButtonBox>
- 7 /* 引入QPuhsButton */
- 8 #include <QPushButton>
- 9
- 10 class MainWindow : public QMainWindow
- 11 {
- 12 Q_OBJECT
- 13
- 14 public:
- 15 MainWindow(QWidget *parent = nullptr);
- 16 ~MainWindow();
- 17
- 18 private:
- 19 /* 声明一个QDialogButtonBox对象 */
- 20 QDialogButtonBox *dialogButtonBox;
- 21
- 22 /* 声明一个QPushButton对象 */
- 23 QPushButton *pushButton;
- 24
- 25 private slots:
- 26 /* 声明信号槽,带QAbstractButton *参数,用于判断点击了哪个按钮 */
- 27 void dialogButtonBoxClicked(QAbstractButton *);
- 28
- 29 };
- 30 #endif // MAINWINDOW_H
复制代码 第18行,声明一个QDialogButtonBox对象。 在源文件“mainwindow.cpp”具体代码如下。 - mainwindow.cpp编程后的代码
- 1 #include "mainwindow.h"
- 2 /* 引入QDebug */
- 3 #include <QDebug>
- 4
- 5 MainWindow::MainWindow(QWidget *parent)
- 6 : QMainWindow(parent)
- 7 {
- 8 /* 主窗体设置位置和显示的大小 */
- 9 this->setGeometry(0, 0, 800, 480);
- 10
- 11 /* 实例化并设置按钮的盒子的大小和位置 */
- 12 dialogButtonBox = new QDialogButtonBox(this);
- 13 dialogButtonBox->setGeometry(300, 200, 200, 30);
- 14
- 15 /*使用Qt的Cancel按钮*/
- 16 dialogButtonBox->addButton(QDialogButtonBox::Cancel);
- 17
- 18 /*将英文"Cancel"按钮设置为中文"取消" */
- 19 dialogButtonBox->button(QDialogButtonBox::Cancel)->setText("取消");
- 20
- 21 /* 设定位置与大小 */
- 22 pushButton = new QPushButton(tr("自定义"));
- 23
- 24 /* 将pushButton添加到dialogButtonBox,并设定ButtonRole为ActionRole */
- 25 dialogButtonBox->addButton(pushButton, QDialogButtonBox::ActionRole);
- 26
- 27 /* 信号槽连接,带参数QAbstractButton *,用于判断用户点击哪个按键 */
- 28 connect(dialogButtonBox, SIGNAL(clicked(QAbstractButton * )),
- 29 this, SLOT(dialogButtonBoxClicked(QAbstractButton *)));
- 30 }
- 31
- 32 MainWindow::~MainWindow()
- 33 {
- 34 }
- 35
- 36 void MainWindow::dialogButtonBoxClicked(QAbstractButton *button)
- 37 {
- 38 /* 判断点击的对象是否为QDialogButtonBox::Cancel */
- 39 if(button == dialogButtonBox->button(QDialogButtonBox::Cancel)) {
- 40 /* 打印“单击了取消键” */
- 41 qDebug() <<"单击了取消键"<<endl;
- 42 /* 判断点击的对象是否为pushButton */
- 43 }else if(button == pushButton) {
- 44 /* 打印“单击了自定义键” */
- 45 qDebug() <<"单击了自定义键"<<endl;
- 46 }
- 47 }
复制代码 第16行,实例化时原型是void QDialogButtonBox::addButton(QAbstractButton *button, QDialogButtonBox::ButtonRole role)。 第41和45行,我们第一次用qDebug()。Qt一般调试都是用qDebug()来打印的。这与C++的cout是功能基本一样。只是Qt自定义为qDebug()而已。 在源文件“main.cpp”具体代码如下。由新建项目时生成,无改动。 - main.cpp编程后的代码
- 1 #include "mainwindow.h"
- 2
- 3 #include <QApplication>
- 4
- 5 int main(int argc, char *argv[])
- 6 {
- 7 QApplication a(argc, argv);
- 8 MainWindow w;
- 9 w.show();
- 10 return a.exec();
- 11 }
复制代码 7.1.6.3 运行效果 程序编译运行的结果如下。点击自定义按钮和取消按钮,在应用程序输出窗口可以看到对应的点击事件。
|