2021.6.7:QT——5种标准对话框、消息框
Qt为应用程序设计提供了一些常用的标准对话框,如文件DLG、颜色DLG、消息框、标准输入DLG、字体DLG,用户无需再自己设计这些常用的对话框,这样可以减少程序设计工作量。
Qt预定义的各种对话框的类以及主要静态函数的功能见下表(由于DLG参数一般较多。所以此处省略了参数,只列出函数的返回类型)
对话框 | 常用静态函数 | 功能 |
QFileDialog |
QString getOpenFileName() QStringList getOpenFileNames() QString getSaveFileName() QString getExistingDirectory() QUrl getOpenFileUrl() |
选择打开一个文件 选择打开多个文件 选择保存一个文件 选择一个已有的目录 选择打开一个文件,可选择远程网络文件 |
QColorDialog | QColor getColor() | 选择颜色 |
QFontDialog | QFont getFont() | 选择字体 |
QInputDialog |
QString getText() int getInt() double getDouble() QString getItem() QString getMultiLineText() |
输入单行文字 输入整数 输入浮点数 从一个下拉列表框中选择输入 输入多行字符串 |
QMessageBox |
StandardButton information() StandardButton question() StandardButton warning() StandardButton critical() void about() void aboutQt() |
提示 确认/取消 警告 错误 自定义信息“关于”对话框 关于Qt对话框 |
实例samp6_1演示使用这些对话框,程序运行界面如下图所示。下方的文本框显示打开文件的文件名或一些提示信息,某些对话框的输入结果可应用于文本框的属性设置,如字体和颜色。
QFileDialog对话框
选择打开一个文件
若要打开一个文件,可以调用静态函数QFileDialog::getOpenFileName(),“打开一个文件”按钮的响应代码如下:
void Dialog::on_btnOpen_clicked() { //选择单个文件 QString curPath = QDir::currentPath();//获取系统当前目录 //获取应用程序的路径 QString dlgTitle = "选择一个文件";//对话框标题 QString filter = "文本文件(*.txt);;图片文件(*.jpg,*.gif,*.png);;所有文件(*.*)";//文件过滤器 QString filename = QFileDialog :: getOpenFileName(this,dlgTitle,curpath,filter); if(!filename.isEmpty()) ui->plainTextEdit->appendPlainText(filename); }
getOpenFileNames()函数的传递参数与getOpenFileName()一样,只是返回值是一个QStringList,List的每个Item是选择的一个文件。
选择已有目录
选择已有目录可以调用静态函数QFileDialog::getExistingDirectory(),同样,若需要传递Title和Path,还应当传递一个选项,一般用QFileDialog::ShowDirsOnly,表示对话框中只显示目录。
静态函数QCoreApplication::applicationDirPath()返回应用程序可执行文件所在目录,getExistingDirectory()函数的返回值是选择的目录名称字符串。
选择保存文件名
选择一个保存文件,使用静态函数QFileDialog::getSaveFileName(),传递的参数与getOpenFileName()函数相同。只是在调用getSaveFileName()函数时,若选择的是一个已经存在的文件,会提示是否覆盖原有的文件。如果提示覆盖,会返回为选择的文件,但是并不会对文件进行实质操作,对文件的删除操作需要在选择文件之后自己编程实现。
如下面的代码,即使选择覆盖文件,由于代码中并没有实质覆盖原来的文件,也不会对选择的文件造成任何影响:
void Dialog::on_btnSave_clicked() { //保存文件 QString curPath = QCoreApplication::applicationDirPath();//路径 QString dlgTitle = "保存文件"; //对话框标题 QString filter = "文本文件(*.txt);;h文件(*.h);;C++文件(.cpp);;所有文件(*.*)"; //文件过滤器 QString filename = QFileDialog::getSaveFileName(this , dlgTitle , curPath , filter); if(!filename.isEmpty()) ui->plainTextEdit->appendPlainText(filename); }
QColorDialog对话框
QColorDialog是颜色选择对话框,使用颜色使用静态函数QColorDialog::getColor()。下面是“选择颜色”按钮的代码,它为文本框的字体选择颜色:
void Dialog::on_btnColor_clicked() { QPalette pal = ui->plainTextEdit->palette();//获取现有palette QColor iniColor = pal.color(QPalette::Text);//现有文字颜色 QColor color = QColorDialog::getColor(iniColor,this,"选择颜色"); if(color.isValid())//选择有效 { pal.setColor(QPalette::Text,color);//palette设置选择颜色 ui->plainTextEdit->setPalette(pal);//设置palette { }
getColor()函数需要传递一个初始颜色,这里是将palette提取的文本颜色作为初始颜色。getColor()函数返回一个QColor变量,若在颜色对话框中取消选择,则返回的颜色值无效,通过QColor::isValid()来判断返回的颜色是否有效。
QFontDialog对话框
QFontDialog是选择字体对话框,选择字体使用静态函数QFontDialog::getFont()。
下面是“选择字体”按钮的代码,它为文本框选择字体,字体设置内容包括名称、大小、粗体、斜体等。
void Dialog :: on_btnFont_clicked() {//选择字体 QFont iniFont = ui->plainTextEdit->font();//获取文本框的字体 bool ok = false; QFont font = QFontDialog :: getFont(&ok , iniFont);//选择字体 if(ok)//选择有效 ui->plainTextEdit->setFont(font); }
QInpuDialog标准输入对话框
QInputDialog有单行/多行String Text、Int、Float、Item等多种输入方式,下图是其中四种的界面效果:
输入文字
QInputDialog::getText()函数显示一个用于输入字符串的对话框,传递的参数包括标题、标签文字、缺省输入、响应模式等。
其中编辑框响应模式是枚举类型QLineEdit::EchoMode,它控制编辑框上文字显示方式,正常情况下选择QLineEdit::Normal;如果是输入密码,选择QLineEdit::Password,代码如下:
void Dialog::on_btnInputString_clicked() { //输入字符串 QString dlgTitle="输入文字对话框"; QString txtLabel="请输入文件名"; QString defaultInput="新建文件.txt"; QLineEdit::EchoMode echoMode = QLineEdit::Normal;//正常文字输入 //QLineEdit::EchoMode echoMode = QLineEdit::Password;//密码输入 bool ok = false; QString text = QInputDialog::getText(this,dlgTitle,txtLabel, echoMode,defaultInput,&ok); if(ok && !text.isEmpty()) ui->plainTextEdit->appendPlainText(text); }
输入整数
使用QInputDialog::getInt()函数输入一个整数,下面的代码为文本选择字体大小:
void Dialog::on_btnInputInt_clicked() { //输入整数 QString dlgTitle = "输入整数对话框"; QString txtLabel = "设置字体大小"; int defaultValue = ui->plainTextEdit->font().pointSize();//现有字体大小 int minValue=6,maxValue=50,stepValue=1;//范围和步长 bool ok = false; int inputValue = QInputDialog::getInt(this,dlgTitle,txtLabel, defaultValue,minValue, maxValue,stepValue,&ok); if(ok)//是否确认输入 { QFont font = ui->plainTextEdit->font(); font.setPointSize(inputValue); ui->plainTextEdit->setFont(font); } }
输入整数Dlg使用一个SpinBox组件输入整数,getInt()需要传递的参数包括大小范围、步长、初始值,确认选择输入后,将输入的整数值作为文本框字体的大小。
输入浮点数
使用QInputDialog::getDouble()函数输入一个浮点数,输入Dlg使用一个QDoubleSpinBox作为输入组件,getDouble()的输入参数需要输入范围、初始值、小数点位数等。代码如下:
void Dialog::on_btnInputFloat_clicked() { //输入浮点数 QString dlgTitle="输入浮点数对话框"; QString txtLabel="输入一个浮点数"; float defaultValue=3.13; float minValue=0,maxValue=10000;//范围 int decimals=2;//小数点位数 bool ok = false; float inputValue = QInputDialog::getDouble(this,dlgTitle,txtLabel, defaultValue,minValue,maxValue, decimal,&ok); if(ok)//确认选择 { QString str = QString::asprintf("输入一个浮点数:%.2f",inputValue); ui->plainTextEdit->appendPlainText(str); } }
下拉列表选择输入
使用QInputDialog::getItem()可以从一个ComboBox组件的下拉列表中选择输入。代码如下:
void Dialog::on_btnInputItem_clicked() { QStringList items;//ComboBox列表的内容 items <<"优秀"<<"良好"<<"合格"<<"不合格"; QString dlgTitle="条目选择对话框"; QString txtLabel="请选择级别"; int curIndex=0;//初始选择项 bool editable=true;//ComboBox是否可以编辑 bool ok = false; QString text = QInputDialog::getItem(this,dlgTitle,txtLabel, items,curIndex,editable,&ok); if(ok && !text.isEmpty()) ui->plainTextEdit->appendPlainText(text); }
getItem()函数需要一个QStringList变量为其ComboBox组件做条目初始化,curIndex指明初始选择项,editable表示对话框中的ComboBox是否可编辑,若不能编辑,则只能在下拉列表中选择。
QMessageBox消息对话框
简单信息提示——Warning
消息对话框QMessageBox用于显示info、warning、error等信息,或者进行确认取消,,由几个静态函数实现这些功能:
QMessageBox |
StandardButton information() StandardButton question() StandardButton warning() StandardButton critical() void about() void aboutQt() |
提示 确认/取消 警告 错误 自定义信息“关于”对话框 关于Qt对话框 |
其中warning()、information()、critical()、about()这几个函数的参数和用法想用,只是信息图标不同。
例如,warning()的函数原型是:
StandardButton QMessageBox :: warning( QWidget * parent , QString title, QString text , StandardButtons buttons = OK , StandardButton defaultButton = NoButton )
其中:
- parent:dlg的父窗口;指定父窗口后,打开dlg时,对话框将自动显示在父窗口正上方;
- title:标题
- text:显示内容
- buttons:dlg按钮,缺省时只有OK按钮;
- defaultButton:缺省选择按钮,缺省时表示没有选择。
warning()函数的返回结果是StandardButton类型。对话框上显示的按钮和缺省按钮也都是StandardButton类型。
StandardButton是各种按钮的定义,如OK、Yes、No、Cancel等,其枚举取值是QMessageBox::OK、QMessageBox::Cancel、QMessageBox:Close等。详见QT帮助文档中的StandardButton类型的说明。
对于warning()、information()、critical()、about()这几种对话框,它们一般只有一个OK按钮,且无需关心返回值,所以使用缺省的按钮设置即可。
以下是4中消息显示对话框:
下面是实现以上QMessageBox信息显示的代码:
void Dialog::on_btnMsgInformation_clicked() { QString dlgTitle="information信息框"; QString strInfo="文件已经打开,字体大小已设置"; QMessageBox::information(this,dlgTitle,strInfo, QMessageBox::Ok,QMessageBox::NoButton); } void Dialog::on_btnMsgWarning_clicked() { QString dlgTitle="warning消息框"; QString strInfo="文件内容已经被修改"; QMessageBox::warning(this,dlgTitle,strInfo); } void Dialog::on_btnMsgCritical_clicked() { QString dlgTitle="critical消息框"; QString strInfo="有不明程序访问网络"; QMessageBox::critical(this,dlgTitle,strInfo); } void Dialog::on_btnMsgAbout_clicked() { QString dlgTitle="about消息框"; QString strInfo="我开发的数据查看软件 V1.0 \n 保留所有版权"; QMessageBox::about(this,dlgTitle,strInfo); }
确认选择对话框
QMessageBox::question()函数用于打开一个选择对话框,提示信息,并且提供Yes、No、OK、Cancel等按钮,用户单击某个按钮返回选择,常见的文件保存对话框如下图所示:
静态函数QMessageBox::question()的原型如下:
StandardButton QMessageBox :: question(QWidget * parent , QString title , QString text , StandardButton buttons = StandardButton( Yes|No ) , StandardButton defaultButton = NoButton )
question()对话框的关键是在其中选择显示多个按钮,例如同时显示Yes、No、OK、Cancel,其返回结果也是一个StandardButton类型变量,表示哪个按钮被单击了。
下面是产生如上图所示对话框的代码,并根据对话框选择结果进行了判断和显示:
void Dialog::on_btnMsgQuestion_clicked() { QString dlgTitle = "Question消息框"; QString strInfo = "文件已被修改,是否保存修改?"; QMessageBox::StandardButton defaultBtn=QMessageBox::NoButton;//缺省按钮 QMessageBox::StandardButton result;//返回选择的按钮 result=QMessageBox::question(this,dlgTitle,strInfo, QMessageBox::Yes|QMessageBox::No|QMessageBox::Cancel, defaultBtn); if(result==QMessageBox::Yes) ui->plainTextEdit->appendPlainText("Question消息框:Yes 被选择"); else if(result==QMessageBox::No) ui->plainTextEdit->appendPlainText("Question消息框:No 被选择"); else if(result==QMessageBox::Cancel) ui->plainTextEdit->appendPlainText("Question消息框:Cancel 被选择"); else ui->plainTextEdit->appendPlainText("Question消息框:无选择"); }
总结
1、文件对话框QFileDialog,可以通过对话框的方式,快速选择一个文件,基本用法流程:
QString curPath = QDir :: currentPath(); //当前目录的路径 QString title = "选择一个文件";//对话框标题 QString filter = "文本文件(*.txt);;图片文件(*.jpg,*.gif,*.png);;所有文件(*.*)";//文件类型过滤器 QString filename = QFileDialog :: getOpenFileName(this , title , curPath , filter);
其中第四行是就是通过前三行的参数打开一个文件对话框选择文件。
还可以用getOpenFileNames()选择一些文件,返回一个QStringList,List中的每个Item都是一个文件名。
还可以通过getSaveFileName()选择一个保存文件(即想要在之后在这个文件中存东西)。
2、颜色对话框QColorDialog,字体对话框QFontDialog;
3、标准输入对话框QInputDialog:可以以对话框的形式输入String、Int、Float、Item等:
用法主要是:
QString title = "dialog title"; QString label = "说明性文字"; bool ok = false; //不同输入时处理不同 //①String:getText() QString defaulttext = "default text"; QLineEdit :: EchoMode echoMode = QLineEdit::Normal;//设置输入模式,这里是正常文字输入 QLineEdit :: EchoMode echoMode = QLineEdit::Password;//密码模式 QString text = QInputDialog::getText(this,title,label,echoMode,defaulttext,&ok); //②int:getInt(),输入时用到了SpinBox组件 int defaultValue = 6; int minValue=3 , maxValue=50 , stepValue=1;//范围和步长 int inputValue = QInputDialog::getInt(this,title,label,defaultValue,minValue,maxValue,stepValue,&ok); //③float:getDouble(),用到了DoubleSpinBox组件 float defaultValue = 3.13; float minValue=0,maxValue=10000; int decimal=2;//小数点位数 float inputValue = QInputDialog::getDouble(this,title,label,defaultValue,minValue,maxValue,decimal,&ok); //④item:getItem():从ComboBox提供的下拉列表中选择输入 QStringList items;//combobox列表内容 items<<"优秀"<<"良好"<<"合格"<<"不合格"; int curIndex=0;//初始项 bool editable=true;//combobox是否可编辑 bool ok=false; QString text = QInputDialog::getItem(this,title,label,items,curIndex,editable,&ok);