在Qt中,对话框(Dialog)是一种常用的用户界面元素,用于与用户进行交互。Qt提供了多种类型的对话框,例如文件选择框、颜色框、字体框、输入框、消息对话框、自定义对话框等,以满足不同的需求。
文件对话框:
通过QFileDialog类允许用户遍历系统文件,选择一个或多个文件或目录
#ifndef QFILEDIALOGTEST_H
#define QFILEDIALOGTEST_H
#include <QDialog>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include <QHBoxLayout> // 水平布局
#include <QVBoxLayout> // 垂直布局
#include <QFileDialog>
class QFileDialogTest : public QDialog
{
Q_OBJECT
public:
QFileDialogTest(QWidget *parent = nullptr);
~QFileDialogTest();
private:
QLabel *FileNameLabel;
QLineEdit *FileNameLineEdit;
QPushButton *FileButton;
QLabel *FileSizeLabel;
QLineEdit *FileSizeLabelLineEdit;
QPushButton *GetFileInfoButton;
private slots:
void GetFileInfoFunc(); // 用于打开文件
void GetFileSizeFunc(); // 用于获取文件大小
};
#endif // QFILEDIALOGTEST_H
//=======================================================
#include "qfiledialogtest.h"
QFileDialogTest::QFileDialogTest(QWidget *parent)
: QDialog(parent)
{
// 1:创建控件
FileNameLabel=new QLabel("文件名称:");
FileNameLineEdit=new QLineEdit;
FileButton=new QPushButton("选择...");
FileSizeLabel=new QLabel("文件大小:");
FileSizeLabelLineEdit=new QLineEdit;
GetFileInfoButton=new QPushButton("获取文件大小信息");
// 2:排列布局
QGridLayout *glayout=new QGridLayout;
glayout->addWidget(FileNameLabel,0,0);
glayout->addWidget(FileNameLineEdit,0,1);
glayout->addWidget(FileButton,0,2);
glayout->addWidget(FileSizeLabel,1,0);
glayout->addWidget(FileSizeLabelLineEdit,1,1,1,2);
QHBoxLayout *hlayout=new QHBoxLayout;
hlayout->addWidget(GetFileInfoButton);
QVBoxLayout *vlayout=new QVBoxLayout(this);
vlayout->addLayout(glayout);
vlayout->addLayout(hlayout);
// 信号槽函数连接
connect(FileButton,SIGNAL(clicked()),this,SLOT(GetFileInfoFunc()));
connect(GetFileInfoButton,SIGNAL(clicked()),this,SLOT(GetFileSizeFunc()));
}
QFileDialogTest::~QFileDialogTest(){}
void QFileDialogTest::GetFileInfoFunc() // 用于打开文件
{
QString strFileName=QFileDialog::getOpenFileName(this,"打开","/","Files(*)");
FileNameLineEdit->setText(strFileName);
}
void QFileDialogTest::GetFileSizeFunc() // 用于获取文件大小
{
// 获取单行编辑框控件里面文件路径等
QString strFileNames=FileNameLineEdit->text();
QFileInfo fileinfo(strFileNames);
qint64 FileSize=fileinfo.size();
FileSizeLabelLineEdit->setText(QString::number(FileSize));
}
颜色对话框:
QColorDialog类提供标准的颜色对话框,不同的系统平台显示效果有所不同
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
#include <QPushButton>
#include <QFrame>
#include <QColorDialog>
#include <QGridLayout>
class Dialog : public QDialog
{
Q_OBJECT
public:
Dialog(QWidget *parent = nullptr);
~Dialog();
private:
QGridLayout *glayout;
QPushButton *colorbutton;
// QFrame类是基本控件的基类,QWidget是QFrame类型
QFrame *colorFrame;
private slots:
void dispcolorFunc();
};
#endif // DIALOG_H
//=================================================
#include "dialog.h"
Dialog::Dialog(QWidget *parent)
: QDialog(parent)
{
setWindowTitle("颜色对话框测试");
glayout=new QGridLayout(this); // new一个布局对象
colorbutton=new QPushButton("调用颜色对话框");
colorFrame=new QFrame;
colorFrame->setFrameShape(QFrame::Box); // 设置形状
colorFrame->setAutoFillBackground(true); // 填充背景处理
glayout->addWidget(colorbutton,0,0);
glayout->addWidget(colorFrame,1,0);
// 信号槽函数连接
connect(colorbutton,SIGNAL(clicked()),this,SLOT(dispcolorFunc()));
}
Dialog::~Dialog(){}
void Dialog::dispcolorFunc()
{
QColor colorvalues=QColorDialog::getColor(Qt::red);//打开一个颜色选择框对话框,并将默认选中颜色设置为红色
//QPalette是应用于QWidget及其派生类的,例如QPushButton、QLineEdit等;用于管理控件调色板(palette)的类。它定义了控件在不同状态(如正常、悬停、选中等)下的颜色和外观属性
if(colorvalues.isValid())//检查用户是否选择了有效的颜色
{
colorFrame->setPalette(QPalette(colorvalues));//setPalette来设置调色板
}
}
字体对话框:
Qt提供字体对话框选择(字体、字号、样式等)。
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
#include <QPushButton>
#include <QLineEdit>
#include <QFontDialog>
#include <QGridLayout>
class Dialog : public QDialog
{
Q_OBJECT
public:
Dialog(QWidget *parent = nullptr);
~Dialog();
private:
QGridLayout *glayout;
QPushButton *fontbutton;
QLineEdit *fontlineedit;
private slots:
void dispFontFunc();
};
#endif // DIALOG_H
//==============================================
#include "dialog.h"
Dialog::Dialog(QWidget *parent)
: QDialog(parent)
{
setWindowTitle("字体对话框测试");
glayout=new QGridLayout(this);
fontbutton=new QPushButton("调用字体对话框");
fontlineedit=new QLineEdit;
fontlineedit->setText("测试改变字体颜色大小");
glayout->addWidget(fontbutton,0,0);
glayout->addWidget(fontlineedit,0,1);
connect(fontbutton,SIGNAL(clicked()),this,SLOT(dispFontFunc()));
}
Dialog::~Dialog(){}
void Dialog::dispFontFunc()
{
bool bOk;
QFont font=QFontDialog::getFont(&bOk);
if(bOK)
fontlineedit->setFont(font);
}
输入对话框:
QInputDialog类中的控件由自己决定,方便定制开发使用
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
#include <QGridLayout>
#include <QLineEdit>
#include <QPushButton>
#include <QInputDialog>
class Dialog : public QDialog
{
Q_OBJECT
public:
Dialog(QWidget *parent = nullptr);
~Dialog();
private:
QGridLayout *glayout;
QPushButton *inputstudentnobutton;
QLineEdit *inputstudentnobuttonLineEdit;
QPushButton *inputstudentsexbutton;
QLineEdit *inputstudentsexbuttonLineEdit;
private slots:
void modifystudentnumber();
void modifystudentsex();
};
#endif // DIALOG_H
//================================================
#include "dialog.h"
Dialog::Dialog(QWidget *parent)
: QDialog(parent)
{
resize(300,130);
setWindowTitle("标准对话框测试");
// 布局
glayout=new QGridLayout(this);
inputstudentnobutton=new QPushButton;
inputstudentnobutton->setText("学号:");
inputstudentnobuttonLineEdit=new QLineEdit("00000001");
inputstudentsexbutton=new QPushButton;
inputstudentsexbutton->setText("性别:");
inputstudentsexbuttonLineEdit=new QLineEdit("男");
glayout->addWidget(inputstudentnobutton,0,0);
glayout->addWidget(inputstudentnobuttonLineEdit,0,1);
glayout->addWidget(inputstudentsexbutton,1,0);
glayout->addWidget(inputstudentsexbuttonLineEdit,1,1);
connect(inputstudentnobutton,SIGNAL(clicked()),this,SLOT(modifystudentnumber()));
connect(inputstudentsexbutton,SIGNAL(clicked()),this,SLOT(modifystudentsex()));
}
Dialog::~Dialog(){}
void Dialog::modifystudentnumber()
{
bool isbool;
QString strText=QInputDialog::getText(this,"标准输入对话框","请输入学号:",
QLineEdit::Normal,inputstudentnobuttonLineEdit->text(),&isbool);
if(isbool && !strText.isEmpty())
{
inputstudentnobuttonLineEdit->setText(strText);
}
}
void Dialog::modifystudentsex()
{
QStringList strSexItems;
strSexItems<<"男"<<"女";
bool isbool;
QString strsexItem=QInputDialog::getItem(this,"标准输入对话框",
"请选择性别:",strSexItems,0,false,&isbool);
if(isbool && !strsexItem.isEmpty())
{
inputstudentsexbuttonLineEdit->setText(strsexItem);
}
}
消息对话框:
Qt提供消息对话框,它是一个常用的对话框模式,专门用于显示和提示性消息,用户可通过单击标准按钮来响应用户需求。
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
#include <QLabel>
#include <QPushButton>
#include <QGridLayout>
#include <QMessageBox>
class Dialog : public QDialog
{
Q_OBJECT
public:
Dialog(QWidget *parent = nullptr);
~Dialog();
private:
QGridLayout *glayout;
QLabel *displabel;
QPushButton *questionbutton; // 问题消息框命令按钮
QPushButton *informationbutton; // 信息消息框命令按钮
QPushButton *warningbutton; // 警告消息框命令按钮
QPushButton *criticalbutton; // 错误消息框命令按钮
QPushButton *aboutbutton; // 关于消息框命令按钮
QPushButton *aboutqtbutton; //
private slots:
void displayquestionMsg();
void displayinformationMsg();
void displaywarningMsg();
void displaycriticalMsg();
void displayaboutMsg();
void displayaboutqtMsg();
};
#endif // DIALOG_H
//===============================================
#include "dialog.h"
Dialog::Dialog(QWidget *parent)
: QDialog(parent)
{
resize(320,150);
glayout=new QGridLayout(this);
displabel=new QLabel("请你选择一个消息框");
questionbutton=new QPushButton("questionMsg"); // 问题消息框命令按钮
informationbutton=new QPushButton("informationMsg"); // 信息消息框命令按钮
warningbutton=new QPushButton("warningMsg"); // 警告消息框命令按钮
criticalbutton=new QPushButton("criticalMsg"); // 错误消息框命令按钮
aboutbutton=new QPushButton("aboutMsg"); // 关于消息框命令按钮
aboutqtbutton=new QPushButton("aboutQtMsg"); //
glayout->addWidget(displabel,0,0,1,2);
glayout->addWidget(questionbutton,1,0);
glayout->addWidget(informationbutton,1,1);
glayout->addWidget(warningbutton,2,0);
glayout->addWidget(criticalbutton,2,1);
glayout->addWidget(aboutbutton,3,0);
glayout->addWidget(aboutqtbutton,3,1);
connect(questionbutton,SIGNAL(clicked()),this,SLOT(displayquestionMsg()));
connect(informationbutton,SIGNAL(clicked()),this,SLOT(displayinformationMsg()));
connect(warningbutton,SIGNAL(clicked()),this,SLOT(displaywarningMsg()));
connect(criticalbutton,SIGNAL(clicked()),this,SLOT(displaycriticalMsg()));
connect(aboutbutton,SIGNAL(clicked()),this,SLOT(displayaboutMsg()));
connect(aboutqtbutton,SIGNAL(clicked()),this,SLOT(displayaboutqtMsg()));
}
Dialog::~Dialog(){}
void Dialog::displayquestionMsg()
{
displabel->setText("question QMessageBox");
switch(QMessageBox::question(this,"Question消息框",
"你是否想退出程序应用,请选择?",QMessageBox::Ok|QMessageBox::Cancel,QMessageBox::Ok))
{
case QMessageBox::Ok:
displabel->setText("你选择questionMsg命令按钮当中的button/Ok!");
break;
case QMessageBox::Cancel:
displabel->setText("你选择questionMsg命令按钮当中的button/Cancel!");
break;
default:
break;
}
return ;
}
void Dialog::displayinformationMsg()
{
displabel->setText("information QMessageBox");
QMessageBox::information(this,"Information消息框","Information消息框测试成功");
return ;
}
void Dialog::displaywarningMsg()
{
displabel->setText("warning QMessageBox");
switch(QMessageBox::warning(this,"Warning消息框",
"是否删除,请注意操作安全?",
QMessageBox::Save|QMessageBox::Discard|QMessageBox::Cancel,QMessageBox::Save))
{
case QMessageBox::Save:
displabel->setText("选择button/Save!");
break;
case QMessageBox::Discard:
displabel->setText("选择button/Discard!");
break;
case QMessageBox::Cancel:
displabel->setText("选择button/Cancel!");
break;
default:
break;
}
return ;
}
void Dialog::displaycriticalMsg()
{
displabel->setText("critical QMessageBox");
QMessageBox::critical(this,"critical消息框","错误,请重新检查?");
return ;
}
void Dialog::displayaboutMsg()
{
displabel->setText("about QMessageBox");
QMessageBox::about(this,"about消息框","测试Qt about消息框");
return ;
}
void Dialog::displayaboutqtMsg()
{
displabel->setText("aboutQt QMessageBox");
QMessageBox::aboutQt(this,"aboutQt消息框测试");
return ;
}
自定义对话框:
自己制定一的QMessageBox框
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
#include <QMessageBox>
#include <QLabel>
#include <QGridLayout>
#include <QPushButton>
class Dialog : public QDialog
{
Q_OBJECT
public:
Dialog(QWidget *parent = nullptr);
~Dialog();
private:
QLabel *labelmsg,*labeldispmsg;
QPushButton *msgbutton;
QGridLayout *glayout;
private slots:
void customMsg();
};
#endif // DIALOG_H
//=============================================
#include "dialog.h"
Dialog::Dialog(QWidget *parent)
: QDialog(parent)
{
resize(300,110);
glayout=new QGridLayout(this);
labelmsg=new QLabel("自定义消息框");
msgbutton=new QPushButton("测试操作");
labeldispmsg=new QLabel("未测试状态");
glayout->addWidget(labelmsg,0,0);
glayout->addWidget(msgbutton,0,1);
glayout->addWidget(labeldispmsg,1,0,1,1);
connect(msgbutton,SIGNAL(clicked()),this,SLOT(customMsg()));
}
Dialog::~Dialog(){}
void Dialog::customMsg()
{
QMessageBox cMsgBox;
cMsgBox.setWindowTitle("自定义消息框");
// 添加按钮
QPushButton *yes=cMsgBox.addButton("YES",QMessageBox::ActionRole);
QPushButton *no=cMsgBox.addButton("NO",QMessageBox::ActionRole);
// 添加图标
cMsgBox.setIconPixmap(QPixmap("d:\\xxx.png"));
cMsgBox.exec();
// 判断用户点击按钮 yes no
if(cMsgBox.clickedButton()==yes)
{
labeldispmsg->setText("用户点击YES按钮");
}
else if(cMsgBox.clickedButton()==no)
{
labeldispmsg->setText("用户点击NO按钮");
}
}