3.Lambda表达式
格式:[capture] (parameters) mutable -> return-type {statement}
(1)[ ]标识一个Lambda的开始,这部分必须存在,不能省略
(2)()参数列表,如果不需要传递参数的话,()可以一同省略
(3)如果使用mutable,参数列表()不能省略,即使参数为空。如果使用mutable修改拷贝,值本身不变。
(4) -> return-type返回值类型,如果不需要可以省略;
(5){statement}函数体,可以使用参数列表,也可以使用捕获列表;
1)传参Lambda
#include <iostream> using namespace std; int main() { int a = 1, b = 2; auto A1 = [](int x, int y)->int {return x + y; }; cout << A1(a, b); return 0; }
2)捕获列表(只读)
利用捕获列表传参
#include <iostream> using namespace std; int main() { int a = 1, b = 2; auto A1 = [a,b]()->int {return a + b; }; cout << A1(); return 0; }
此时不能修改a和b的值,因为默认传参方式是“=”,只有读权限,没有修改权限
#include <iostream> using namespace std; int main() { int a = 1, b = 2,c=3; auto A1 = [=]()->int {return a + b+c; }; cout << A1(); return 0; }
[=]将匿名函数范围内的所有局部变量捕获
2)捕获列表(修改)
#include <iostream> using namespace std; int main() { int a = 1, b = 2, c = 3; auto A1 = [&]()->int { a = 3, b = 3; return a + b + c; }; cout << "a=" << a << endl << "b=" << b << endl << "c=" << c << endl; cout << A1(); return 0; }
[&] 引用传值,因此可以改变值,但是改变的值是copy的值,函数外的值不改变。
#include <iostream> using namespace std; int main() { int a = 1, b = 2, c = 3; auto A1 = [=]()mutable->int { a = 3, b = 3; return a + b + c; }; cout << "a=" << a << endl << "b=" << b << endl << "c=" << c << endl; cout << A1(); return 0; }
4.MainWindow:提供对话框
一个菜单栏(menu bar),多个工具栏(tool bar),多个铆接部件(dock widgets)(浮动窗口),一个状态栏(status bar),一个中心部件(central widget)
1)菜单栏:
(1)菜单栏类QMenuBar:创建菜单栏
(2)菜单类QMenu:创建菜单
(3)QAction:充当子菜单
QMenuBar *menubar=new QMenuBar(this); //创建菜单栏两种方法 QMenuBar *menubar=menuBar(); this->setMenuBar(menubar); //添加到该页面中 QMenu *menu1=new QMenu("文件"); //创建菜单 menubar->addMenu(menu1) //将menu添加到menubar菜单栏中 QAction *act1=new QAction("打开文件"); //创建子菜单 menu1->addAction(act1); //将act1添加menu1子菜单中
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QMenuBar> #include <QMenu> #include <QAction> #include <QDebug> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { resize(800,600); ui->setupUi(this); // QMenuBar *menubar=new QMenuBar(this); QMenuBar *menubar=menuBar(); //创建菜单栏 this->setMenuBar(menubar); //创建菜单 QMenu *menu1=new QMenu("文件"); QMenu *menu2=new QMenu("编辑"); QMenu *menu3=new QMenu("构建"); QMenu *menu4=new QMenu("调试"); QMenu *menu5=new QMenu("Analyze"); QMenu *menu6=new QMenu("工具"); QMenu *menu7=new QMenu("控件"); QMenu *menu8=new QMenu("帮助"); menubar->addMenu(menu1); menubar->addMenu(menu2); menubar->addMenu(menu3); menubar->addMenu(menu4); menubar->addMenu(menu5); menubar->addMenu(menu6); menubar->addMenu(menu7); menubar->addMenu(menu8); QAction *act1=new QAction("新建文件"); QAction *act2=new QAction("打开文件"); QAction *act3=new QAction("另存为"); QAction *act4=new QAction("关闭"); QAction *act5=new QAction("最近访问文件"); QAction *act6=new QAction("保存文件"); QAction *act7=new QAction("打印"); QAction *act8=new QAction("退出"); menu1->addAction(act1); menu1->addAction(act2); menu1->addAction(act3); menu1->addAction(act4); menu1->addAction(act5); menu1->addAction(act6); menu1->addAction(act7); menu1->addAction(act8); connect(act1,&QAction::triggered,[=](){qDebug()<<"已新建文件";}); connect(act2,&QAction::triggered,[=](){qDebug()<<"已打开文件";}); connect(act3,&QAction::triggered,[=](){qDebug()<<"已另存为文件";}); connect(act4,&QAction::triggered,this,&MainWindow::close); connect(act5,&QAction::triggered,[=](){qDebug()<<"最近访问文件";}); connect(act6,&QAction::triggered,[=](){qDebug()<<"已保存文件";}); connect(act7,&QAction::triggered,[=](){qDebug()<<"打印文件";}); connect(act8,&QAction::triggered,[=](){qDebug()<<"退出";}); } MainWindow::~MainWindow() { delete ui; }
这样一个简易的菜单栏就写完了
点击就会执行自己定义的函数,接下来只需要真正保存,新建文件等函数就可以了,我只写了关闭,别的用Lambda代替,实测是可以的。