目录
(一) 对话框介绍
我们有的时候打开某些网站,不经意间可能就会弹出各种奇奇怪怪的窗口,这个就可以叫做“对话框”,对话框往往在用户与用户之间进行“短平快” 的操作。
对话框是GUI程序中不可或缺的组成部分。⼀些不适合在主窗⼝实现的功能组件可以设置在对话框 中。对话框通常是⼀个顶层窗口,出现在程序最上层,⽤于实现短期任务或者简洁的用户交互。
Qt常用的内置对话框有:
- QMessageBox(消息框)
- QColorDialog(颜色对话框)
- QFontDialog (字体对话框)
- QInputDialog(输入对话框)
- QFiledialog(文件对话框)
(二)对话框的分类
对话框主要可以分为模态对话框和⾮模态对话框 。
2.1 模态对话框
模态对话框指的是:显示后无法与父窗口进行交互,是⼀种阻塞式的对话框。使用QDialog::exec()函数调用。
模态对话框适用于必须依赖用户选择的场合,⽐如消息显示,文件选择,打印设置等。
示例:
- 1、新建Qt项⽬,在ui⽂件中的菜单栏中设置两个菜单:"文件"和"编辑",在菜单"文件"下新建菜单项:"创建"并将菜单项"新建"置于工具栏中;如下图示:
- 2、在mainwindow.cpp⽂件中实现:当点击"新建"时,弹出⼀个模态对话框(在菜单项中,点击菜单项时就会触发triggered()信号);
2.2 非模态对话框
非模态对话框显示后独立存在,可以同时与父窗口进行交互,是⼀种非阻塞式对话框,使用QDialog::show()函数调用。
- ⾮模态对话框⼀般在堆上创建,这是因为如果创建在栈上时,弹出的⾮模态对话框就会⼀闪⽽过。
⾮模态对话框适用于特殊功能设置的场合,⽐如查找操作,属性设置等。
示例:
QDialog *dialog = new QDialog();
//设置 大小
dialog->resize(700,500);
//设置标题
dialog->setWindowTitle("this is a dialog");
//关闭窗口的时候触发delete操作
dialog->setAttribute(Qt::WA_DeleteOnClose);
dialog->show();
【说明】
- QDialog其实也是QWidget的子类,QWidget 的各种属性方法,在QDialog也同样适用。
- 同时还需要设置Qt:WA_DeleteOnClose属性,⽬的是:当创建多个⾮模态对话框时(如打开了多个非模态对话框),为了避免内存泄漏要设置此属性。
2.3 混合属性对话框
混合属性对话框同时具有模态对话框和非模态对话框的属性,对话框的生成和销毁具有非模态对话框属性,功能上具有模态对话框的属性。
使用QDialog::setModal()函数可以创建混合特性的对话框。通常,创建对话框时需要指定对话框的父组件。
示例:
(三)内置对话框
Qt提供了多种可复复用的对话框类型,即Qt标准对话框。Qt标准对话框全部继承于QDialog类。常用标准对话框如下:
消息对话框 QMessageBox
消息对话框是引用程序最常用的界面元素,消息对话框主要用于为用户提示重要消息,强制用户进行选择操作。其次QMessageBox是预定义的对话框,不需要手动创建布局和控件,非常适合用于显示简单的消息和接收用户的简单输入。
QMessageBox 提供了多种静态方法来快速显示不同类型的消息框:
- information:显示一个信息消息框
QMessageBox::information(
QWidget *parent,
const QString &title,
const QString &text
)
接下来,我们简单通过代码实现一下:
QMessageBox* MessageBox = new QMessageBox(this);
MessageBox->setWindowTitle("对话框窗口标题!");
MessageBox->setText("这是对话框文本");
MessageBox->setIcon(QMessageBox::Information); //显示信息消息框
MessageBox->setStandardButtons(QMessageBox::Ok | QMessageBox::Save |
QMessageBox::Cancel);
//非模态对话框
MessageBox->show();
//模态对话框
//弹出对话框,当对话框处于弹出状态时,代码就会在exec这里阻塞,一直到对话框关闭
MessageBox->exec();
//delete MessageBox
MessageBox->setAttribute(Qt::WA_DeleteOnClose);
输出展示:
虽然QMessageBox
提供了许多预定义的选项,但你也可以自定义消息框的外观和行为。就接着上述代码,我们进行判断:
int res = MessageBox->exec();
if(res == QMessageBox::Ok){
qDebug() << "ok";
}else if(res == QMessageBox::Save){
qDebug() << "Save";
}else if(res == QMessageBox::Cancel){
qDebug() << "Cancel";
}
当然,除了上述手动代码实现之外,我们还可以通过Qt中给出的静态方法进行实现。具体如下:
int resutlt = QMessageBox::information(this,"对话框标题","对话框文本",QMessageBox::Ok |
QMessageBox::Cancel);
if(resutlt == QMessageBox::Ok){
qDebug() <<"ok";
}else if(resutlt == QMessageBox::Cancel){
qDebug() <<"cancle";
}
其中可以设置的按钮的类型如下:
以下代码跟上述类似,就不在展开。
- warning :显示一个警告消息框
QMessageBox::warning(
QWidget *parent,
const QString &title,
const QString &text
)
- critical :显示一个严重错误消息框
QMessageBox::critical(
QWidget *parent,
const QString &title,
const QString &text
)
- question :显示一个问题消息框,允许用户做出选择
QMessageBox::question(
QWidget *parent,
const QString &title,
const QString &text,
QMessageBox::StandardButtons buttons = NoButton,
QMessageBox::StandardButton defaultButton = NoButton
)
颜色对话框 QColorDialog
在Qt中,颜色对话框是通过QColorDialog 类实现的,它允许用户选择颜色。QColorDialog提供了一个标准的界面,让用户可以浏览和选择颜色。它是一个模态对话框,意味着它会阻塞其父窗口直到用户做出选择或取消对话框。
颜⾊对话框如下图示:
根据我们上述的理解,我们可能会在此处写出下列代码:
QColorDialog* color = new QColorDialog();
color->exec();
delete color;
但是在QColorDialog中提供了自己的方法。具体如下:
//打开颜⾊选择对话框,并返回⼀个QColor对象
QColorgetColor(
const QColor &initial = Qt::white,
QWidget *parent = nullptr,
const QString &title = QString(),
QColorDialog::ColorDialogOptions options = ColorDialogOptions()
)
参数说明:
initial:设置默认颜⾊
parent:设置⽗对象
title:设置对话框标题
options:设置选项
示例如下:
//函数的返回值就是用户选择的颜色
QColor color = QColorDialog::getColor(QColor(255,0,0),this,"选择颜色");
qDebug() << color;
输出展示:
其次,我们还可以基于用户选择设置窗口颜色:
//可以基于用户选择的颜色,修改窗口色
//方法一
QString style = "background-color: rgb(" + QString::number(color.red()) + ", "
+ QString::number(color.green()) + ", "
+ QString::number(color.blue()) + ");";
this->setStyleSheet(style);
//方法二
char buffer[1024] = {0};
sprintf(buffer,"backgroundcolor:rgb(%d,%d,%d);",
color.red(),color.green(),color.blue());
this->setStyleSheet(buffer);
字体对话框 QFontDialog
在Qt中,QFontDialog类用于显示一个字体选择对话框,允许用户选择字体的样式、大小、粗细等属性。其次这个对话框是模态的,提供了一个简单而强大的方式来让用户选择字体,适用于需要字体选择功能的应用程序。
示例:
bool flag = false;
QFont font = QFontDialog::getFont(&flag);
//qDebug() << font;
qDebug() << "ok = " << flag;
qDebug() <<"字体" <<font.family();
qDebug() << "获取字号" <<font.pointSize();
qDebug() << "是否倾斜" <<font.italic();
qDebug() << "是否加粗" << font.bold();
//把对话框文件字体进行设置
ui->pushButton->setFont(font);
运行效果如下:
输入对话框 QInputDialog
在Qt中,QInputDialog 是一个用于提供简单输入的对话框类,它允许用户输入文本、数字或选择列表中的一个选项。这个对话框是模态的,提供了快速而简单的方式来获取用户输入,适用于不需要复杂输入界面的场景。
常用方法介绍:
- 1、双精度浮点型输入数据对话框
double getDouble(QWidget *parent,
const QString &title,
const QString &label,
double value=0,
double min=-2147483647,
double max=2147483647,
int decimals=1,
bool *ok=nullptr,
Qt::WindowFlags flags=Qt::WindowFlags()
);
- 2、整型输入数据对话框
int getInt(QWidget *parent,
const QString &title,
const QString &label,
int value=0,
int min=-2147483647,
int max=2147483647,
int step=1,
bool* ok=nullptr,
Qt::WindowFlags
flags=Qt::WindowFlags()
);
- 3、选择条目型输入数据框
QString getItem(QWidget *parent,
const QString &title,
const QString &label,
const QStringList &items,
int current=0,
bool editable=true,
bool *ok=nullptr,
Qt::WindowFlags flags=Qt::WindowFlags(),
Qt::InputMethodHints inputMethodHints=Qt::ImhNone
);
参数说明:
parent:⽗亲
title:对话框标题
label:对话框标签
items:可供选择的条⽬
示例:
void MainWindow::on_pushButton_clicked()
{
//打印整数
int res = QInputDialog::getInt(this,"整数输入对话框","请输入一个整数:");
qDebug() << res;
}
void MainWindow::on_pushButton_2_clicked()
{
//打印浮点数
float res = QInputDialog::getDouble(this,"整数输入对话框","请输入一个浮点数:");
qDebug() << res;
}
void MainWindow::on_pushButton_3_clicked()
{
//打印条目
QStringList item;
item.push_back("111");
item.push_back("222");
item.push_back("333");
item.push_back("444");
QString body = QInputDialog::getItem(this,"条目输入对话框","请输入条目",item);
qDebug() << body;
}
运行效果如下:
文件对话框 QFiledialog
在Qt中,QFiledialog是一个用于打开和保存文件的对话框类。它提供了一个标准的界面,让用户可以浏览文件系统、选择文件或目录,并执行打开或保存操作,其次QFiledialog也是模态的。
常用方法介绍:
- 1、打开文件(⼀次只能打开⼀个文件)
QString getOpenFileName(
QWidget* parent = nullptr,
const QString &caption = QString(),
constQString &dir = QString(),
constQString &filter= QString(),
QString*selectedFilter = nullptr,
QFileDialog::Optionsoptions = Options()
)
示例1:打开文件
QString file = QFileDialog::getOpenFileName(
this, //父亲
"文件", //文件对话框标题
"D:\\c++ Learning\\qt\\code\\Qt window\\QFileDialog\\untitled",//打开路径
"*.cpp" //打开文件格式
);
qDebug() << file;
运行效果如下:
- 2、打开多个文件(⼀次可以打开多个文件)
QStringList getOpenFileNames(
QWidget *parent=nullptr,
const QString &caption=QString(),
const QString &dir=QString(),
const QString &filter=QString(),
QString *selectedFilter=nullptr,
QFileDialog::Optionsoptions=Options()
)
- 3、保存文件
QString getSaveFileName(
QWidget*parent=nullptr,
constQString &caption=QString(),
const QString &dir=QString(),
const QString &filter=QString(),
QString *selectedFilter=nullptr,
QFileDialog::Options options=Options()
)
参数说明:
参数1:parent ⽗亲
参数2:caption 对话框标题
参数3:dir 默认打开的路径
参数4:filter ⽂件过滤器
总结
在Qt中,对话框是用于与用户进行交互的特殊窗口,通常用于输入数据、显示信息或进行设置。对话框可以是模态的也可以是非模态的。
主要特点:
1.模态对话框(Modal Dialogs):
- 阻塞父窗口,直到对话框关闭。
- 通常用于需要用户立即响应的情况,如确认操作、输入数据等。
- 在Qt中,可以使用Dialogs类创建模态对话框。
2.非模态对话框(Non-modal Dialogs):
- 不阻塞父窗口,用户可以同时与父窗口和其他非模态对话框交互。
- 适用于不需要立即响应的辅助窗口,如状态显示、日志查看等。
创建对话框:
- 继承
QDialog
类:创建自定义对话框时,通常需要继承QDialog
类,并在其中定义所需的界面元素和逻辑。 - 使用预定义对话框:Qt提供了一系列预定义的对话框类,如
QFileDialog
(文件选择)、QColorDialog
(颜色选择)、QMessageBox
(消息提示)等,可以直接使用这些类来实现常见的对话框功能。