Qt中QFileDialog的使用

(一)

Qt之标准通用对话框的使用

文档名称

Qt之标准通用对话框的使用

创建时间

2012-9-4

修改时间

2012-9-4

创建人

Baifx

简介(收获)

QFileDialog(完成)QFontDialogQColorDialog(完成)QInputDialog(完成)QMessageBox(完成)QErrorMessageQPrintDialogQProgressDialog

一、综述。

       操作系统一般都会提供一些列的标准对话框,如文件选择、字体选择、颜色选择等,这些标准对话框为应用层序提供了一致的观感。Qt对这些标准对话框都定义了相关的类,如:QFileDialogQFontDialogQColorDialogQInputDialogQMessageBoxQPrintDialogQErrorMessageQProgressDialog

 

二、QFileDialog

1getOpenFileName()QFileDialog类的一个静态函数,返回用户选择的文件名,如果用户选择取消(Cancel),则返回一个空串。函数形式如下:

QString QFileDialog::getOpenFileName( QWidget * parent = 0, const QString & caption = QString(), const QString & dir = QString(), const QString & filter = QString(), QString * selectedFilter = 0, Options options = 0 );

       调用getOpenFileName()函数将创建一个模态的文件对话框。dir参数指定了默认的目录,如果dir参数带有文件名,则该文件将是默认的选中文件;filter参数对文件系统进行过滤,只有与过滤器匹配的文件类型才显示,filter可以同时指定多种过滤方式供用户选择,多种过滤器之间用“;;”隔开,用户选择的过滤器通过参数selectedFilter返回。

       QFileDialog的静态函数

静态函数

说明

备注

getOpenFileName

获取用户选择的文件名

 

getSaveFileName

获取用户保存的文件名

 

getExistingDirectory

获取用户选择的已存在的目录名

 

getOpenFileNames

获得用户选择的文件名列表

 

详情参见Qt Assist

Static Public Members

QString

getExistingDirectory ( QWidget * parent = 0, const QString & caption = QString(), const QString & dir = QString(), Options options = ShowDirsOnly )

QString

getOpenFileName ( QWidget * parent = 0, const QString & caption = QString(), const QString & dir = QString(), const QString & filter = QString(), QString *selectedFilter = 0, Options options = 0 )

QStringList

getOpenFileNames ( QWidget * parent = 0, const QString & caption = QString(), const QString & dir = QString(), const QString & filter = QString(), QString *selectedFilter = 0, Options options = 0 )

QString

getSaveFileName ( QWidget * parent = 0, const QString & caption = QString(), const QString & dir = QString(), const QString & filter = QString(), QString * selectedFilter= 0, Options options = 0 )

 例:(a) QString directory = QFileDialog::getExistingDirectory(this, tr("Find Files"), QDir::currentPath(),0);

          (b)QString directory = QFileDialog::getExistingDirectory(this, tr("Find Files"), QDir::currentPath());

          (c)QString directory = QFileDialog::getExistingDirectory(this, tr("Find Files"), QDir::currentPath(),ShowDirsOnly );

           (b)和(c)是等价的

 三、QFontDialog

1getFont()QFontDialog的一个静态函数,返回用户选择的字体,函数形式如下:

QFont getFont( bool * ok, QWidget * parent = 0 );

调用getFont()函数将创建一个模态的字体对话框。用户选择OK,参数*ok将为true,函数返回用户选择的字体,否则为false,此时函数返回默认字体。

 

 

四、QColorDialog

1getColor()QColorDialog的一个静态函数,返回用户选择的颜色值,函数形式如下:

QColor getColor( const QColor & initial = Qt::white, QWidget * parent = 0 );

调用getColor()函数将创建一个模态的颜色对话框。initial参数制定了默认选中的颜色,默认为白色。通过QColor::isValid()可以判断用户选择颜色是否有效,若用户选择取消(Cancel),QColor::isValid()将返回false

QColorDialog的静态函数

静态函数

说明

备注

customColor

 

 

customCount

 

 

getColor

 

 

getColor

 

 

setCustomColor

 

 

setStandardColor

 

 

详情参见Qt Assist

Static Public Members

QRgb

customColor ( int index )

int

customCount ()

QColor

getColor ( const QColor & initial, QWidget * parent, const QString & title, ColorDialogOptions options = 0 )

QColor

getColor ( const QColor & initial = Qt::white, QWidget * parent = 0 )

void

setCustomColor ( int index, QRgb color )

void

setStandardColor ( int index, QRgb color )

 

 

 

五、QInputDialog

       Qt提供了一个QInputDialog类,QInputDialogDialog类提供了一种简单方便的对话框来获得用户的单个输入信息,目前提供了4种数据类型的输入,可以使一个字符串、一个Int类型数据、一个double类型数据或者是一个下拉列表框的条目。一个标准输入对话框的基本结构如下图所示:

Qt中QFileDialog的使用_第1张图片

       其中包含一个提示标签,一个输入控件。如实调用字符串输入框,则为一个QLineEdit;若是调用Int类型或都报了类型输入框,则为一个QSpinBox;若是调用列表条目输入框,则为一个QComboBox;还包括一个确定输入(OK)按钮和一个取消输入(Cancel)按钮。

QInputDialog的静态函数

静态函数

说明

备注

getText

 

 

getItem

 

 

getInteger

 

 

getDouble

 

 

       1getText()

QInputDialoggetText()函数弹出标准字符串输入对话框,getText()函数原型如下:

QString getText( QWidget * parent, const QString & title, const QString & label, QLineEdit::EchoMode mode = QLineEdit::Normal, const QString & text = QString(), bool * ok = 0, Qt::WindowFlags flags = 0, Qt::InputMethodHints inputMethodHints = Qt::ImhNone );  [static]

       此函数的第一个参数parent为标准输入对话框的父窗口;第二个参数title为标准输入对话框的标题名;第三个参数label为标准输入对话框的标签提示;第四个参数mode指定标准输入对话框中QLineEdit控件的输入模式;第五个参数text为标准字符串输入对话框弹出时QLineEdit控件中默认出现的文字;第六个参数ok用于指示标准输入对话框的哪个按钮被触发,若oktrue,则表示用户单击了OK(确定)按钮,若okfalse,则表示用户单击了Cancel(取消)按钮;最后一个参数f知名标准输入对话框的窗体标识。

      

       2getItem()

       QInputDialoggetItem()函数弹出标准条目选择对话框,getItem()函数原型如下:

QString getItem( QWidget * parent, const QString & title, const QString & label, const QStringList & list, int current = 0, bool editable = true, bool * ok = 0, Qt::WindowFlags f = 0 ) ;  [static]

       此函数的第一个参数parent为标准输入对话框的父窗口;第二个参数title为标准输入对话框的标题名;第三个参数label为标准输入对话框的标签提示;第四个参数list指定标准输入对话框中QComboBox控件显示的可选条目,为一个QStringList对象;第五个参数current为标准条目选择对话框弹出时QComboBox控件中默认显示的条目序号;第六个参数额滴table指定QComboBox控件中显示的文字是否可编辑;第七个参数ok用于指定标准输入对话框的哪个那妞被触发,若okfalse,则表示用户单击了Cancel(取消)按钮;最后一个参数f知名标准输入对话框的窗体标识。

 

       3getInteger()

       QInputDialoggetInteger()函数弹出标准int类型输入对话框,getInteger()函数原型如下:

int getInteger( QWidget * parent, const QString & title, const QString & label, int value = 0, int minValue = -2147483647, int maxValue = 2147483647, int step = 1, bool * ok = 0, Qt::WindowFlags f = 0 ) ;  [static]

       此函数的第一个参数parent为标准输入对话框的父窗口;第二个参数title为标准输入对话框的标题名;第三个参数label为标准输入对话框的标签提示;第四个参数value指定标准输入对话框中QSpinBox控件默认显示值;第五、六个参数minValuemaxValue指定QSpinBoxBox控件的数值范围;第七个参数step指定QSpinBox控件的步进值;第八个参数ok用于指定标准输入对话框的哪个那妞被触发,若okfalse,则表示用户单击了Cancel(取消)按钮;最后一个参数f知名标准输入对话框的窗体标识。

 

       4getDouble()

       QInputDialoggetDouble()函数弹出标准double类型输入对话框,getDouble()函数原型如下:

double getDouble( QWidget * parent, const QString & title, const QString & label, double value = 0, double minValue = -2147483647, double maxValue 2147483647, int decimals = 1, bool * ok = 0, Qt::WindowFlags f = 0 ) ;  [static]

       此函数的第一个参数parent为标准输入对话框的父窗口;第二个参数title为标准输入对话框的标题名;第三个参数label为标准输入对话框的标签提示;第四个参数value指定标准输入对话框中QSpinBox控件默认显示值;第五、六个参数minValuemaxValue指定QSpinBoxBox控件的数值范围;第七个参数decimals指定QSpinBox控件的步进值;第八个参数ok用于指定标准输入对话框的哪个那妞被触发,若okfalse,则表示用户单击了Cancel(取消)按钮;最后一个参数f知名标准输入对话框的窗体标识。

 

       六、QMessageBox

       QMessageBox提供了6中类型的消息框,包括Question消息框、Information消息框、Warning消息框、Critical消息框、About(关于)消息框、About(关于)Qt消息框。其实用户完全可以自己定义消息框,本节最后给出一个例子。

       Question消息框、Information消息框、Warning消息框、Critical消息框用法大同小异,这些消息框一般都包含一条提示信息、一个图标以及如干个按钮,它们的作用都是给用户提供一些提醒或一些简单的询问。按图标的不同可分为以下四个级别。

Qt中QFileDialog的使用_第2张图片

Question:为正常的操作提供一个简单的询问。

Information:为正常的操作提供一个提示。

Warning:提醒用户发生了一个错误。

Critical:警告用户发生了一个严重错误。

QMessageBox的静态函数

静态函数

说明

备注

about

 

 

aboutQt

 

 

critical

 

 

warning

 

 

information

 

 

question

 

 

详情参见Qt Assist

Static Public Members

void

about ( QWidget * parent, const QString & title, const QString & text )

void

aboutQt ( QWidget * parent, const QString & title = QString() )

StandardButton

critical ( QWidget * parent, const QString & title, const QString & text, StandardButtons buttons = Ok, StandardButton defaultButton = NoButton )

StandardButton

information ( QWidget * parent, const QString & title, const QString & text, StandardButtons buttons = Ok, StandardButton defaultButton = NoButton )

StandardButton

question ( QWidget * parent, const QString & title, const QString & text, StandardButtons buttons = Ok, StandardButton defaultButton = NoButton )

StandardButton

warning ( QWidget * parent, const QString & title, const QString & text, StandardButtons buttons = Ok, StandardButton defaultButton = NoButton )

       1、对于Question消息框,调用时直接使用QMessageBox::question()即可。第一个参数为消息框的父窗口指针;第二个参数为消息框的标题栏;第三个参数为消息框的文字提示信息,前三个参数对于其他几种消息框基本是一样的;后两个参数都是对消息框按钮的设定,QMessageBox类提供了许多标准按钮,如QMessageBox::OKQMessageBox::CloseQMessageBox::Discard等,具体可查阅Qt帮助。第四个参数即填写希望在消息框中出现的按钮,可根据需要在标准按钮中选择,用“|”连写,默认为QMessageBox::OK。第五个参数为默认按钮,即消息框出现时,焦点默认处于哪个按钮上。函数的返回值为按下的按钮,当用户按Escape键时,相当于返回QMessageBox::Cancel

 

       2Information消息框使用频率最高也最简单,直接调用QMessageBox::information()即可。第一个参数为消息框的父窗口指针;第二个参数为消息框的标题栏;第三个参数为消息框的文字提示信息,前三个参数对于其他几种消息框基本是一样的;后两个参数与Question消息框的用法一样,但在使用的过程中,经常会省略后两个参数,直接使用默认的QMessageBox::Ok按钮。

       Information消息框和Question消息框可以通用,使用Question消息框的地方都可以用Information消息框替换。

 

       3Warning消息框的最常用法为当用户进行了一个非正常操作时,提醒用户并询问是否进行某项操作,如关闭文档时,提醒并询问用户是否保存对文档的修改。

       函数调用方式与前面Question消息框的调用方式大致相同。第一个参数为消息框的父窗口指针;第二个参数为消息框的标题栏;第三个参数为消息框的文字提示信息;第四个参数为希望在消息框中出现的按钮,可根据需要在标准按钮中选择,用“|”连写,默认为QMessageBox::Ok。第五个参数为默认按钮,即消息框出现时,焦点默认处于哪个按钮上。

       注意:消息框的第四个参数的选择,虽是在QMessageBox::standardButtons中任意选择,但并不是随意选择,应注意按常规成对出现。如选择了QMessageBox::Save按钮则最好成对地选择QMessageBox::Discard按钮;而AbortRetryIgnore一般是一起出现的。

 

       4Critical消息框是在系统出现严重错误时对用户进行提醒的。它的用法也相对简单,通常情况下和Information消息框一样,在调用时只填写前三个参数即可。

 

       5About消息框一般用于提供系统的版本等信息。只需提供信息而不需要用户反馈信息,因此用法简单,直接调用QMessageBox::about(),并只用指定消息框父窗口、标题栏以及信息的内容即可。

 

       6About Qt消息框是Qt预定好的一种消息框,用于提供Qt的相关信息,只需直接调用QMessageBox::aboutQt(),并指定父窗口和标题栏即可,其中显示的内容是Qt预定好的。

 

       7、自定义消息框。包括消息框的图标、按钮、内容等都可以根据需要进行设定。例子如下:

QMessageBox customMsgBox;

         customMsgBox.setWindowTitle( tr( "Custom message box" ) );

        

         QPushButton * lockButton = customMsgBox.addButton( tr( "Lock" ), QMessageBox::ActionRole );

         QPushButton * unlockButton = customMsgBox.addButton( tr( "UnLock" ), QMessageBox::ActionRole );

         QPushButton * cancelButton = customMsgBox.addButton( QMessageBox::Cancel );

 

         customMsgBox.setIconPixmap( QPixmap( ".//Resources//msn.bmp" ) );

         customMsgBox.setText( tr( "This is a custom messagebox!" ) );

         customMsgBox.exec();

 

         if ( customMsgBox.clickedButton == lockButton )

         {

                   //doWhat

         }

 

         if ( customMsgBox.clickedButton == unlockButton )

         {

                   //doWhat

         }

 

         if ( customMsgBox.clickedButton == cancelButton )

         {

                   //doWhat

         }

 

七、QerrorMessage

 

 

 

八、QprintDialog

 

 

 

九、QProgressDialog

       通常在处理长时间任务时需要提供进度条的显示,告诉用户当前任务的进展情况。Qt提供了两种显示进度的方式,一种是QProgressBar,另一种就是QProgressDialogQProgressBar类提供了一种横向或者纵向显示进度的控件表示方式,用来描述任务的完成情况。QProgressDialog类提供了一种针对慢速过程的进度对话框表示方式,用于描述任务完成的进度情况。标准的QProgressDialog包括一个进度显示条、一个取消按钮以及一个标签。这里主要说QProgressDialog

       QProgressDialog有几个重要的属性值,决定了进度条对话框何时出现,出现多长时间,分别是minimummaximumminimumDuration。其中,minimummaximum分别表示进度条的最小值和最大值,决定了进度条的变化范围;minimumDuration为进度条对话框出现前的等待时间。系统根据所需要完成的工作量估算一个预计花费时间,若大于设定的等待时间minimumDuration,则出现进度条对话框;否则,不出现。例子如下:

QProgressDialog *progressDialog = new QProgressDialog(this);

              QFont font("ZYSong18030",12);

              progressDialog->setFont(font);             

              progressDialog->setWindowModality(Qt::WindowModal);

 

              progressDialog->setMinimumDuration(5);

              progressDialog->setWindowTitle(tr("Please Wait"));

              progressDialog->setLabelText(tr("Copying..."));

              progressDialog->setCancelButtonText(tr("Cancel"));             

              progressDialog->setRange(0,num);

              progressDialog->show();

 

              for (int i=1; i<num+1; i++)

              {

                     progressDialog->setValue(i);

                     qApp->processEvents();

                     /*此处模拟文件复制过程*/

                     QTest::qWait(1000);          

                     if (progressDialog->wasCanceled())

                            return;

              }            

       此处模拟每一个文件的复制过程,这里通过sleep(1)进行模拟,在实际中使用文件复制过程来替换,进度条的总的步进值为需要复制的文件数目,当复制完一个文件后,步进值增加1,这里需要使用qApp->processEvents();来正常相应事件循环,以确保应用程序不会出现阻塞。

       进度条对话框的使用有两种方法,即模态方式与非模态方式。模态方式较简单方便,但必须使用QApplication::processEvents()来使事件循环保持正常进行状态,从而确保应用不会阻塞。若使用非模态方式,则需要通过QTime来实现定时设置进度条的值。

 
(二)
QFileDialog是Qt中用于文件打开和保存的对话框,相当于Swing里面的JFileChooser。下面打开我们前面使用的工程。我们已经很有先见之明的写好了一个打开的action,还记得前面的代码吗?当时,我们只是弹出了一个消息对话框(这也是一种标准对话框哦~)用于告知这个信号槽已经联通,现在我们要写真正的打开代码了!
 
修改MainWindow的open函数:
 
void MainWindow::open()
{
        QString path = QFileDialog::getOpenFileName( this, tr( "Open Image"), ".", tr( "Image Files(*.jpg *.png)"));
         if(path.length() == 0) {
                QMessageBox::information(NULL, tr( "Path"), tr( "You didn't select any files."));
        } else {
                QMessageBox::information(NULL, tr( "Path"), tr( "You selected ") + path);
        }
}
 
编译之前别忘记include QFileDialog哦!然后运行一下吧!点击打开按钮,就会弹出打开对话框,然后选择文件或者直接点击取消,会有相应的消息提示。
 
QFileDialog提供了很多静态函数,用于获取用户选择的文件。这里我们使用的是getOpenFileName(), 也就是“获取打开文件名”,你也可以查看API找到更多的函数使用。不过,这个函数的参数蛮长的,而且类型都是QString,并不好记。考虑到这种情况,Qt提供了另外的写法:
 
        QFileDialog *fileDialog = new QFileDialog( this);
        fileDialog->setWindowTitle(tr( "Open Image"));
        fileDialog->setDirectory( ".");
        fileDialog->setFilter(tr( "Image Files(*.jpg *.png)"));
         if(fileDialog->exec() == QDialog::Accepted) {
                QString path = fileDialog->selectedFiles()[0];
                QMessageBox::information(NULL, tr( "Path"), tr( "You selected ") + path);
        } else {
                QMessageBox::information(NULL, tr( "Path"), tr( "You didn't select any files."));
        }
 
不过,这两种写法虽然功能差别不大,但是弹出的对话框却并不一样。getOpenFileName()函数在Windows和MacOS X平台上提供的是本地的对话框,而QFileDialog提供的始终是Qt自己绘制的对话框(还记得前面说过,Qt的组件和Swing类似,也是自己绘制的,而不都是调用系统资源API)。
 
为了说明QFileDialog::getOpenFileName()函数的用法,还是先把函数签名放在这里:
 
QString QFileDialog::getOpenFileName (
          QWidget * parent = 0,
          const QString & caption = QString(),
          const QString & dir = QString(),
          const QString & filter = QString(),
          QString * selectedFilter = 0,
          Options options = 0 )
 
第一个参数parent,用于指定父组件。注意,很多Qt组件的构造函数都会有这么一个parent参数,并提供一个默认值0;
 
第二个参数caption,是对话框的标题;
 
第三个参数dir,是对话框显示时默认打开的目录,"." 代表程序运行目录,"/" 代表当前盘符的根目录(Windows,Linux下/就是根目录了),也可以是平台相关的,比如"C:\\"等;
 
第四个参数filter,是对话框的后缀名过滤器,比如我们使用"Image Files(*.jpg *.png)"就让它只能显示后缀名是jpg或者png的文件。如果需要使用多个过滤器,使用";;"分割,比如"JPEG Files(*.jpg);;PNG Files(*.png)";
 
第五个参数selectedFilter,是默认选择的过滤器;
 
第六个参数options,是对话框的一些参数设定,比如只显示文件夹等等,它的取值是enum QFileDialog::Option,每个选项可以使用 | 运算组合起来。
 
如果我要想选择多个文件怎么办呢?Qt提供了getOpenFileNames()函数,其返回值是一个QStringList。你可以把它理解成一个只能存放QString的List,也就是STL中的list<string>。
例: QString directory=QFileDialog::getOpenFileName(this,"open this document",QDir::currentPath(),"allFiles(*.*)");
 
好了,我们已经能够选择打开文件了。保存也是类似的,QFileDialog类也提供了保存对话框的函数getSaveFileName,具体使用还是请查阅API。

你可能感兴趣的:(Qt中QFileDialog的使用)