前言
对话框是 GUI程序设计中不可或缺的组成部分,很多不能或者不适合放入主窗口的功能组件都必须放在对话框中。
Qt使用 QDialog类实现对话框,通常会设计一个类继承 QDialog类。QDialog 类( 及其派生类,以及所有 Qt:Dialog 类型的类)对其 parent 指针都有额外的解释:如果 parent 为 NULL,则该对话框会作为一个顶层窗口,否则作为其父组件的子对话框(此时,其默认出现的位置是 parent 的中心)。顶层窗口与非顶层窗口的区别在于,顶层窗口在任务栏有自己的位置,而非顶层窗口则会共享其父组件的位置。
模态和非模态对话框
对话框分为模态对话框和非模态对话框。模态对话框会阻塞同一应用程序中其他窗口的输入。与此相反的是非模态对话框,则在进行一项“动作”时是不会阻塞同一引用程序其他窗口输入的。具体实现:
用exec()方法来显示对话框时,总是以模态的形式来显示,关闭一个对话框,另一个对话框才能显示。 另一种是使用 show()方法,它使得对话框既可以模态显示,也可以非模态显示,决定它是模态还是非模态的是对话框的 Modal属性,而Modal有独特的属性。
Modal属性:在默认的情况下时false,所以通过 show()方法显示的对话框就是非模态的。如果设置为true,就成了模态对话框。
a.模态对话框
Dialog w;
w.setModal(true);
w.show();
return a.exec();
b.非模态对话框
Dialog d
d.setModal(false);//不添加参数也默认为false
d.show()
对话框类型
在Qt中的对话框大多是通用的。
文件对话框
用一个例子:使用 QFileDialog 来打开一个文本文件,并将选择的文本的绝对路径和名称显示出来。在ui设计界面添加一个push button和plain text edit:
右键单击按钮选择调转槽函数进行编写,其余自动生成的代码不变,在widget.cpp文件中:
#include "widget.h" //在widget.h中引用了“QDir”和“QFileDialog”两个头文件
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_btnOpenFile_clicked()
{
QString curPath=QDir::currentPath();// 获取程序当前日录
// 获取应用程序的路径
QString dlgTitle="选择一个文件";// 对话框标题
QString filter="文本文件 (*.txt); 图片文件 (*.jpg *.gif *.png);; 所有文件 (*.*)";// 文件过滤器
QString aFileName=QFileDialog::getOpenFileName(this,dlgTitle,curPath,filter);
if (!aFileName.isEmpty())
ui->plainTextEdit->appendPlainText(aFileName);
}
点击按钮后 弹出:
选择一个文件后,在可以编辑的plain text中:
消息对话框
无交互对话框
接下来就用一个例子简单测试一下这四个标准对话框,在ui设计界面:
右键单击对应的按钮选择调转槽函数进行编写,其余自动生成的代码不变,在widget.cpp文件中:
#include "widget.h"
#include "ui_widget.h"
#include <QDialog>
#include <QDir>
#include <QFileDialog>
#include <QColorDialog>
#include <QFontDialog>
#include <QInputDialog>
#include <QMessageBox>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_btnOpenFile_clicked()
{
QString curPath=QDir::currentPath();// 获取程序当前日录
// 获取应用程序的路径
QString dlgTitle="选择一个文件";// 对话框标题
QString filter="文本文件 (*.txt); 图片文件 (*.jpg *.gif *.png);; 所有文件 (*.*)";// 文件过滤器
QString aFileName=QFileDialog::getOpenFileName(this,dlgTitle,curPath,filter);
if (!aFileName.isEmpty())
ui->plainTextEdit->appendPlainText(aFileName);
}
void Widget::on_button1_on_about_clicked()
{
QString sTitle = "about对话框";
QString sInfo = "简单提醒内容";
QMessageBox::about(this,sTitle,sInfo);
}
void Widget::on_button2_on_aboutQt_clicked()
{
QString sTitle = "aboutQt对话框";
QMessageBox::aboutQt(this,sTitle);
}
void Widget::on_button3_on_question_clicked()
{
QString sTitle = "question对话框";
QString sInfo = "问题";
QMessageBox::question(this,sTitle,sInfo,QMessageBox::Ok,QMessageBox::NoButton);
}
void Widget::on_button4_on_warning_clicked()
{
QString sTitle = "warning对话框";
QString sInfo = "警告内容";
QMessageBox::warning(this,sTitle,sInfo,QMessageBox::Ok,QMessageBox::NoButton);
}
void Widget::on_button5_on_information_clicked()
{
QString sTitle = "information对话框";
QString sInfo = "一段信息";
QMessageBox::information(this,sTitle,sInfo,QMessageBox::Ok,QMessageBox::NoButton);
}
void Widget::on_button6_on_critical_clicked()
{
QString sTitle = "critical对话框";
QString sInfo = "错误";
QMessageBox::critical(this,sTitle,sInfo,QMessageBox::Ok,QMessageBox::NoButton);
}
分别点击这六个按钮:
此时我们会发现,不同的对话框的弹出回伴随着不同音乐的演奏。
交互对话框
我们发现上面列举的对话框只是单纯弹出一段信息,只要点击Ok按钮就行了,那我们怎么才能使用弹出的对话框返回值根据我们自己的选择呢?(用一个简单的示例来说明)
在上面的例子里面,我们用question对话框,当我们在面对一个带问号的弹出的对话框时我们会对我们的操作进行确认或者取消:
在widget.cpp文件中添加(我们把选择的结果在右边可编辑的文字框里面显示出来!):
void Widget::on_button_on_jiaohu_clicked()
{
QString sTitle = "question对话框";
QString sInfo = "对你刚刚的操作,是否选择确认?";
QMessageBox::StandardButton result;//记录所选择的按钮的值
result = QMessageBox::question(this,sTitle,sInfo,QMessageBox::Yes|QMessageBox::No,QMessageBox::NoButton);
if(result == QMessageBox::Yes){
ui->plainTextEdit->appendPlainText("你选择了确认");
}else if(result == QMessageBox::No){
ui->plainTextEdit->appendPlainText("你选择了取消(关闭也是取消)");
}else{
ui->plainTextEdit->appendPlainText("你没选择");
}
}
进行按钮示例: