对话框一般应用于临时交互的场景。学习QT中的对话框时,应该使用QWidget作为基类,而不是QDialog。因为QDialog在显示的时候只会有一个对话框。
一般分为两种:
1. 模态对话框:阻塞。此时要调用exec进入阻塞状态,而不是show方法,因为在栈上创建的对话框在出了匿名函数后会马上析构掉。
this->resize(300, 300);
QPushButton *btn = new QPushButton("open", this);
btn->move(100, 100);
connect(btn, &QPushButton::clicked, [=](){
QDialog dlg;
dlg.resize(100, 200);
dlg.exec();
});
2. 非模态对话框:非阻塞。调用show方法,但是此时关闭对话框仅仅是隐藏,并不会在对象树上删除,所以会造成内存泄漏。此时要设置属性WA_DeleteOnClose在关闭对话框时就将其析构掉。
this->resize(300, 300);
QPushButton *btn = new QPushButton("open", this);
btn->move(100, 100);
connect(btn, &QPushButton::clicked, [=](){
QDialog *dlg = new QDialog(this);
dlg->setAttribute(Qt::WA_DeleteOnClose);
dlg->resize(200, 200);
dlg->show();
});
我们主要学习QT提供的几个标准对话框:提供了静态成员函数。
1. 消息对话框:QMessageBox。一共有四种,注释中有描述,都提供了获取对话框的静态函数,这里就不多作赘述。
1.1. 参数:父对象、title、text、按钮名称、默认选项。
this->resize(300, 300);
QPushButton *btn = new QPushButton("open", this);
btn->move(100, 100);
connect(btn, &QPushButton::clicked, [=](){
QMessageBox::warning(this, "warning", "..."); //警告对话框
QMessageBox::information(this, "information", "..."); //消息对话框
QMessageBox::question(this, "question", "...", QMessageBox::Save | QMessageBox::Cancel, QMessageBox::Cancel); //问题对话框
QMessageBox::critical(this, "error", "..."); //警告对话框
});
1.2. 返回值:选择的按钮。
connect(btn, &QPushButton::clicked, [=](){
if (QMessageBox::Save == QMessageBox::question
(this,
"question",
"...",
QMessageBox::Save | QMessageBox::Cancel,
QMessageBox::Cancel)){
qDebug() << "save";
} else {
qDebug() <<"cancel";
}
});
2. 文件对话框:QFileDialog
参数:父对象、title、path、文件过滤(最好将字符串添加括号)。
返回值:选择的文件路径。
connect(btn, &QPushButton::clicked, [=](){
//qDebug打印QString有双引号,打印char*没有双引号。
QString path = QFileDialog::getOpenFileName(this, "打开文件", "D:\\Qt\Qt5.9.3\\5.9.3\\", "(*.txt)");
qDebug() << path.toUtf8().data(); //将QString转换为char *
});
3. 颜色对话框:QColorDialog
connect(btn, &QPushButton::clicked, [=](){
QColor color = QColorDialog::getColor();
qDebug() << color.red();
qDebug() << color.green();
qDebug() << color.blue();
});
4. 字体对话框: QFontDialog
connect(btn, &QPushButton::clicked, [=](){
bool flag;
QFont ft = QFontDialog::getFont(&flag);
qDebug() << "字体 " << ft.family();
qDebug() << "字号 " << ft.pointSize();
qDebug() << "是否加粗 " << ft.bold();
qDebug() << "是否倾斜 " << ft.italic();
});