目录
对话框20201023
新建:Qt Widgets Application
项目名称:DialogExample
类名:Dialog
基类:QDialog
选择“创建界面”
成果先展示:
1.文件对话框
//【1】标准文件对话框
fileBtn = new QPushButton; //创建QPushButton类新对象,初始化新控件对象
fileBtn->setText(tr("1 文件对话框"));
filelineEdit = new QLineEdit; //创建QLineEdit类新对象
mainLayout = new QGridLayout(this); //网格布局,带this:表示
mainLayout->addWidget(fileBtn,0,0);
mainLayout->addWidget(filelineEdit,0,1);
//事件关联
connect(fileBtn,SIGNAL(clicked()),this,SLOT(showFile())); //【1】获取文件名
//【1】显示文件
void Dialog::showFile()
{
QString s = QFileDialog::getOpenFileName(this,"打开文件对话框","/","C++ files(*.cpp);;C files(*.c);;Head files(*.h)");
//静态函数getOpenFileName(父窗口,标题名,默认目录,文件类型过滤(过滤器之间用;;隔开))——获取所选文件的文件名并显示
filelineEdit->setText(s);
}
2.颜色对话框
//【2】标准颜色对话框
colorBtn = new QPushButton;
colorBtn->setText(tr("2 颜色对话框"));
colorFrame = new QFrame;
colorFrame->setFrameShape(QFrame::Box);
colorFrame->setAutoFillBackground(true);//背景
mainLayout->addWidget(colorBtn,1,0);
mainLayout->addWidget(colorFrame,1,1);
//事件关联
connect(colorBtn,SIGNAL(clicked()),this,SLOT(showColor())); //【2】获取颜色
//【2】显示颜色
void Dialog::showColor()
{
QColor c = QColorDialog::getColor(Qt::blue);
//静态函数getColor()获取所选颜色,默认为白色。
if(c.isValid())
colorFrame->setPalette(QPalette(c)); //如果选择颜色有效,则设置所选颜色setPalette()
}
3.字体对话框
//【3】标准字体对话框
fontBtn = new QPushButton;
fontBtn->setText(tr("3 字体对话框"));
fontlineEdit = new QLineEdit;
fontlineEdit->setText(tr("不同字体的显示"));
mainLayout->addWidget(fontBtn,2,0);
mainLayout->addWidget(fontlineEdit,2,1);
//事件关联
connect(fontBtn,SIGNAL(clicked()),this,SLOT(showFont())); //【3】获取字体
//【3】显示字体
void Dialog::showFont()
{
bool ok;
QFont f = QFontDialog::getFont(&ok);
//静态函数getFont(带参数)获取所选字体
if(ok)
fontlineEdit->setFont(f); //设置所选字体setFont()
}
4.输入对话框
//【4】标准输入对话框
inputBtn = new QPushButton;
inputBtn->setText(tr("4 输入对话框"));
mainLayout->addWidget(inputBtn,3,0); //布局设计
//事件关联
connect(inputBtn,SIGNAL(clicked()),this,SLOT(showInputDlg())); //【4】获取输入信息
//【4】显示输入对话框
void Dialog::showInputDlg()
{
inputDlg = new InputDlg(this); //用类定义对象,创建输入对话框 //带有this
inputDlg->show(); //并列打开新对话框
}
新增类InputDlg有单独的源文件inputdlg.cpp和头文件inputdlg.h,代码另附。
小问题及解决办法:
Q: 为什么我照抄代码,点击4个按钮却没有任何反应呢?
A: inputdlg.h类定义里少写了一个Q_OBJECT
作用:Q_OBJECT是个宏,作用是启动Qt5元对象系统的一些特性(如支持信号和槽等)。它必须放在类定义的私有区中
5.消息对话框
新建C++类(*.pro右击添加类)
类名:MsgBoxDlg
基类:Custom
//事件关联
connect(MsgBtn,SIGNAL(clicked()),this,SLOT(showMsgDlg())); //【5】获取消息
//【5】显示消息对话框
void Dialog::showMsgDlg()
{
msgDlg = new MsgBoxDlg(); //用类定义对象,创建消息对话框并显示
msgDlg->show();
}
新增类MsgBoxDlg有单独的源文件imsgboxdlg.cpp和头文件msgboxdlg.h,代码另附。
小问题及解决办法:
(1)出现以下expected class-name before '{' token { ^这种错误
出现的原因:QDialog 是灰色的,没有包含头文件 #include <QDialog>
(2)出现以下undefined reference to 'MsgBoxDlg::staticMetaObject'这种错误
分析原因:msgboxdlg.h里加了Q_OBJECT,却发生了这样的错误,去掉Q_OBJECT,所报错误也就没有了。但最终,Q_OBJECT是必须得有的。
建议解决办法:删除之前生成的编译文件夹,重新编译生成并运行软件。
6.自定义消息对话框
//事件关联
connect(CustomBtn,SIGNAL(clicked()),this,SLOT(showCustomDlg()));//【6】自定义消息
//【6】显示自定义消息对话框
void Dialog::showCustomDlg()
{
label->setText(tr("自定义消息框"));
QMessageBox customMsgBox;
customMsgBox.setWindowTitle(tr("用户自定义消息框"));
QPushButton *yesBtn = customMsgBox.addButton(tr("Yes"),QMessageBox::ActionRole);
QPushButton *noBtn = customMsgBox.addButton(tr("No"),QMessageBox::ActionRole);
QPushButton *cancelBtn = customMsgBox.addButton(QMessageBox::Cancel);
//addButton()函数:addButton(按钮显示文字,按钮类型),消息框按照调用addButton()函数的先后顺序由左至右的排布
customMsgBox.setText(tr("这是用户自定义消息框(带图片)"));
customMsgBox.setIconPixmap(QPixmap("Manage.bmp")); //图标:放在编译路径build-XXX-Debugbuild-DialogExample-unknown-Debug文件夹下。
customMsgBox.exec();//显示自定义消息框
if(customMsgBox.clickedButton()==yesBtn)
label->setText("自定义消息框/Yes");
if(customMsgBox.clickedButton()==noBtn)
label->setText("自定义消息框/No");
if(customMsgBox.clickedButton()==cancelBtn)
label->setText("自定义消息框/Cancel");
return;
}
涉及函数:
addButton()函数:addButton(按钮显示文字,按钮类型),消息框按照调用addButton()函数的先后顺序由左至右的排布