QFileDialog 对话框
选择打开一个文件
若要打开一个文件,可调用静态函数 QFileDialog::getOpenFileName(),“打开一个文件”按钮的响应代码如下:
void Dialog::on_btnOpen_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);
}
QFileDialog::getOpenFileName() 函数需要传递 3 个字符串型参数,分别如下:
- 对话框标题,这里设置为"选择一个文件"。
- 初始化目录,打开对话框时的初始目录,这里用QDinxurrentPath()获取应用程序当前目录。
- 文件过滤器,设置选择不同后缀的文件,可以设置多组文件,如:
QString f ilter="文本文件.txt);;图片文件(* .jpg *.gif *.png);;所有文件(*.*)";
每组文件之间用两个分号隔开,同一组内不同后缀之间用空格隔开。
QFileDialog::getOpenFileName() 函数返回的是选择文件的带路径的完整文件名,如果在对话框里取消选择,则返回字符串为空。
选择打开多个文件
若要选择打开多个文件,可使用静态函数 QFileDialog::getOpenFileNames(),“打开多个文件”按钮的响应代码如下:
1 void Dialog::on_btnOpenMulti_clicked()
2 { //选择多个文件
3 //获取应用程序的路径
4 QString curPath=QDir::currentPath();//获取系统当前目录
5 QString dlgTitle="选择多个文件"; //对话框标题
6 QString filter="文本文件(*.txt);;图片文件(*.jpg *.gif *.png);;所有文件(*.*)"; //文件过滤器
7 QStringList fileList=QFileDialog::getOpenFileNames(this,dlgTitle,curPath,filter);
8 for (int i=0; i<fileList.count();i++)
9 ui->plainTextEdit->appendPlainText(fileList.at(i));
10 }
getOpenFileNames() 函数的传递参数与 getOpenFileName() —样,只是返回值是一个字符串列表,列表的每一行是选择的一个文件。
选择已有目录
选择己有目录可调用静态函数 QFileDialog::getExistingDirectory(),同样,若需要传递对话框标题和初始路径,还应传递一个选项,一般用 QFileDialog::ShowDirsOnly,表示对话框中只显示目录。
静态函数 QCoreApplication::applicationDirPath() 返回应用程序可执行文件所在的目录,getExistingDirectory() 函数的返回值是选择的目录名称字符串。
选择保存文件名
选择一个保存文件,使用静态函数 QFileDialog::getSaveFileName(),传递的参数与 getOpenFileName() 函数相同。只是在调用 getSaveFileName() 函数时,若选择的是一个己经存在的文件,会提示是否覆盖原有的文件。如果提示覆盖,会返回为选择的文件,但是并不会对文件进行实质操作,对文件的删除操作需要在选择文件之后自己编码实现。
如下面的代码,即使选择覆盖文件,由于代码里没有实质地覆盖原来的文件,也不会对选择的文件造成任何影响:
1 void Dialog::on_btnSave_clicked()
2 {//保存文件
3 QString curPath=QCoreApplication::applicationDirPath(); //获取应用程序的路径
4 QString dlgTitle="保存文件"; //对话框标题
5 QString filter="文本文件(*.txt);;h文件(*.h);;C++文件(.cpp);;所有文件(*.*)"; //文件过滤器
6 QString aFileName=QFileDialog::getSaveFileName(this,dlgTitle,curPath,filter);
7 if (!aFileName.isEmpty())
8 ui->plainTextEdit->appendPlainText(aFileName);
9 }
写一个栗子:
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
#include<qpushbutton.h>
#include<QLabel>
#include<QLineEdit>
#include<QHBoxLayout>
#include<QVBoxLayout>
#include<QFileDialog>
class Dialog : public QDialog
{
Q_OBJECT
public:
Dialog(QWidget *parent = nullptr);
~Dialog();
private:
QLabel *FileNameLabel;
QLineEdit *FileNameLineEdit;
QPushButton *FileBtn;
QLabel *FileSizeLabel;
QLineEdit *FileSizeLineEdit;
QPushButton *GetFileInfoBtn;
private slots:
void GetFileInfo();//用于打开问你件
void GetFileSizeInfo();//用于获取文件大小
};
#endif // DIALOG_H
#include "dialog.h"
Dialog::Dialog(QWidget *parent)
: QDialog(parent)
{
setWindowTitle("FileDialog文件对话框测试");
//创建控件
FileNameLabel=new QLabel("文件名称: ");
FileNameLineEdit=new QLineEdit;
FileBtn=new QPushButton("选择...");
FileSizeLabel=new QLabel("文件大小:");
FileSizeLineEdit=new QLineEdit;
GetFileInfoBtn=new QPushButton("获取文件大小信息");
//排列布局
QGridLayout *glayout=new QGridLayout;
glayout->addWidget(FileNameLabel,0,0);
glayout->addWidget(FileNameLineEdit,0,1);
glayout->addWidget(FileBtn,0,2);
glayout->addWidget(FileSizeLabel,1,0);
glayout->addWidget(FileSizeLineEdit,1,1,1,2);
QHBoxLayout *hlayout=new QHBoxLayout;
hlayout->addWidget(GetFileInfoBtn);
QVBoxLayout *vlayout=new QVBoxLayout(this);
vlayout->addLayout(glayout);
vlayout->addLayout(hlayout);
//连接信号
connect(FileBtn,SIGNAL(clicked()),this,SLOT(GetFileInfo()));
connect(GetFileInfoBtn,SIGNAL(clicked()),this,SLOT(GetFileSizeInfo()));
}
Dialog::~Dialog()
{
}
void Dialog::GetFileInfo()
{
QString strFileName=QFileDialog::getOpenFileName(this,"打开","/","File(*)");
FileNameLineEdit->setText(strFileName);
}
void Dialog::GetFileSizeInfo()
{
//获取单行编辑框控件里面文件路径等
QString strFileSize=FileNameLineEdit->text();
QFileInfo fileinfo(strFileSize);
qint64 FileSize=fileinfo.size();
FileSizeLineEdit->setText(QString::number(FileSize));
}
这是一个基于Qt框架的对话框程序,主要实现了获取指定文件的路径和大小,并将其显示在对应的单行编辑框控件中。具体实现方式如下:
-
GetFileInfo()函数:该函数通过调用QFileDialog::getOpenFileName()方法弹出一个打开文件对话框,让用户选择要打开的文件。选择完成后,将文件名显示在一个单行编辑框控件中。
-
GetFileSizeInfo()函数:该函数获取单行编辑框控件中的文件路径,使用QFileInfo类获取该文件的大小,并将大小显示在另一个单行编辑框控件中。
这两个函数都是Dialog类的成员函数,其中this指针代表当前对话框对象。可以通过这些函数方便地实现文件信息的获取和显示。
运行结果:
QMessageBox 消息对话框
简单信息提示
消息对话框 QMessageBox 用于显示提示、警告、错误等信息,或进行确认选择,由几个静态函数实现这些功能(详见表 1)。其中 warning()、information()、critical() 和 about() 这几个函数的输入参数和使用方法相同,只是信息提示的图标有区别。
StandardButton QMessageBox::warning(QWidget *parent, const QString &title, const QString &text, StandardButtons buttons = Ok, StandardButton defaultButton = NoButton)
其中,parent 是对话框的父窗口,指定父窗口之后,打开对话框时,对话框将自动显示在父窗口的上方中间位置;title 是对话框标题字符串;text 是对话框需要显7K的信息字符串;buttons 是对话框提供的按钮,缺省只有一个 OK 按钮;defaultButton 是缺省选择的按钮,缺省表示没有选择。
warning() 函数的返回结果是 StandardButton 类型。对话框上显示的按钮和缺省选中按钮也是 StandardButton 类型。
StandardButton 是各种按钮的定义,如 OK、Yes、No、Cancel 等,其枚举取值是 QMessageBox::Ok、QMessageBox::Cancel、QMessageBox::Close 等。
详见 Qt 帮助文档中的StandardButton 类型的说明。
对于 warning()、information()、critical() 和 about() 这几种对话框,它们一般只有一个 OK 按钮,且无须关心对话框的返回值。所以,使用缺省的按钮设置即可。
确认选择对话框
QMessageBox::question() 函数用于打开一个选择对话框,提示信息,并提供 Yes、No、OK、Cancel 等按钮,用户单击某个按钮返回选择,如常见的文件保存确认对话框如图所示。
静态函数 QMessageBox::question() 的原型如下:
StandardButton QMessageBox::question(QWidget *parent, const QString &title, const QString &text, StandardButtons buttons = StandardButtons( Yes | No ), StandardButton defaultButton = NoButton)
question() 对话框的关键是在其中可以选择显示多个按钮,例如同时显示 Yes、No、OK 或 Cancel() 其返回结果也是一个 StandardButton 类型变量,表示哪个按钮被单击了。
举个栗子:
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
#include<qpushbutton.h>
#include<QLabel>
#include<QGridLayout>
#include<QMessageBox>
class Dialog : public QDialog
{
Q_OBJECT
public:
Dialog(QWidget *parent = nullptr);
~Dialog();
private:
QLabel *displabel;
QPushButton *questionbtn;//问题消息命令按钮
QPushButton *infomationbtn;//信息消息命令按钮
QPushButton *warningbtn;//警告消息命令按钮
QPushButton *criticalbtn;//错误消息命令按钮
QPushButton *aboutbtn;//消息框命令按钮
QPushButton *aboutqtbtn;//命令按钮
QGridLayout *glayout;//布局
private slots:
void DisplayQuestionMsg();
void DisplayInfomationMsg();
void DisplayWarningMsg();
void DisplayCriticalMsg();
void DisplayAboutMsg();
void DisplayAboutQtMsg();
};
#endif // DIALOG_H
#include "dialog.h"
Dialog::Dialog(QWidget *parent)
: QDialog(parent)
{
resize(320,150);
setWindowTitle("QMessqge对话框控件测试");
glayout=new QGridLayout(this);
displabel=new QLabel("请选择:");
questionbtn=new QPushButton("Qusestion");
infomationbtn=new QPushButton("Infomation");
warningbtn=new QPushButton("Warning");
criticalbtn=new QPushButton("critical");
aboutbtn=new QPushButton("About");
aboutqtbtn=new QPushButton("ABoutQt");
glayout->addWidget(displabel,0,0,1,2);
glayout->addWidget(questionbtn,1,0);
glayout->addWidget(infomationbtn,1,1);
glayout->addWidget(warningbtn,2,0);
glayout->addWidget(criticalbtn,2,1);
glayout->addWidget(aboutbtn,3,0);
glayout->addWidget(aboutqtbtn,3,1);
connect(questionbtn,SIGNAL(clicked()),this,SLOT(DisplayQuestionMsg()));
connect(infomationbtn,SIGNAL(clicked()),this,SLOT(DisplayInfomationMsg()));
connect(warningbtn,SIGNAL(clicked()),this,SLOT(DisplayWarningMsg()));
connect(criticalbtn,SIGNAL(clicked()),this,SLOT(DisplayCriticalMsg()));
connect(aboutbtn,SIGNAL(clicked()),this,SLOT(DisplayAboutMsg()));
connect(aboutqtbtn,SIGNAL(clicked()),this,SLOT(DisplayAboutQtMsg()));
}
Dialog::~Dialog()
{
}
void Dialog::DisplayQuestionMsg()
{
displabel->setText("Question Message Box");
switch (QMessageBox::question(this,"Question消息框","是否退出程序?",
QMessageBox::Ok|QMessageBox::Cancel,QMessageBox::Ok)) {
case QMessageBox::Ok:
displabel->setText("你选择QuestionMsg命令按钮中的Ok");
break;
case QMessageBox::Cancel:
displabel->setText("你选择QuestionMsg命令按钮中的Cancel");
break;
default:
break;
}
return;
}
void Dialog::DisplayInfomationMsg()
{
displabel->setText("Infomation Message Box");
QMessageBox::information(this,"Information消息框","Information消息框测试成功");
return;
}
void Dialog::DisplayWarningMsg()
{
displabel->setText("Warning Message Box");
switch (QMessageBox::question(this,"Question消息框","数据库student是否删除",
QMessageBox::Discard|QMessageBox::Save|QMessageBox::Cancel,QMessageBox::Save)) {
case QMessageBox::Discard:
displabel->setText("你选择WarningMsg命令按钮中的Discard");
break;
case QMessageBox::Save:
displabel->setText("你选择WarningMsg命令按钮中的Save");
break;
case QMessageBox::Cancel:
displabel->setText("你选择WarningMsg命令按钮中的Cancel");
default:
break;
}
}
void Dialog::DisplayCriticalMsg()
{
displabel->setText("Critical Message Box");
QMessageBox::critical(this,"critical消息框","数据库文件备份错误");
return;
}
void Dialog::DisplayAboutMsg()
{
displabel->setText("About Message Box");
QMessageBox::about(this,"about消息框","测试Qt about消息框");
return;
}
void Dialog::DisplayAboutQtMsg()
{
displabel->setText("About Qt Message Box");
QMessageBox::aboutQt(this,"about qt消息框-0--");
return;
}
这一大段代码,头文件中主要是定义一些我们需要用到的量,包括按钮和输入栏 以及一些槽函数。
在源文件中,我们先进行了实例化操作和布局上的安排,紧接着就开始链接槽函数。
DisplayQuestionMsg()函数,用于:你点击按钮之后询问是否退出程序,出现ok和cancel按钮。DisplayInfomationMsg()函数,用于消息框测试,判断你是否点击了。DisplayWarningMsg()函数用于发出警告,目前的 功能类似第一个。DisplayCriticalMsg()函数用于测试critical按钮,类似第二个。DisplayAboutMsg()同2.DisplayAboutQtMsg()函数用于打开关于qt功能。
结果:
感谢阅读!!!!!!