【Qt开发】对话框
目录
1,对话框的介绍
2,Qt内置对话框
2-1,消息对话框QMessageBox
2-2,颜色对话框QColorDialog
2-3,文件对话框QFileDialog
2-4,字体对话框QFontDialog
2-5,输入对话框QInputDialog
1,对话框的介绍
QDialog表示一个对话框结构。对话框是用于与用户进行短暂交互的小型窗口,进而实现短期与用户交互。Qt 常用的内置对话框有:QFiledialog(文件对话框)、QColorDialog(颜色对话框)、QFontDialog(字体对话框)、QInputDialog(输入对话框)和 QMessageBox(消息框)。除了内置对话框外,还可以通过继承 QDialog 类并添加所需的控件来创建自己的对话框以满足特定的需求。
对话框分为 模态对话框 和 非模态对话框。
模态对话框:当模态对话框打开时,用户必须先与该对话框交互完才能返回到主窗口,它是⼀种阻塞式的对话框。模态对话框通过调用 QDialog::exec() 方法来实现。
非模态对话框:允许用户在不关闭对话框的情况下继续与主窗口交互。非模态对话框通过调用 QDialog::show() 方法来实现。
下面来模拟实现自定义对话框。首先,需要新建C++ class文件,且继承 QDialog。
// 创建自定义对话框(新建C++文件,继承QDialog)
myQDialog::myQDialog(QWidget* parent) : QDialog(parent) // 重新设定构造函数是为了使用对象树功能
{
// 创建控件,加入到对话框中
QLabel* label = new QLabel("此处对话框", this);
}
// 点击一个按钮,出现一个对话框
void MainWindow::on_pushButton_clicked()
{
// 创建对话框,并设置其属性
myQDialog* dialog = new myQDialog(this);
dialog->setWindowTitle("我名对话框");
dialog->resize(400, 400);
// show()方法显示非模态对话框
// dialog->exec()方法展示模态对话框。弹出的时候代码会在exec这里阻塞,直到对话框关闭
dialog->show();
// 注意:防止用户多次点击,导致创建多个一样的对话框,这里还要把delete和关闭按钮的点击信号关联起来
// setAttribute是Qt中用于给控件或窗口设置属性的方法
// Qt::WA_DeleteOnClose属性的作用是当这个窗口关闭时,自动删除该对象所占用的内存
dialog->setAttribute(Qt::WA_DeleteOnClose);
}
当然,这里还可以通过图形化界面创建。图形化界面创建需要创建一个新的ui文件出来。
2,Qt内置对话框
Qt 提供了多种可复用的对话框类型,即 Qt标准对话框。Qt 标准对话框全部继承于 QDialog类。常用标准对话框如下:
2-1,消息对话框QMessageBox
消息对话框主要用于为用户提示重要信息,强制用户进行选择操作。其中,消息对话框更是可以创建不同风格的对话框形式。
// 创建警告消息图标的消息对话框
void MainWindow::on_pushButton_clicked()
{
QMessageBox* messageBox = new QMessageBox(this);
messageBox->setWindowTitle("我名消息对话框");
messageBox->setText("警告消息图标");
// 添加图标。QMessageBox内置了不同消息类型的图标
messageBox->setIcon(QMessageBox::Warning);
// 添加按钮。QMessageBox内置了自己独特的按钮
messageBox->setStandardButtons(QMessageBox::Ok | QMessageBox::Save | QMessageBox::Cancel);
// 自定义设置按钮。第二个参数是指定按钮的行为或语义
//QPushButton* button = new QPushButton("按钮", messageBox);
//messageBox->addButton(button, QMessageBox::AcceptRole);
// 显示模态消息对话框。QMessageBox使用的场景更多是模态的
// 当模态对话框关闭时exec函数返回,返回值是内置枚举按钮的数值,即用户点击了哪一个按钮
int result = messageBox->exec();
if (result == QMessageBox::Ok) {
qDebug() << "Ok";
} else if (result == QMessageBox::Save) {
qDebug() << "Save";
} else if (result == QMessageBox::Cancel) {
qDebug() << "Cancel";
}
messageBox->setAttribute(Qt::WA_DeleteOnClose);
}
这里说明一下 QMessageBox 内置独特的按钮。 QMessageBox 内置按钮有如下:
除了上面创建消息对话框的形式外,这里还可以使用静态函数快速创建。
// 静态函数快速创建不同图标信息类型的对话框
void MainWindow::on_pushButton_clicked()
{
// QMessageBox::warning是Qt提供的一个静态方法,用于快速显示一个带有“警告”图标的消息框
QMessageBox::warning(this, "对话框标题", "对话框文本", QMessageBox::Cancel);
// “错误”图标消息框。用于致命错误或严重问题
// QMessageBox::critical(this, "对话框标题", "对话框文本", QMessageBox::Cancel);
// “问号”图标。用于询问用户选择
// QMessageBox::question(this, "对话框标题", "对话框文本",QMessageBox::Cancel);
// “信息”图标。用于一般提示信息
//QMessageBox::information(this,"对话框标题","对话框本",QMessageBox::Cancel);
}
2-2,颜色对话框QColorDialog
颜色对话框的功能是允许用户选择颜色。继承自 QDialog类。颜色对话框如下图示:
常法方法如下:
1、QColorDialog(QWidget* parent = nullptr) //创建对象的同时设置父对象
2、QColorDialog(const QColor &initial, QWidget* parent = nullptr) //创建对象的同时通过QColor 对象设置默认颜色和父对象
3、void setCurrentColor(const QColor &color) //设置当前颜⾊对话框
4、QColor currentColor() const //获取当前颜⾊对话框
5、QColor getColor(const QColor &initial = Qt::white, QWidget *parent = nullptr, const QString &title = QString(), QColorDialog::ColorDialogOptions options = ColorDialogOptions()) //打开颜⾊ 选择对话框,并返回⼀个QColor对象
6、void open(QObject* receiver, const char* member) //打开颜⾊对话框
参数说明:
initial:设置默认颜色
parent:设置父对象
title:设置对话框标题
options:设置选项
代码示例如下:
// 创建颜色对话框
void MainWindow::on_pushButton_clicked()
{
// 使用静态函数QColorDialog::getColor快速创建颜色对话框
QColor color = QColorDialog::getColor(QColor(0,0,255), this, "选择颜色");
qDebug() << color;
// 基于用户选择的颜色,修改窗口的背景颜色。可以通过QSS的方式来设置
// 方法一:通过Qt内置的QString来拼接
/*QString style = "background-color: rgb(" + QString::number(color.red())
+ ", " + QString::number(color.green())
+ ", " + QString::number(color.blue()) + ")";*/
// 方法二:使用C++字符数组
char style[1024] = { 0 };
sprintf(style, "background-color:rgb(%d, %d, %d)", color.red(), color.green(), color.blue());
this->setStyleSheet(style);
}
2-3,文件对话框QFileDialog
文件对话框用于应用程序中需要打开⼀个外部文件或需要将当前内容存储到指定的外部文件。常用方法如下:
1、打开⽂件(⼀次只能打开⼀个⽂件)
QString getOpenFileName(QWidget* parent=nullptr, const QString &caption=QString(), const QString &dir=QString(), const QString &filter=QString(), QString* selectedFilter=nullptr, QFileDialog::Options options=Options())
2、打开多个⽂件(⼀次可以打开多个⽂件)
QStringList getOpenFileNames(QWidget *parent=nullptr, const QString &caption = QString(), const QString &dir = QString(), const QString &filter=QString(), QString *selectedFilter=nullptr, QFileDialog::Options options=Options())
3、保存文件
QString getSaveFileName(QWidget* parent=nullptr, const QString &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 文件过滤器
打开文件代码示例如下:
保存文件代码示例如下:
当然,这里还可以使用内置的静态函数快速创建。
// 创建⽂件对话框QFileDialog
// 打开文件
void MainWindow::on_pushButton_clicked()
{
QString filePath = QFileDialog::getOpenFileName(this);
qDebug() << filePath;
}
// 保存文件
void MainWindow::on_pushButton_2_clicked()
{
QString filePath = QFileDialog::getSaveFileName(this);
qDebug() << filePath;
}
2-4,字体对话框QFontDialog
字体对话框类 QFontDialog 用于提供选择字体的对话框部件。
代码示例一:
代码示例二:
// 创建字体对话框QFontDialog,将按钮设置为专门的字体
void MainWindow::on_pushButton_clicked()
{
// 参数ok表示如果用户点击了“确定”,则
ok
被设为true
;如果点击“取消”或关闭窗口,则为false
bool ok = false;
QFont font = QFontDialog::getFont(&ok);
qDebug() << "ok = " << ok;
qDebug() << font;
ui->pushButton->setFont(font);
}
2-5,输入对话框QInputDialog
输入对话框类QInputDialog 用于进行临时数据输入的场合。这里有双精度浮点型输入数据对话框getDouble、整型输⼊数据对话框getInt、选择条目型输入数据框选择条⽬型输⼊数据框getItem。
// 整型输⼊对话框QInputDialog::getInt
void MainWindow::on_pushButton_clicked()
{
int result = QInputDialog::getInt(this, "整型输⼊对话框", "请输入一个整数: ", 1);
qDebug() << result;
}
// 浮点数输⼊对话框
void MainWindow::on_pushButton_2_clicked()
{
double result = QInputDialog::getDouble(this, "浮点数输入对话框", "请输入一个浮点数: ", 1.0);
qDebug() << result;
}
// 条目输入对话框
void MainWindow::on_pushButton_3_clicked()
{
QStringList items;
items.push_back("110");
items.push_back("119");
items.push_back("120");
QString item = QInputDialog::getItem(this, "条目输入对话框", "请输入条目: ", items);
qDebug() << item;
}