小编个人主页详情<---请点击
小编个人gitee代码仓库<---请点击
Qt系列专栏<---请点击
倘若命中无此运,孤身亦可登昆仑,送给屏幕面前的读者朋友们和小编自己!
目录
前言
【Qt】Qt窗口(七)QColorDialog颜色对话框,QFileDialog文件对话框的使用------书接上文 详情请点击<------,本文会在上文的基础上进行讲解,所以对上文不了解的读者友友请点击前方的蓝字链接进行学习
本文由小编为大家介绍------【Qt】Qt窗口(八)QFontDialog字体对话框,QInputDialog输入对话框的使用,小结
一、QFontDialog
基于QFontDialog让用户选择字体属性,实现修改按钮显示文本的字体属性
- QFontDialog用于弹出一个字体对话框,用户在字体对话框上可以选择字体的各个属性,所以我们想要实现一个基于QFontDialog字体对话框,让用户选择字体的各个属性,将用户选择的字体设置到按钮显示的文本上,所以接下来我们创建一个项目名为QFontDialog,基类为QMainWindow,派生类为MainWindow的项目,接下来我们点击ui文件,进入Qt Designer

- 所以此时我们拖拽左侧红框内的按钮控件,然后调整成上图界面即可,objectName保持不变,接下来我们右击按钮,然后点击转到槽,接下来我们选择clicked信号,让Qt帮我们生成对应槽函数的声明和定义
cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFontDialog>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
bool ok = false;
QFont font = QFontDialog::getFont(&ok);
qDebug() << "ok = " << ok;
qDebug() << font << '\n';
}
- 对于QFontDialog字体对话框的使用,我们同样使用QFontDialog提供的静态成员方法getFont,getFont调用后,会创建QFontDialog字体对话框对象,并且设置字体对话框对象的属性,以模态的方式显示QFontDialog字体对话框对象,但是这里的静态成员方法getFont和我们之前使用的有点不一样,所以小编来查阅一下官方文档

- 这里我们主要关注getFont的第一个参数,第一个参数是bool*类型的指针ok,参数中是指针类型的,那么大概率就是输出型参数,也就是当初传入的参数ok要被外部拿到,那么这个ok的含义也就是如上的英文含义中介绍的那样,如果用户点击了ok按钮,那么第一个参数ok就被设置为true,如果用户没有点击ok按钮,而是点击了cancel取消按钮,那么第一个参数ok就被设置为false
- 所以此时我们就可以通过getFont的第一个参数判断用户是否选择了字体,进而完成对应功能的设置,所以此时我们定义一个bool类型的变量ok,然后取地址传参给getFont即可,对于getFont剩下的参数都有缺省参数,我们不关注,也不进行传参了,使用默认的缺省值即可
- getFont的返回值是一个QFont对象,QFont也就是Qt对字体属性的封装,所以我们使用QFont对象接收getFont的返回值即可,接下来我们对使用qDebug()对ok和字体属性进行打印即可
运行结果如下
所以此时我们点击MainWindow主窗口上的按钮,此时就弹出一个字体对话框,在字体对话框上有关于字体的各个属性,所以此时我们进行选择后点击ok,那么此时就打印了ok为true,代表用户点击了ok,接下来就是QFont字体属性的打印
同样的,我们继续点击MainWindow主窗口上的按钮,此时弹出一个字体对话框,此时我们不进行任何选择直接点击cancel取消按钮,那么此时就打印了ok为false,代表用户点击了cancel取消按钮,所以接下来对于字体属性QFont的打印就没有了实际作用,因为用户此时点击的是cancel取消按钮,代表用户想要取消这些对于字体属性QFont的设置
小编,你光打印这个字体属性,我也不认识这些都是什么含义呀,我只认识第一个微软雅黑是字体家族,第二个是字体字号,所以我们如何得到我们想要的字体属性呢?

- 如上就是字体对话框,也就是用户可以选择的字体属性 关于字体属性font,在第三点QWidget的font属性中进行的讲解,详情请点击<------
cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFontDialog>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
bool ok = false;
QFont font = QFontDialog::getFont(&ok);
qDebug() << "ok = " << ok;
// qDebug() << font << '\n';
if(ok == true)
{
qDebug() << "字体家族, family: " << font.family();
qDebug() << "字体大小, pointSize: " << font.pointSize();
qDebug() << "字体是否加粗, bold: " << font.bold();
qDebug() << "字体是否倾斜, italic: " << font.italic();
qDebug() << "字体是否有删除线, strikeOut: " << font.strikeOut();
qDebug() << "字体是否有下划线, underline: " << font.underline() << '\n';
}
}
- 所以针对Qt封装的QFont,如上,我们可以直接访问内部的成员变量来获取我们想要得知的属性,由于用户点击cancel的时候,此时返回的ok为false,代表用户此时不想设置字体属性,所以此时我们不进行打印,只有当用户点击ok,也就是ok为true的时候,我们才打印用户选择字体属性
运行结果如下
- 所以此时我们点击MainWindow主窗口上的按钮,此时就弹出一个字体对话框,所以此时我们直接点击取消,代表用户取消设置字体属性,所以此时关于字体属性并不会进行打印
- 同样的,我们点击MainWindow主窗口上的按钮,此时就弹出一个字体对话框,进行选择字体的各个属性之后点击ok,那么此时就打印了ok为true,代表用户点击了ok,代表此时用户想进行字体属性的设置,所以就打印QFont字体属性
cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFontDialog>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
bool ok = false;
QFont font = QFontDialog::getFont(&ok);
qDebug() << "ok = " << ok;
// qDebug() << font << '\n';
if(ok == true)
{
qDebug() << "字体家族, family: " << font.family();
qDebug() << "字体大小, pointSize: " << font.pointSize();
qDebug() << "字体是否加粗, bold: " << font.bold();
qDebug() << "字体是否倾斜, italic: " << font.italic();
qDebug() << "字体是否有删除线, strikeOut: " << font.strikeOut();
qDebug() << "字体是否有下划线, underline: " << font.underline() << '\n';
ui->pushButton->setFont(font);
}
}
- 用户点击MainWindow主窗口上的按钮,此时就弹出一个字体对话框,那么我们想要实现的是当用户在字体对话框选择了字体属性之后,将这个字体属性设置到MainWindow主窗口上的按钮显示的文本上,所以如果用户点击了ok,此时我们直接使用setFont将用户选择属性设置到按钮显示的文本上即可,同样的这里还有另外一层意思,如果用户没有选择字体属性,选择了cancel取消按钮,那么此时我们就不应该设置按钮显示的文本的字体属性
运行结果如下
- 我们点击MainWindow主窗口上的按钮,此时就弹出一个字体对话框,进行选择字体的各个属性之后点击ok,那么此时就打印了ok为true,代表用户点击了ok,代表此时用户想进行字体属性的设置,此时用户选择的字体属性就设置到MainWindow主窗口的按钮显示的文本上了
- 所以此时我们点击MainWindow主窗口上的按钮,此时就弹出一个字体对话框,所以此时我们直接点击取消,代表用户取消设置字体属性,所以此时就不会将字体属性就设置到MainWindow主窗口的按钮显示的文本上了
二、QInputDialog
基于QInputDialog实现让用户输入整数,浮点数,字符串
- QInputDialog输入对话框,可以让用户输入一个具体的数据,这个数据可以是整数,可以是浮点数,可以是字符串,这里的整数和浮点数的输入类似于微调框,这里的字符串的输入类似于下拉框,这里涉及的字符串在Qt的QInputDialog中我们可以称之为条目,所以接下来我们创建一个项目名为QInputDialog,基类为QMainWindow,派生类为MainWindow的项目,接下来我们点击ui文件,进入Qt Designer

- 所以此时我们拖拽左侧红框内的按钮控件,然后调整成上图界面即可,objectName保持不变,接下来我们右击三个按钮,然后点击转到槽,接下来我们选择clicked信号,让Qt帮我们生成对应槽函数的声明和定义
cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QInputDialog>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
int result = QInputDialog::getInt(this, "整数输入对话框", "请输入一个整数:");
qDebug() << result;
}
void MainWindow::on_pushButton_2_clicked()
{
double result = QInputDialog::getDouble(this, "浮点数输入对话框", "请输入一个浮点数:");
qDebug() << result;
}
void MainWindow::on_pushButton_3_clicked()
{
}

- 在QInputDialog中,如果要输入整数,那么需要使用到QInputDialog提供的静态成员函数getInt,当调用了getInt之后,此时会自动创建专门用于输入整数的QInputDialog输入对话框对象,然后设置好QInputDialog输入对话框对象的属性,并且以模态的方式显示输入对话框对象
- 对于getInt的参数,这里的第一个参数我们传入MainWindow主窗口对应的this指针,将输入对话框对象挂接到对象树中,对于第二个参数我们传入输入对话框的窗口标题,这里我们设置为整数输入对话框即可,接下来对于第三个参数我们需要传入输入对话框显示的文本,告诉用户这里应该输入什么类型的数据,所以这里我们设置为请输入一个整数:即可,对于getItem的返回值就是用户输入的整数,所以我们使用int类型的整数接收getInt的返回值,接下来使用qDebug()将接收的用户输入的整数打印即可

- 在QInputDialog中,如果要输入浮点数,那么需要使用到QInputDialog提供的静态成员函数getDouble,当调用了getDouble之后,此时会自动创建专门用于输入浮点数的QInputDialog输入对话框对象,然后设置好QInputDialog输入对话框对象的属性,并且以模态的方式显示输入对话框对象
- 对于getDouble的参数,这里的第一个参数我们传入MainWindow主窗口对应的this指针,将输入对话框对象挂接到对象树中,对于第二个参数我们传入输入对话框的窗口标题,这里我们设置为浮点数输入对话框即可,接下来对于第三个参数我们需要传入输入对话框显示的文本,告诉用户这里应该输入什么类型的数据,所以这里我们设置为请输入一个浮点数:即可,对于getDouble的返回值就是用户输入的浮点数,所以我们使用double类型的浮点数接收getDouble的返回值,接下来使用qDebug()将接收的用户输入的浮点数打印即可
运行结果如下
- 此时我们点击MainWindow窗口上的按钮,弹出一个整数输入对话框,此时小编可以输入整数,也可以使用右侧的微调框通过调整整数的方式输入整数,在输入之后整数正常被打印,同理浮点数输入对话框也是这样,无误
cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QInputDialog>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
int result = QInputDialog::getInt(this, "整数输入对话框", "请输入一个整数:");
qDebug() << result;
}
void MainWindow::on_pushButton_2_clicked()
{
double result = QInputDialog::getDouble(this, "浮点数输入对话框", "请输入一个浮点数:");
qDebug() << result;
}
void MainWindow::on_pushButton_3_clicked()
{
QStringList items;
items.push_back("aaa");
items.push_back("bbb");
items.push_back("ccc");
items.push_back("ddd");
items.push_back("eee");
QString item = QInputDialog::getItem(this, "条目输入对话框", "请输入一个条目:", items);
qDebug() << item;
}

- 在QInputDialog中,如果要输入字符串,也就是条目item,那么需要使用到QInputDialog提供的静态成员函数getItem,当调用了getItem之后,此时会自动创建专门用于输入条目的QInputDialog输入对话框对象,然后设置好QInputDialog输入对话框对象的属性,并且以模态的方式显示输入对话框对象
- 对于getItem的参数,这里的第一个参数我们传入MainWindow主窗口对应的this指针,将输入对话框对象挂接到对象树中,对于第二个参数我们传入输入对话框的窗口标题,这里我们设置为条目输入对话框即可,接下来对于第三个参数我们需要传入输入对话框显示的文本,告诉用户这里应该输入什么类型的数据,所以这里我们设置为请输入一个条目:即可
- 这里关键的是getItem的第四个参数,我们仔细看,是一个QStringList类型的,我们将其理解为字符串数组,也就类似于QList<QString>,其实本质上类似于C++中list和vector的集合,也就是一个deque双端队列 关于双端队列deque,在第五点deque的简单介绍中进行讲解,详情请点击<------,所以此时我们创建QStringList,然后使用push_back向QStringList对象中尾插添加条目即可,接下来将QStringList对象作为第四个参数传参给getItem即可
- 对于getItem的返回值是一个QString类型的,也就是用户在这个下拉框中选择了什么条目,同样的用户也可以不从下拉框中选择条目,而是手动输入自己想要输入的条目,所以此时我们使用QString对象接收getItem的返回值,接下来使用qDebug()将用户选择或者输入的条目进行打印即可
运行结果如下
- 此时我们点击MainWindow窗口上的按钮,弹出一个条目输入对话框,此时小编可以点击右侧的条目下拉框选择条目,同样也可以自己手动输入我们想要输入的条目,此时点击确定,条目正常被打印,没有问题
三、Qt窗口小结
- 到现在,我们已经学习完了Qt窗口,此时利用我们所学的信号槽,控件,以及Qt窗口等知识已经可以做出一个相对完善的Qt窗口程序了,关于一个Qt窗口程序主要可以有以下几个部分
(1)菜单栏(QMenuBar),菜单栏只能有一个,菜单栏中可以放菜单(QMenu),菜单中可以放菜单项(QAction)
(2)工具栏(QToolBar),工具栏可以有多个,工具栏中放菜单栏(QAction)
(3)子窗口(QDockWidget),子窗口中只能放置一个控件,如果我们想要给子窗口中放置多个控件,那么就需要先给子窗口中放一个QWidget窗口,然后再在QWidget窗口中放入多个控件
(4)状态栏(QStatusBar),在状态栏中可以放置多个控件,例如QLabel,按钮,进度条等用于显示状态信息
(5)对话框(QDialog),在Qt中我们可以通过QDialog这种弹出一个对话框的方式和用户进行交互,针对QDialog,Qt提供了基于QDialog作为基类进行继承的五个派生类对话框,如下
......(1)QMessageBox,消息对话框
......(2)QFileDialog,文件对话框
......(3)QColorDialog,颜色对话框
......(4)QFontDialog,字体对话框
......(5)QInputDialog,输入对话框 - 而我们之前学习的QWidget更像QMainWindow主窗口中的一个子窗口,QMainWindow主窗口中可以嵌套多个QWidget子窗口,通过我们之前学习信号槽,QWidget下多种控件的使用,以及我们学习的Qt窗口,此时我们就可以实现一个更完整的应用程序了
总结
以上就是今天的博客内容啦,希望对读者朋友们有帮助
水滴石穿,坚持就是胜利,读者朋友们可以点个关注
点赞收藏加关注,找到小编不迷路!






