标准对话框
标准对话框有五类,分别是文件对话框(QFileDialog)、颜色对话框(QColorDialog)、字体对话框(QFontDialog)、输入对话框(InputDialog )、消息对话框(QMessageBox),通过不同种类的标准对话框打开对应的形式的对话框,此文章简单介绍对话框的类型和使用方法
一、文件对话框QFileDialog
如图:
以下代码定义了一个dialogBox类,现在设想以下需要做的功能
功能:点击部件,槽方法响应打开标准文件对话框,并且能选择指定类型的文件,将所选文件的文件路径输出到窗体界面的QLineEdit行编辑器中
class dialogBox : public QDialog
{
Q_OBJECT
public:
dialogBox(QWidget *parent = nullptr);
~dialogBox();
private slots:
void ShowDialogFile();
private:
Ui::dialogBox *ui;
QPushButton *m_fileBtn; //打开文件对话框
QLineEdit *m_fileLineEdit; //显示所选文件路径
QGridLayout *m_mainLayout; //布局管理器
};
第一步:点击部件,槽方法响应打开标准文件对话框
dialogBox::dialogBox(QWidget *parent)
: QDialog(parent)
, ui(new Ui::dialogBox)
{
ui->setupUi(this);
setWindowTitle("文件标准对话框");
m_fileBtn=new QPushButton("打开文件");
m_fileLineEdit=new QLineEdit(this);
m_mainLayout=new QGridLayout(this);
m_mainLayout->addWidget(m_fileBtn,0,0);
m_mainLayout->addWidget(m_fileLineEdit,0,1);
connect(m_fileBtn,&QPushButton::clicked,this,&dialogBox::ShowDialogFile);
//这行代码可要可不要
//setLayout(m_mainLayout);
}
dialogBox::~dialogBox()
{
delete ui;
}
第二步:槽方法的实现
槽函数:void dialogBox::ShowDialogFile()
getOpenFileName()方法介绍:
QFileDialog文件对话框的功能:
QFileDialog文件对话框类调用getOpenFileName(),QFileDialog::getOpenFileName()这个方法是打开文件夹,并选中文件,选中文件后返回所选文件的路径
第一个参数:父窗口,意思是打开的文件对话框的窗体是当前的窗体,并不会多产一个窗体
第二个参数:文件对话框的窗体标签
第三个参数:目录,用 " . "表示是打开的默认路径
第四个参数:过滤通过字符串要查找的文件,要添加文件后缀,例如:(.h),要过滤多种文件就要添加多个后缀,用" ;; "来分开,如C++ files(.cpp);;C files(.c);😭.txt)
个人理解"C++ files(.cpp),"C++ files"部分表示下拉目录的显示文本,是字符串,
"(.cpp)"是文件的后缀即文件类型
以下是代码实现
void dialogBox::ShowDialogFile()
{
QString str=QFileDialog::getOpenFileName(this,
"标准文件打开对话框",
".",
"C++ files(*.cpp);;C files(*.c);;header files(*.h)");
//qDebug()<<str;此处可以尝试打印
//将获取的文件路径设置给行编辑器
m_fileLineEdit->setText(str);
}
此行代码是实现选择目录文件:
使用QFileDialog::getExistingDirectory()来打开目录对话框并选择目录文件
QString path=QFileDialog::getExistingDirectory(this,
"选择目录",
".");
第三步:很简单,将获取的文件路径设置给行编辑器m_fileLineEdit
m_fileLineEdit->setText(str);
效果展示:
二、颜色对话框QColorDialog
如图:
所实现的功能:通过点击一个部件,然后打开颜色对话框,之后进行颜色的选择,将颜色填充到部件之中,以下代码定义了一个dialogBox类
class dialogBox : public QDialog
{
Q_OBJECT
public:
dialogBox(QWidget *parent = nullptr);
~dialogBox();
private slots:
void ShowColorFrame();//打开颜色对话框的槽方法
private:
Ui::dialogBox *ui;
QPushButton *m_colorBtn;
QFrame *m_colorFrame; //显示所选颜色效果,是无边框
QGridLayout *m_mainLayout; //布局管理器
};
第一步:点击按钮,槽方法响应,然后打开标准颜色对话框
dialogBox::dialogBox(QWidget *parent)
: QDialog(parent)
, ui(new Ui::dialogBox)
{
ui->setupUi(this);
setWindowTitle("文件标准对话框");
m_colorBtn=new QPushButton("颜色标准对话框");
m_colorFrame=new QFrame;
m_colorFrame->setFrameStyle(QFrame::Box);//设置边框风格为Box
m_colorFrame->setAutoFillBackground(true); //设置可以自动填充背景的属性
m_mainLayout=new QGridLayout(this);
m_mainLayout->addWidget(m_colorBtn,0,0);
m_mainLayout->addWidget(m_colorFrame,0,0);
connect(m_colorBtn,&QPushButton::clicked,this,&dialogBox::ShowColorFrame);
setLayout(m_mainLayout);
}
此处使用的无边框类QFrame,要对其填充,首先要设置好他的风格和属性
这里设置为QFrame::Box,设置可以自动填充背景
第二步:槽方法的实现
槽函数:void dialogBox::ShowColorFrame()
getColor()方法介绍:
QColorDialog颜色对话框类,QColorDialog颜色对话框调用getColor()方法就会出现一个可选的颜色面板,当选择其中的颜色后,此QColorDialog::getColor()就会返回像素值,其参数就是默认的颜色
void dialogBox::ShowColorFrame()
{
QColor color=QColorDialog::getColor(Qt::yellow);//默认颜色是yello
//判断颜色是否合法
if(color.isValid()){
m_colorFrame->setPalette(QPalette(color));
}
}
将颜色填充到无边框的对话框中,首先先设置一个setPalette调色板的颜色,以color给初始化
效果图:
三、字体对话框QFontDialog
如图:
功能:点击部件,打开标准字体对话框,然后选择字体样式和字体大小,再将原来QLineEdit的内容以选择的字体输出,以下代码定义了一个dialogBox类
class dialogBox : public QDialog
{
Q_OBJECT
public:
dialogBox(QWidget *parent = nullptr);
~dialogBox();
private slots:
void ShowFont();
private:
Ui::dialogBox *ui;
QPushButton *m_fontBtn; //打开字体对话框
QLineEdit *m_fontLineEdit; //显示所选字体的效果
QGridLayout *m_mainLayout; //布局管理器
};
第一步:定义槽方法,点击部件,槽方法响应打开标准字体对话框
dialogBox::dialogBox(QWidget *parent)
: QDialog(parent)
, ui(new Ui::dialogBox)
{
ui->setupUi(this);
setWindowTitle("文件标准对话框");
m_fontBtn=new QPushButton("字体标准对话框");
m_fontLineEdit=new QLineEdit("独断万古,一叶遮天");
m_mainLayout=new QGridLayout(this);
m_mainLayout->addWidget(m_fontBtn,0,0);
m_mainLayout->addWidget(m_fontLineEdit,0,1);
connect(m_fontBtn,&QPushButton::clicked,this,&dialogBox::ShowFont);
setLayout(m_mainLayout);
}
第二步:槽函数的实现
槽函数:void dialogBox::ShowFont()
getFont()方法介绍:
QFontDialog字体对话框,QFontDialog字体对话框类调用getFont()方法就会打开选择字体的面板,字体标准对话框,有字体样式,字体大小,返回值是字体
void dialogBox::ShowFont()
{
bool ok;
QFont font = QFontDialog::getFont(&ok);
if(ok){
//m_fontLineEdit设置字体
m_fontLineEdit->setFont(font);
}
}
效果图:
四、输入对话框InputDialog
假如要设计一个界面,且界面上点击部件就能打开标准信息输入对话框,并且能对信息进行编辑、选择,想要的效果如图:
功能:
修改姓名:点击修改姓名,就会弹出一个姓名编辑的对话框,然后将修改的姓名输出的原来的部件中
修改年龄:点击修改性别,然后会弹出一个选择的"男"、"女"的条目,将选择的条目输出到原来的部件
修改年龄:点击修改年龄,就会弹出输入整型的输入框,将输入的年龄输出到原来的部件
修改成绩:点击修改成绩,这里是使用Double类型,成绩可有小数,将修改的成绩输出到原来的部件
步骤一:定义InputDialog 类,在类中定义了很多部件,同时也定义了四个按钮的槽函数
class InputDialog : public QDialog
{
Q_OBJECT
public:
InputDialog(QWidget *parent=0);
private slots:
void ChangeName();
void ChangeSex();
void ChangeAge();
void ChangeScore();
private:
QLabel *m_nameTitle; //姓名
QLabel *m_sexTitle; //性别
QLabel *m_ageTitle; //年龄
QLabel *m_scoreTitle; //成绩
QLabel *m_nameLabel; //对应的名字标签
QLabel *m_sexLabel; //对应的性别标签
QLabel *m_ageLabel; //对应的年龄标签
QLabel *m_scoreLabel; //对应的成绩标签
QPushButton *m_nameBtn; //修改姓名按钮
QPushButton *m_sexBtn; //修改性别按钮
QPushButton *m_ageBtn; //修改年龄按钮
QPushButton *m_scoreBtn;//修改成绩按钮
QGridLayout *m_layout; //布局管理器
};
步骤二:将部件进行初始化,并用布局管理器进行部件的管理,然后设置点击按钮与槽的连接
connect(m_nameBtn,&QPushButton::clicked,this,&InputDialog::ChangeName);
connect(m_sexBtn,&QPushButton::clicked,this,&InputDialog::ChangeSex);
connect(m_ageBtn,&QPushButton::clicked,this,&InputDialog::ChangeAge);
connect(m_scoreBtn,&QPushButton::clicked,this,&InputDialog::ChangeScore);
步骤三:槽函数的实现
(一)getText()输入单行文字
槽函数:void ChangeName();
实现功能:打开标准输入对话框,让用户进行姓名的编辑,并且将编辑的姓名文本信息设置到原来的m_nameLabel姓名标签中
QInputDialog::getText()方法介绍:
//QInputDialog::getText()打开字符串输入框,返回值是QString类型字符串
//第一个参数是父窗口
//第二个参数是打开的标准输入框窗口的标题
//第三个是提示标签
//第四个参数是编辑的方式
//第五个参数是编辑的控件的文本信息
void InputDialog::ChangeName()
{
bool ok;
QString Sname = QInputDialog::getText(this,
"标准字符串输入对话框",
"请编辑姓名",QLineEdit::Normal,
m_nameLabel->text(),&ok);
//判断是否调用成功,并且输入的名字是否空的
if(ok && !Sname.isEmpty()){
//将编辑的名字赋给m_nameLabel
m_nameLabel->setText(Sname);
}
}
效果图:
(二)getItem()从条目中选择输入
槽函数:void InputDialog::ChangeSex()
实现功能:点击修改性别按钮,就会打开标准输入对话框,对话框中对性别修改的部分可选择其中的条目,将选择的条目的文本设置到m_sexLabel标签中
QInputDialog::getItem()方法介绍:
//QInputDialog::getItem()打开条目输入框,返回的是字符串QString
//使用标准输入对话框QInputDialog,调用getItem()方法
//第一个参数是父窗口,第二个参数是打开窗口的标签,
//第三个参数是提示标签,第四个参数是条目
//第五个参数是,当前选第几个条目,默认设为0
//第六个参数是条目是否能编辑,这是是不能,只能选择,所以使用false;
//第七个参数是bool,表示保存是否成功
void InputDialog::ChangeSex()
{
QStringList sexList;
sexList<<"男"<<"女"<<"未知";
bool ok;
QString sex=QInputDialog::getItem(this,
"标准条目输入对话框",
"请选择性别:",
sexList,
0,
false,
&ok);
if(ok && !sex.isEmpty()){
m_sexLabel->setText(sex);
}
}
效果图:
(三)getInt()输入整型数据
槽函数:void InputDialog::ChangeAge()
实现的功能:点击修改年龄,就会打开整数输入框进行年龄的编辑,将编辑的年龄输出到m_ageLabel标签中
QInputDialog::getInt()介绍:
//获取整数的标准输入对话框,QInputDialog::getInt()返回的是用户编辑的年龄,int类型
//第一个参数是父窗口,第二个参数是打开窗口的标题,
//第三个参数是提示标签,
//第四个参数是值,可以给一个默认值,这里是m_ageLabel->text()的文本,然后转为int类型
//第五个参数是,最小值,设置为0
//第六个参数是最大值
//第七个参数是步长
//第七个参数是保存成不成功
void InputDialog::ChangeAge()
{
bool ok;
int age=QInputDialog::getInt(this,
"标准int数据类型输入对话框",
"请编辑年龄",
m_ageLabel->text().toInt(),
0,
120,
1,
&ok);
if(ok){
m_ageLabel->setText(QString::number(age));
}
}
效果图:
(四)getInt()输入浮点数
槽函数:void InputDialog::ChangeScore()
功能实现:点击修改成绩,就会打开标准输入对话框,进行对成绩的编辑(成绩有小数)所以设置成绩的编辑支持小数,将修改的成绩设置到m_scoreLabel标签中
QInputDialog::getDouble()方法介绍:
//QInputDialog::getDouble()打开Double标准输入框,返回值是Double类型
//第一个参数是父窗口,第二个参数是打开窗口的标题,
//第三个参数是提示标签
//第四个参数当前需要编辑的Double类型的数据
//第五个参数是编辑数据的最小值
//第六个参数是编辑数据的最大值
//第七个参数是精度,就是小数点的位数
void InputDialog::ChangeScore()
{
bool ok;
double score=QInputDialog::getDouble(this,
"成绩标准输入对话框",
"请编辑分数",
m_scoreLabel->text().toDouble(),
0,
100,
1,
&ok);
if(ok){
m_scoreLabel->setText(QString::number(score));
}
}
效果图:
五、消息对话框QMessageBox
如图,要设计一个对话框,然后点击不同QPushButton按钮就会打开不同点对话框,这个项目实现了上图中六种消息对话框,实现此方法也要使用信号与槽,将信号和槽方法连接,关于部件在布局管理器的添加不再描述
步骤一:实现类的创建,槽方法和部件的定义
class QMsgBoxDlg : public QDialog
{
Q_OBJECT
public:
QMsgBoxDlg(QWidget *parent=0);
private slots:
void ShowQuestionMsDlg();
void ShowInforMsDlg();
void ShowWrMsDlg();
void ShowCrMsDlg();
void ShowAbMsDlg();
void ShowAbQtMsDlg();
private:
QLabel *m_tipLable;
QPushButton *m_questuinBtn; //问题对话框
QPushButton *m_informationBtn; //信息消息对话框
QPushButton *m_waringBtn; //警告对话框
QPushButton *m_criticalBtn; //错误对话框
QPushButton *m_aboutQtBtn; //关于Qt对话框
QPushButton *m_aboutBtn; //关于对话框
QGridLayout *m_mainLayout; //布局管理器
};
步骤二:信号和槽函数的连接
connect(m_questuinBtn,&QPushButton::clicked,this,&QMsgBoxDlg::ShowQuestionMsDlg);
connect(m_informationBtn,&QPushButton::clicked,this,&QMsgBoxDlg::ShowInforMsDlg);
connect(m_waringBtn,&QPushButton::clicked,this,&QMsgBoxDlg::ShowWrMsDlg);
connect(m_criticalBtn,&QPushButton::clicked,this,&QMsgBoxDlg::ShowCrMsDlg);
connect(m_aboutBtn,&QPushButton::clicked,this,&QMsgBoxDlg::ShowAbMsDlg);
connect(m_aboutQtBtn,&QPushButton::clicked,this,&QMsgBoxDlg::ShowAbQtMsDlg);
步骤三:信息框槽方法的实习
(一)question()询问并获取是否确认的消息框
槽函数:void QMsgBoxDlg::ShowQuestionMsDlg()
QMessageBox::question()介绍:
//问题消息框有个特定就是有一个大问号图标
//QMessageBox::question()返回用户所选择的结果,按键是枚举值,返回值是按键
//第一个参数:this作为副窗口
//第二个参数:问题消息框的标题
//第三个参数:显示的文本
//第四个参数:标准的按钮,有取消,确认等多个按钮
//第五个参数:默认选择的按钮,这里设置了Ok,如果不设置按钮,那么默认为Ok
void QMsgBoxDlg::ShowQuestionMsDlg()
{
m_tipLable->setText(“提示消息框”);
int res=QMessageBox::question(this,
“问题消息框”,
“您已打开问题消息框,是否关闭”,
QMessageBox::Ok | QMessageBox::Cancel,
QMessageBox::Ok);
switch (res) {
case QMessageBox::Ok:
m_questuinBtn->setText(“问题消息框–确定”);
break;
case QMessageBox::Cancel:
m_tipLable->setText(“问题消息框–取消”);
break;
default:
break;
}
}
效果图:
(二)information()信息消息框
槽函数:void QMsgBoxDlg::ShowInforMsDlg()
QMessageBox::information()介绍:
//QMessageBox::information()返回用户所选择的结果,枚举值,就是按钮的值
//第一个参数:this作为副窗口
//第二个参数:信息消息框的标题
//第三个参数:显示的文本
//第四个参数:标准的按钮,有取消,确认等多个按钮
//第五个参数:默认选择的按钮,这里设置了Ok,没有设置按钮的,其自动默认是Ok
//信息消息框一般只弹出一个信息,不需要做其他处理,所以可直接关闭窗口,不需要按钮
//并且信息消息框是模态的,必须关闭当前窗体才能进行下一步的操作
void QMsgBoxDlg::ShowInforMsDlg()
{
m_tipLable->setText("信息消息框");
QMessageBox::information(this,
"信息提示框",
"这是信息提示框,我也不知道该留下什么信息!",
QMessageBox::Ok | QMessageBox::Cancel);
}
效果图:
(三)warning()警告消息框
槽函数:void QMsgBoxDlg::ShowInforMsDlg()
QMessageBox::warning()介绍:
//警告消息框的特点有一个警告的黄色图标
//QMessageBox::warning()返回用户所选择的结果,枚举值,就是按钮的值
//第一个参数:this作为副窗口
//第二个参数:警告消息框的标题
//第三个参数:显示的文本
//第四个参数:标准的按钮,有取消,确认等多个按钮
//第五个参数:默认选择的按钮,这里设置了Ok
void QMsgBoxDlg::ShowWrMsDlg()
{
m_tipLable->setText("警告信息框");
int res=QMessageBox::warning(this,
"警告消息框",
"操作不合法,是否继续?",
QMessageBox::Ok | QMessageBox::No | QMessageBox::Discard,
QMessageBox::No);
switch (res) {
case QMessageBox::No:
m_tipLable->setText("用户取消下一步操作");
break;
case QMessageBox::Ok:
m_tipLable->setText("用户选择继续操作");
break;
case QMessageBox::Discard:
m_tipLable->setText("用户选择忽视警告");
break;
default:
break;
}
}
效果图:
(四)critical()错误消息框
槽函数:void QMsgBoxDlg::ShowCrMsDlg()
QMessageBox::critical()介绍:
//错误消息框的特点有一个红色的错误图标
//第一个参数:this作为副窗口
//第二个参数:信息消息框的标题
//第三个参数:显示的文本
//第四个参数:标准的按钮,有取消,确认等多个按钮
void QMsgBoxDlg::ShowCrMsDlg()
{
m_tipLable->setText("错误信息框");
QMessageBox::critical(this,"错误消息框","程序崩溃");
}
效果图:
(五)about()关于消息框
槽函数:void QMsgBoxDlg::ShowAbMsDlg()
QMessageBox::about()介绍:
//第一个参数:this作为副窗口
//第二个参数:信息消息框的标题
//第三个参数:显示的文本
//第四个参数:标准的按钮,有取消,确认等多个按钮
void QMsgBoxDlg::ShowAbMsDlg()
{
m_tipLable->setText("关于信息框");
QMessageBox::about(this,"关于消息框","关于网络编程的信息介绍");
}
效果图:
(六)aboutQt()关于Qt消息框
槽函数:void QMsgBoxDlg::ShowAbQtMsDlg()
QMessageBox::aboutQt()介绍:
//QMessageBox::aboutQt()
//第一个参数:this作为副窗口
//第二个参数:信息消息框的标题,
//关于Qt的信息框显示的文本不需要设置,此方法自动设置文本信息
void QMsgBoxDlg::ShowAbQtMsDlg()
{
m_tipLable->setText("关于Qt信息框");
QMessageBox::aboutQt(this,"关于Qt的消息框");
}
效果图:
(七)QMessageBox自定义的消息框
不使用以上的消息框,自己定义消息框的按钮,以及消息的图标等
自定义了一个类,类中定义槽函数
```cpp
class QMsgBoxDlg : public QDialog
{
Q_OBJECT
public:
QMsgBoxDlg(QWidget *parent=0);
private slots:
void ShowCustomDlg();
private:
QLabel *m_tipLable;
QPushButton *m_customBtn; //自定义的消息框
QLabel *m_customLabel; //自定义消息框标签
QGridLayout *m_mainLayout; //布局管理器
};
对部件进行初始化,且用布局管理器进行布局
这里对QLabel标签的边框风格进行设置
QMsgBoxDlg::QMsgBoxDlg(QWidget *parent):QDialog(parent)
{
this->setWindowTitle("标准信息对话框集合");
//构造部件
m_tipLable=new QLabel("请选择一种消息框");
m_customBtn=new QPushButton("自定义的消息框");
m_customLabel=new QLabel("使用自定义的消息框");
m_customLabel->setFrameStyle(QFrame::Panel | QFrame::Sunken);
m_mainLayout->addWidget(m_customBtn,7,0);
m_mainLayout->addWidget(m_customLabel,7,1);
connect(m_customBtn,&QPushButton::clicked,this,&QMsgBoxDlg::ShowCustomDlg);
}
槽函数void ShowCustomDlg()的实现
addButton()方法介绍:
//添加自定义的按钮,
//第一个参数是按钮的文本
//第二个参数是按钮的角色
setIconPixmap()方法介绍:
此方法是设置自定义消息框的图标,可以使用图标文件、图片文件
void QMsgBoxDlg::ShowCustomDlg()
{
m_customLabel->setText("自定义消息框");
QMessageBox customMsgBox;
customMsgBox.setWindowTitle("自定义消息框,不使用标准的消息框");
QPushButton *yes=customMsgBox.addButton("这是哪?",
QMessageBox::ActionRole);
//添加自定义的按钮
QPushButton *no=customMsgBox.addButton("你猜!",
QMessageBox::ActionRole);
//采用标准的cancel按钮
QPushButton *cancel=customMsgBox.addButton(QMessageBox::Cancel);
//设置自定义的图标;
customMsgBox.setIconPixmap(QPixmap("login.ico"));
customMsgBox.exec();
if(customMsgBox.clickedButton()==yes){
m_customLabel->setText("点了这是哪?");
}
if(customMsgBox.clickedButton()==no){
m_customLabel->setText("点了你猜");
}if(customMsgBox.clickedButton()==cancel){
m_customLabel->setText("点了标准按钮");
}
}
效果图: