Qt应用程序开发框架
一、信号 和 槽
观察者模式 信号 槽:处理函数
信号 和 槽: 是QT框架引以为豪的,实际上就是观察者模式,一种简易方式
使用connect函数 可以为信号 及 槽 建立好连接,当信号广播(触发)时做出相应的处理
信号来自于被观察者, 槽来自于观察者 例如:老师(信号 被观察者)说下课了,学生(槽 观察者)做出相应的动作
信号 Signals:函数声明,无需实现 系统大多数类都内置了信号,开发者也可以自定义信号
槽 Slots: 本质是函数,一般是类的成员函数,包括虚函数、普通函数等;必须有声明且有实现体,系统大多数类也内置了槽,开发者也可以自定义槽
例子:
当最大化按钮被点击时,窗口变为最大化
观察者:窗口
被观察者:最大化按钮
信号:点击
槽:变最大化
用法:
connect(被观察者,信号,观察者,槽); QT内置函数,专门用于连接信号和槽 //用法一
connect(被观察者,信号,Lamda表达式匿名函数); //用法二
connect(被观察者,SIGNAL(信号函数),观察者,SLOT(槽函数)); //用法三,QT4之前的老版本
#include "widget.h"
#include <QPushButton>//按钮控件
#include <QDebug>
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
//定义最大化按钮 (被观察者)
auto btnMax = new QPushButton("最大化", this);
//this窗口 (观察者)
//建立信号 和 槽 连接
connect(btnMax, &QPushButton::clicked, this, &QWidget::showMaximized);
//点击最小化
auto btnMin = new QPushButton("最小化", this);
btnMin->move(100, 0);
connect(btnMin, &QPushButton::clicked, this, &QWidget::showMinimized);
//点击正常
auto btnNormal = new QPushButton("正常", this);
btnNormal->move(200, 0);
connect(btnNormal, &QPushButton::clicked, this, &QWidget::showNormal);
//设置一个按钮
//鼠标按下,打印 aaa
//鼠标抬起,打印 bbb
auto btn = new QPushButton("测试", this);
//当按钮点击时,调用Lamda表达式函数
connect(btn, &QPushButton::pressed, []()->void{
qDebug() << "aaa---";
});
connect(btn, &QPushButton::released, []()->void{
qDebug() << "bbb---";
});
}
Widget::~Widget()
{
}
二、Lamba函表达式
C++11新特性:
nullptr 空指针
auto 自动类型
Lamda表达式 匿名函数
for each 新循环遍历方式
返回值 函数名(参数表){}
Lamda表达式定义函数
[可访问外部变量](参数表)->返回值{ 函数体 }
[变量名1, 变量名2...] (){} 指定部分变量访问
[=](){} 值传递形式捕获所有外部变量(内部无法改变实际变量)
[&](){} 引用形式捕获所有外部变量(可以改变实际变量)
#include "widget.h"
#include <QPushButton>//按钮控件
#include <QDebug>
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
//设置一个按钮
//鼠标按下,打印 aaa
//鼠标抬起,打印 bbb
auto btn = new QPushButton("测试", this);
//当按钮点击时,调用Lamda表达式函数
connect(btn, &QPushButton::pressed, []()->void{
qDebug() << "aaa---";
});
connect(btn, &QPushButton::released, []()->void{
qDebug() << "bbb---";
});
//匿名函数,函数指针
int num = 250, num2 = 360;
[num, num2]()->void{
qDebug() << " aaa! ";
qDebug() << num;
qDebug() << num2;
}();
[&]()->void
{
num = 900;
qDebug() << num;
}();
void (*pFun)();
pFun = []()->void
{
qDebug() << " aaa! ";
};
pFun();
//指针指向 Lamda函数*********
int num0 = 1;
void(*pFunction)(int&) = [](int& n)->void{
n = 250;
qDebug() << n;
};
pFunction(num0);
qDebug() << num0;
}
Widget::~Widget()
{
}
三、其他控件使用信号 和 槽 实例
QLabel 文本控件 QSlider 滑动条控件 QProgressBar 进度条控件 QTextEdit 文本编辑框控件
#include "widget.h"
#include <QPushButton>//按钮控件
#include <QDebug>
#include <QLabel>//文本控件
#include <QSlider>//滑动条控件
#include <QProgressBar>//进度条控件
#include <QTextEdit>//文本编辑框控件
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
//----------简单的常用控件
//文字控件
QLabel* label = new QLabel;
label->setParent(this);
label->move(0, 100);
label->setText("文本信息?");
label->setFont(QFont("楷体", 20, 10, 1));
//滑动条控件
QSlider* slider = new QSlider;
slider->setParent(this);
slider->move(300, 100);
slider->setValue(0);//设置滑动条值
slider->setMaximum(100);//设置滑动条最大值
//通过滑动滑动条,改变字体大小
connect(slider, &QSlider::valueChanged, [label](int _value){
label->setFont(QFont("楷体", _value, 10, 1));
label->resize(500 + _value, _value + 100);
});
//进度条控件
QProgressBar* proBar = new QProgressBar;
proBar->setParent(this);
proBar->move(0, 400);
proBar->resize(this->size().width(), 50);
proBar->setValue(0);
//通过滑动滑动条,改变进度条进度
connect(slider, &QSlider::valueChanged, [proBar](int _value){
proBar->setValue(_value);
});
//文本编辑框
QTextEdit* edit = new QTextEdit;
edit->setParent(this);
edit->move(0, 300);
edit->resize(200, 200);
edit->setFontUnderline(1);//设置文字下划线
edit->setFontPointSize(qreal(50));//设置字体大小 qreal double
edit->setText("编辑框测试");
//通过编辑文本框,改变Laber文本内容
connect(edit, &QTextEdit::textChanged, [label, edit](){
QString text = edit->toPlainText();//获取文本内容
label->setText(text);
});
//补充:老版本QT4之前的 信号 和 槽 的绑定方式
//connect(被观察者, 信号);
//例如:点击按钮,打印文字
auto btn10 = new QPushButton("老版本测试按钮", this);
btn10->move(500, 500);
connect(btn10, SIGNAL(clicked()), this, SLOT(showMaximized()));
}
Widget::~Widget()
{
}