目录
对话框分为非模块和模块对话框:区别在于是否只在目前窗口操作。
首先设定菜单:
QMenuBar *mBar = menuBar();
setMenuBar(mBar);//设定一下菜单栏,但没有这一行好像也行
QMenu *menu = mBar->addMenu("对话框");
QAction *a1 = menu->addAction("模态对话框");
模块对话框:
QAction *a1 = menu->addAction("模态对话框");
connect(a1, &QAction::triggered,
[=]()
{
QDialog dlg;//创建对话框
dlg.exec();//等待用户操作
//qDebug()<<"111";
}
);
非模块对话框:
QAction *a2 = menu->addAction("非模态对话框");
connect(a2, &QAction::triggered,
[=]()
{
QDialog dlg;//创建对话框
dlg.show();
qDebug()<<"111";
}
);
这时会发现根本没有对话框出现,因为dlg的生命周期只在表达式内。
要想解决这个问题:1)设定成员变量 ,生命周期与主程序一致 2)动态分配空间 new 程序结束时释放。
但是第二种方法又个有问题,如果该按钮点击多次,内存越占越多;虽然可以不指定父对象解决,但是不指定父对象又无法自动释放,只能手动释放。
但又可以通过设定属性解决。
解决方法:
connect(a2, &QAction::triggered,
[=]()
{
// QDialog dlg;//创建对话框
// dlg.show();
// qDebug()<<"111";
QDialog *p = new QDialog(this);
p->setAttribute(Qt::WA_DeleteOnClose);//关闭时释放
p->show();
}
标准对话框
预先设定有一些按钮的模板,可以按以下方式查看各种标准对话框:
选择的时候注意枚举类型和函数的区别
QAction *a3 = menu->addAction("关于对话框");
connect(a3, &QAction::triggered,
[=]()
{
QMessageBox::about(this,"about","关于Qt");//标题和内容
}
);
问题对话框:
可以有两个选项,对不同的选项进行不同处理;
查看返回值的参数值:
QAction *a4 = menu->addAction("问题对话框");
connect(a4, &QAction::triggered,
[=]()
{
int ret = QMessageBox::question(this,"question","是否保存?");
//也可以指定选择项:
/*int ret = QMessageBox::question(this,,"question","是否保存?",
QMessageBox::Ok |
QMessageBox::Cancel
);*/
switch(ret)
{
case QMessageBox::Yes:
qDebug() << "i am OK";
break;
case QMessageBox::No:
qDebug() << "i am bad";
break;
default:
break;
}
}
);
文件对话框:
QAction *a5 = menu->addAction("文件对话框");
connect(a5, &QAction::triggered,
[=]()
{
QString path = QFileDialog::getOpenFileName(
this, //父对象
"open", //
"../", //上级目录
"source(*.cpp *.h);;" //筛选文件类型
"Text(*.txt);;all(*.*)"
);//字符串可以换行,qt补全,自动连接
qDebug() << path;
}
);
codes:
#include "mainwindow.h"
#include <QMenuBar>
#include <QMenu>
#include <QAction>
//对话框
#include <QDialog>
#include <QDebug>
//标准对话框
#include <QMessageBox>
//文件对话框
#include <QFileDialog>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
QMenuBar *mBar = menuBar();
setMenuBar(mBar);//设定一下菜单栏,但没有这一行好像也行
QMenu *menu = mBar->addMenu("对话框");
QAction *a1 = menu->addAction("模态对话框");
connect(a1, &QAction::triggered,
[=]()
{
QDialog dlg;//创建对话框
dlg.exec();//等待用户操作
//qDebug()<<"111";
}
);
QAction *a2 = menu->addAction("非模态对话框");
connect(a2, &QAction::triggered,
[=]()
{
// QDialog dlg;//创建对话框
// dlg.show();
// qDebug()<<"111";
QDialog *p = new QDialog(this);
p->setAttribute(Qt::WA_DeleteOnClose);//关闭时释放
p->show();
}
);
QAction *a3 = menu->addAction("关于对话框");
connect(a3, &QAction::triggered,
[=]()
{
QMessageBox::about(this,"about","关于Qt");//标题和内容
}
);
QAction *a4 = menu->addAction("问题对话框");
connect(a4, &QAction::triggered,
[=]()
{
int ret = QMessageBox::question(this,"question","是否保存?");
//也可以指定选择项:
/*int ret = QMessageBox::question(this,,"question","是否保存?",
QMessageBox::Ok |
QMessageBox::Cancel
);*/
switch(ret)
{
case QMessageBox::Yes:
qDebug() << "i am OK";
break;
case QMessageBox::No:
qDebug() << "i am bad";
break;
default:
break;
}
}
);
QAction *a5 = menu->addAction("文件对话框");
connect(a5, &QAction::triggered,
[=]()
{
QString path = QFileDialog::getOpenFileName(
this, //父对象
"open", //
"../", //上级目录
"source(*.cpp *.h);;" //筛选文件类型
"Text(*.txt);;all(*.*)"
);//字符串可以换行,qt补全,自动连接
qDebug() << path;
}
);
}
MainWindow::~MainWindow()
{
}