Qt 入门 4 之标准对话框
Qt提供了一些常用的对话框类型,它们全部继承自QDialog类,并增加了自己的特色功能,比如获取颜色、显示特定信息等。下面简单讲解这些对话框,可以在帮助索引中查看Standard Dialogs关键字,也可以直接索引相关类的类名。
- 本文将以一个新的项目为主介绍不同类型的对话框,新建Qt Widgets 应用程序,双击ui文件后添加按钮并修改文字显示:
- 颜色对话框
- 颜色对话框 QColorDialog 提供了一个可以获取指定颜色的对话框部件
- 设计模式下点击.ui文件,选中颜色对话框按钮,右键转到槽选中clicked() 后进入函数定义并修改如下:
void MyWidget::on_pushButton_clicked()
{QColor color=QColorDialog::getColor(Qt::red,this,tr("颜色对话框"));qDebug()<<"color:"<<color;
}
-
编译执行如下图,这里使用了 QColorDialog的静态函数getColor()来获取颜色,它的3个参数的作用分别是:设置初始颜色、指定父窗口和设置对话框标题。这里的Qt::red是Qt预定义的颜色对象,可以直接单击该字符串,然后按下F1查看其快捷帮助,或者在帮助索引中通过 Qt::GlobalColor 关键字,从而查看到所有的预定义颜色列表。**getColor()**函数返回一个 QColor类型数据。现在运行程序,然后单击“颜色对话框”按钮,如果不选择颜色,直接单击 OK,那么输出信息应该是QColor(ARGB1,1,0,0),这里的4个数值分别代表透明度(alpha)、红色(red)、绿色(green)和蓝色(blue)。它们的数值都是从0.0-1.0,有效数字为6位。对于alpha来说,1.0表示完全不透明,这是默认值,而0.0表示完全透明。对于三基色红、绿、蓝的数值,还可以使用0-255来表示,颜色对话框中就是使用这种方法。其中,0表示颜色最浅,255表示颜色最深。在0-255与0.0-1.0之间可以通过简单的数学运算来对应,其中0对应0.0,255对应1.0。
-
在颜色对话框中还可以添加对alpha的设置,就是在**getColor()**函数中再使用最后一个参数:
QColor color=QColorDialog::getColor(Qt::red,this,tr("颜色对话框"),QColorDialog::ShowAlphaChannel);
qDebug()<<"color:"<<color;
- 前边使用了
QColorDialog
类的静态函数来直接显示颜色对话框,好处是不用创建对象,但是如果想要更灵活的设置,则可以先创建对象,然后进行各项设置:
void MyWidget::on_pushButton_clicked()
{QColorDialog dialog(Qt::red,this); //创建对象dialog.setOption(QColorDialog::ShowAlphaChannel);dialog.exec(); //以模态方式运行对话框QColor color=dialog.currentColor();qDebug()<<"color:"<<color;
}
2.文件对话框
- 文件对话框QFileDialog类提供了一个允许用户选择文件或文件夹的对话框。继续在
mywidget.cpp
中添加#include<QFileDialog>
头文件,然后从设计模式转到“文件对话框”按钮的单击信号槽,并更改如下:
void MyWidget::on_pushButton_5_clicked()
{//将会打开默认盘中的后缀文件QString filename=QFileDialog::getOpenFileName(this,tr("文件对话框"),"D:",tr("图片文件(*png*jpg"));qDebug()<<"fileName:"<<filename;
}
- 这里使用了 QFileDialog类中的**getOpenFileName()**函数来获取选择的文件名,它的4个参数的作用分别是:指定父窗口设置对话框标题、指定默认打开的目录路径和设置文件类型过滤器。这个函数会以模态方式运行一个文件对话框。打开后选择一个文件,单击“打开”按钮后,这个函数便可以返回选择的文件的文件名。如果不指定文件过滤器,则默认选择所有类型的文件。这里指定了只选择png和jpg两种格式的图片
- 也支持同时选择其他类型的文件:
QString filename=QFileDialog::getOpenFileName(this,tr("文件对话框"),"D:",tr("图片文件(*png*jpg);;文本文件(*txt)"));
- 前边只支持选择单个文件,要同时选择多个文件,则可以使用getOpenFileNames()函数:
QStringList filenames=QFileDialog::getOpenFileNames(this,tr("文件对话框"),"F:",tr("图片文件(*png,jpg"));
- 运行程序就可以同时选择多个图片文件了,多个文件名存放在QStringList类型变量中。当然也可以不使用这些静态函数,而是建立对话框对象来操作。除了上面的两个函数外,QFileDialog类还提供了
getSaveFileName()
函数来实现保存文件对话框和文件另存为对话框,还有getExistingDirectory()
函数来获取一个已存在的文件夹路径。因为它们的用法与上面的例子类似,这里就不再举例。
- 字体对话框
- 字体对话框QFontDialog类提供了一个可以选择字体的对话框部件。先添加
#include <QFontDialog>
头文件,然后转到“字体对话框”按钮的单击信号槽,更改如下:
void MyWidget::on_pushButton_2_clicked()
{//ok用于标记是否单击了 OK 按钮bool ok;QFont font=QFontDialog::getFont(&ok,this);//如果单击OK按钮,那么让“字体对话框”按钮使用新字体//如果单击Cancel按钮,那么输出信息if(ok)ui->pushButton_2->setFont(font);elseqDebug()<<tr("没有选择字体!");
}
- 这里使用了QFileDialog类的 getFont() 静态函数来获取选择的字体。这个函数的第一个参数是bool类型变量,用来存放按下的按钮状态,比如在打开的字体对话框中单击了OK按钮,那么这里的ok就为true,这样来告诉程序已经选择了字体,如下图是选择了微软雅黑 14号字体的显示结果:
- 输入对话框
- 输入对话框 QInputDialog类用来提供一个对话框,可以让用户输入一个单一的数值或字符串。先添加头文件
#include <QInputDialog>
,然后进入“输人对话框”按钮的单击信号槽,更改如下:
void MyWidget::on_pushButton_6_clicked()
{bool ok;//获取字符串QString string = QInputDialog::getText(this,tr("输入字符串对话框"),tr("请输入用户名"),QLineEdit::Normal,tr("admin"),&ok);if(ok)qDebug()<<"string:"<<string;//获取整数int value = QInputDialog::getInt(this,tr("输入整数对话框"),tr("请输入-1000到1000之间的数值"),100,-1000,1000,10,&ok);if(ok)qDebug()<<"value:"<<value;//获取浮点数double value2=QInputDialog::getDouble(this,tr("输入浮点数对话框"),tr("请输入-1000到1000之间的数值"),0.00,-1000,1000,2,&ok);if(ok)qDebug()<<"value2:"<<value2;QStringList items;items<<tr("条目1")<<tr("条目2");//获取条目QString item=QInputDialog::getItem(this,tr("输入条目对话框"),tr("请选择或输入一个条目"),items,0,true,&ok);if(ok)qDebug()<<"item:"<<item;
}
- 分别使用不同的函数定义了输入不同类型的对话框,运行如下:
- 消息对话框
- 消息对话框QMessageBox类提供了一个模态的对话框来通知用户一些信息,或者向用户提出一个问题并且获取答案。先添加头文件#include,然后转到“消息对话框”按钮的单击信号槽中,添加如下代码:
void MyWidget::on_pushButton_3_clicked()
{//问题对话框int ret1 = QMessageBox::question(this,tr("问题对话框"),tr("你了解Qt吗?"),QMessageBox::Yes,QMessageBox::No);if(ret1 == QMessageBox::Yes)qDebug()<<tr("问题!");//提示对话框int ret2 = QMessageBox::information(this,tr("提示对话框"),tr("这是Qt书籍!"),QMessageBox::Ok);if(ret2 == QMessageBox::Ok)qDebug()<<tr("提示!");//警告对话框int ret3 = QMessageBox::warning(this,tr("警告对话框"),tr("不能提前结束!"),QMessageBox::Yes,QMessageBox::No);if(ret3 == QMessageBox::Abort)qDebug()<<tr("警告!");//错误对话框int ret4 = QMessageBox::critical(this,tr("严重错误对话框"),tr("发现一个严重错误!"),QMessageBox::Yes,QMessageBox::No);if(ret4 == QMessageBox::YesAll)qDebug()<<tr("错误!");//关于对话框QMessageBox::about(this,tr("关于对话框"),tr("Qt Creator 普及工作!"));
}
- 进度对话框
- 进度对话框 QProgressDialog对一个耗时较长操作的进度提供了反馈。先添加
#include <QProgressDialog>
头文件,然后转到“进度对话框”按钮的单击信号槽,更改如下:
void MyWidget::on_pushButton_7_clicked()
{QProgressDialog dialog(tr("文件复制进度"),tr("取消"),0,50000,this);dialog.setWindowTitle(tr("进度对话框")); //设置窗口标题dialog.setWindowModality(Qt::WindowModal); //将对话框设置为模态dialog.show();for(int i=0;i<50000;i++) //演示复制进度{dialog.setValue(i); //设置进度条的当前值QCoreApplication::processEvents(); //避免界面冻结//QThread::sleep(1);if(dialog.wasCanceled())break;}dialog.setValue(50000); //这样才显示100%,因为for循环中少加了一个数qDebug()<<tr("复制结束!");
}
- 错误信息对话框
- 错误信息对话框QErrorMessage类提供了一个显示错误信息的对话框。首先打开
mywidget.h
文件添加类前置声明:
class QErrorMessage;
- 然后添加私有对象:
ErrorMessage *errordlg;
- 下面到
mywidget.cpp
添加头文件#include <QErrorMessage>
,并在构造函数中添加如下代码:
errordlg=newQErrorMessage(this);
- 然后从设计模式转到“错误信息对话框”按钮的单击信号槽添加代码
void Mywidget::on pushButton 7 clicked()
{errordlg->setwindowTitle(tr("错误信息对话框"));errordlg->showMessage(tr("这里是出错信息!”));
}
- 运行如下:
- 向导对话框
- 向导对话框QWizard类提供了一个设计向导界面的框架。对于向导对话框,读者应该已经很熟悉了,比如安装软件时的向导和创建项目时的向导。QWizard之所以被称为框架,是因为它具有设计一个向导全部的功能函数,可以使用它来实现想要的效果。Qt中包含了 Trivial Wizard、License Wizard和Class Wizard这3个示例程序,可以参考一下。
- 打开
mywidget.h
文件,然后添加头文件#include <QWizard>
,在MyWidget 类的声明中添加private类型函数声明:
QWizardPage* createPage1();QWizardPage* createPage2();QWizardPage* createPage3();
- 这里声明了3个返回值为QWizardPage类对象的指针函数,用来生成3个向导页面。然后在
mywidget.cpp
文件中对这3个函数进行定义:
QWizardPage* MyWidget::createPage1()
{QWizardPage* page=new QWizardPage;page->setTitle(tr("介绍"));return page;
}
QWizardPage* MyWidget::createPage2()
{QWizardPage* page=new QWizardPage;page->setTitle(tr("用户选择信息"));return page;
}
QWizardPage* MyWidget::createPage3()
{QWizardPage* page=new QWizardPage;page->setTitle(tr("结束"));return page;
}
- 在各个函数中分别新建了向导页面,并且设置了它们的标题。下面转到“向导对话框”按钮的单击信号槽中,更改如下:
void MyWidget::on_pushButton_8_clicked()
{QWizard wizard(this);wizard.setWindowTitle(tr("向导对话框"));wizard.addPage(createPage1()); //添加向导对话框wizard.addPage(createPage2());wizard.addPage(createPage3());wizard.exec();
}
- 运行如下: