一、菜单栏和工具栏
需要include QMenuBar, QMenu
工具栏中可以存放菜单栏中的快捷键
添加菜单栏、工具栏、状态栏、文本编辑区、浮动窗口
#include <QToolBar>
#include <QAction>
#include <QDebug>
#include <QPushButton>
MyWindow::MyWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MyWindow)
{
ui->setupUi(this);
/**
=======添加菜单栏=====
*/
// 菜单栏
QMenuBar *mBar = menuBar();
// 添加菜单
QMenu *pFile = mBar->addMenu("文件");
// 添加菜单项
QAction *pNew = pFile->addAction("新建");
// 给新建按钮添加Lambda触发函数表达式
connect(pNew, &QAction::triggered,
[=](){
qDebug() << "新建被按下";
});
// 两个按钮之间添加分割线
pFile->addSeparator();
QAction *pOpen = pFile->addAction("打开");
connect(pOpen, &QAction::triggered,
[=](){
qDebug() << "打开被按下";
});
/**
=======添加工具栏, 菜单栏的快捷键=====
*/
QToolBar *toolBar = addToolBar("toolBar");
// 工具栏添加快捷键(将菜单栏中的按钮以及功能直接添加过来)
toolBar->addAction(pNew);
// 添加图标按钮的 快捷键
QPushButton *b = new QPushButton(this);
b->setText("(#^.^#)");
toolBar->addWidget(b);
connect(b, QPushButton::clicked,
[=](){
b->setText("^_^");
});
/**
============状态栏==========
*/
QStatusBar *sBar = statusBar(); // 这里的statusBar的状态栏使用默认的const
QLabel *label = new QLabel();
label->setText("Normal text file");
// addWidget默认从左往右添加
sBar->addWidget(label);
sBar->addWidget(new QLabel("2", this));
// 从右往左添加
sBar->addPermanentWidget(new QLabel("3", this));
/**
============核心控件, 文本编辑区==========
*/
QTextEdit *textEdit = new QTextEdit();
setCentralWidget(textEdit); // 给主窗口中间设置控件
/**
============核心控件, 浮动窗口==========
*/
QDockWidget *dock = new QDockWidget(this);
addDockWidget(Qt::LeftDockWidgetArea,dock); // Qt添加的位置
QTextEdit *editArea = new QTextEdit(this);
dock->setWidget(editArea);
}
二、模态对话框和非模态对话框
- 模态对话框:点开对话框后不能操作其他对话框
- 非模态:点开对话框后还可以操作其他对话框
- 模态对话框实现
QMenuBar *mBar = menuBar();
QMenu *menu = mBar->addMenu("对话框");
QAction *p1 = menu->addAction("模态对话框");
// 添加模态对话框
connect(p1, &QAction::triggered,
[=](){
QDialog dlg;
dlg.exec();
qDebug() << "1111";
});
- 非模态对话框不采用阻塞的 exec(),而是使用 show()方法,但是如果在lambda表达式中直接类似于上面方法创建,对话框会随着lambda表达式结束而退出,因此不能采用局部变量,或者使用动态分配空间
connect(p2, &QAction::triggered,
[=](){
// dlg2是在.h文件中声明过的 Dialog dlg2;
dlg2.show();
// 程序结束后才释放内存,但是这种方法不好,如果多次点击会申请很多次空间并且每次申请完都得等程序结束才会释放
QDialog *dlg3 = new QDialog(this);
dlg3->show();
// 对话框关闭就会释放
QDialog *dlg4 = new QDialog(); // 不指定父对象
dlg4->setAttribute(Qt::WA_DeleteOnClose); // 关闭对话框就释放
dlg4->show();
qDebug() << "结束" ;
});
}
三、标准对话框和文件对话框
普通对话框
问题对话框:根据定义的全局变量来判断点击的是确定还是取消按钮
文件对话框:参数可以设置点击功能后打开的初始路径, 选择过滤的文件类型
QAction *p3 = menu->addAction("关于对话框");
connect(p3, &QAction::triggered,
[=](){
QMessageBox::about(this, "about", "关于qt");
});
QAction *p4 = menu->addAction("问题对话框");
connect(p4, &QAction::triggered,
[=](){
// 返回的是按钮按完后的枚举类型
int ret = QMessageBox::question(this, "question", "Are you ok?");
switch(ret){
case QMessageBox::Yes:
qDebug() << "OK";
break;
case QMessageBox::Cancel:
qDebug() << "Canel";
break;
default:
break;
}
});
QAction *p5 = menu->addAction("文件对话框");
connect(p5, &QAction::triggered,
[=](){
// 参数: 操作的父对象,名称,路径
QString path = QFileDialog::getOpenFileName(
this,
"open",
"../",
"souce(*.cpp *.h);;Text(*.txt);;all(*.*)"
);
qDebug() << path;
});