一.信号与槽
1.信号连接信号
即当一个信号发出触发另一个信号发出
//当点击按钮时触发老师饿了的信号
connect(button,&QpushButton::clicked,teacher,&Teacher;:hungury);
//当发出老师饿了的信号时,就触发trea函数
connect(teacher,&Teacher;:hungury,student,&Student::trea);
2.重载槽函数和信号
//重载带参数的槽和信号
void hungury(QString food);
void trea(QString food);
//使用函数指针来指向重载的槽和信号,避免编译时连接槽和信号有歧义
void (Teacher::*teachersignal)(QString) = &Teacher;:hungury;
void (Teacher::*studentsignal)(QString) = &Student::trea;
connect(teacher,teachersignal,student,studentsignal);
3.注意事项
- 发送者和接收者需要是QObject的子类(槽函数为全局,lambda除外)
- 信号和槽函数返回值都是void
- 信号可以只声明不实现,但槽函数需要实现
- 使用emit放送信号
- 使用connect()函数连接信号和槽
- 信号和槽函数之间的参数类型需要一致;当槽函数的参数比信号少时可以不一致,但存在的参数的顺序与类型需要一致
- 槽断开连接使用disconnect函数
4.Lambda表达式
Lambda表达式用于定义并创建匿名的函数对象,用于简化编程工作
[capture](parameters) mutable->return-type{statement}
- []是引出符,capture捕获列表,用于捕获那些lambda表达式从头到结束之间的局部变量,其是不可省略的
- ()为参数列表,可以省略
- mutable可修改标示符,按值传递捕获列表时,加上mutable符后,可以修改按值传递进来的值,其是修改拷贝的值,不是修改传入的值;当使用该修饰符时参数列表的()不能省略,即使参数为空
- ->return-type为返回值类型,如果不需要可以省略
- {}为函数体
例子:
//在最后添加()可以执行该Lambda表达式
[](){
QDebug()<<"Lambda is running";
}();
connect(teacher,teachersignal,student,[](){
qDebug()<<"请吃饭";
});
二.QMainWindow
其是一个为用户提供主窗口程序的类,其包含一个菜单栏,多个工具栏,多个铆接部件,一个状态栏和一个中心部件。
1.菜单栏
其有菜单栏类QMenuBar、菜单类QMenu、菜单项类QAction
//创建菜单栏,无法显示
QMenuBar *menubar = new QMenuBar(this);
//创建菜单栏的方法二:当存在菜单栏时返回菜单栏的地址
//QMenuBar *menubar = menuBar();
//在窗口中显示菜单栏
this->setMenuBar(menubar);
//创建菜单
QMenu *menu1 = new QMenu("文件");
//将菜单添加到菜单栏中
menubar->addmenu(menu1)
//创建菜单项
QAction *action1 = new QAction("打开文件");
//在菜单中添加菜单项
menu1->addAction(action1);
2.工具栏
其有工具栏类QToolBar,工具栏子类QAction
QToolBar *toolbar = new QToolBar(this);
this->addToolBar(toolbar);
//默认其工具栏在右边
//this->addToolBar(QT::RightToolBarArea,toolbar);
toolbar->addAction(action1);
2.1 属性:
- setMovable(false)工具栏不可移动,默认为是可以移动
- setAllowedAreas()设置其工具栏的停靠区域,参数有QT::LeftToolBarArea、QT::RightToolBarArea、QT::TopToolBarArea、QT::BottomToolBarArea和QT::AllToolBarArea,参数用 | 符号隔开
3.状态栏
其有状态栏类QStatusBar
//创建状态栏
QStatusBar *statusbar = new QStatusBar(this);
//QStatusBar *statusbar = QStatusBar();
this->setStatusBar(statusbar);
//增加临时信息,数值表示显示时间,当没有数值时为一直显示
statusbar->showMessage("页面显示成功",3000);
//添加正式信息,一般位于状态左边
QLabel *label1 = new QLabel("打开文件",this)
statusbar->addWidget(label1);
//添加永久信息(一般位于状态栏右侧)
statusbar->addPermanentWidget(label1);