信号和槽:是QT框架引以为豪的东西,实际上就是观察者模式,使用connect函数可以为 信号和槽 建立好连接,当信号触发时,槽做出相应处理
观察者模式:比如说,老师在给学生上课,当老师发出下课信号,这时学生就可以处理自己的事情(买零食,说话,接水,,,,)
信号来自于 被观察者(老师),槽来自于 观察者(学生)
信号(Signal):函数声明,无需实现;系统大多数类都内置了信号,开发者也可以自定义信号
槽(Slot):本质也是个函数,一般是类的成员函数,必须有声明且有实现;系统大多数类都内置了槽,开发者也可以自定义槽
connect使用:
connect(被观察者,信号,观察者,槽);
connect(被观察者,信号,Lamda表达式匿名函数);
connect(被观察者,SIGNAL(信号),观察者,SLOT(槽函数));//老版本用法
指用户看到的所有可视化界面以及界面中的各个元素,比如按钮、文本框、输入框等。其实上次所说的按钮也是一个控件,他包含在不同的头文件中,比如说:
1. #include <QPushButton> //QT中按钮的头文件,按钮控件
2. #include <QLabel> //文本控件
3. #include<QSlider> //滑动条控件
4. #include <QProgressBar>//进度条控件
5. #include <QTextEdit>//文本编辑框控件
创建3个按钮,分别是 最大化,最小化,正常化,点击这三个按钮分别给出不同的反应,和平常我们的使用一样(最大化,最小化,正常化)。
#include "Widget.h"
#include //QT中按钮的头文件,按钮控件
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
this->setWindowTitle("Start"); //设置窗口标题
//创建按钮
QPushButton* btnMax = new QPushButton("最大化",this);//自动释放
auto btnMin = new QPushButton("最小化",this);
btnMin->move(100,0);//防止两个按钮重合
auto btnNorm = new QPushButton("正常",this);
btnNorm->move(200,0);//防止两个按钮重合
//建立链接(最大化,最小化,正常)
connect(btnMax,&QPushButton::clicked,this,&QWidget::showMaximized);
connect(btnMin,&QPushButton::clicked,this,&QWidget::showMinimized);
connect(btnNorm,&QPushButton::clicked,this,&QWidget::showNormal);
}
Widget::~Widget()
{
}
设置按钮:鼠标按下,打印文本1;鼠标抬起,打印文本2
这里用到了lamada表达式以后介绍。
#include "Widget.h"
#include //QT中按钮的头文件,按钮控件
#include //文本打印
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
this->setWindowTitle("Start"); //设置窗口标题
//练习1:设置按钮:鼠标按下,打印文本1;鼠标抬起,打印文本2
QPushButton* btn = new QPushButton("点击",this);
btn->move(300,200);
//建立连接,当点击按钮时,调用Lamda表达式
connect(btn,&QPushButton::pressed,[]()->void{
qDebug()<<"中奖了!";});
connect(btn,&QPushButton::released,[]()->void{
qDebug()<<"好开心!";});
}
Widget::~Widget()
{
}
通过滑动滑动条,改变字体大小(没有改变字体的槽,用lamda表达式)
#include "Widget.h"
#include //QT中按钮的头文件,按钮控件
#include //文本控件
#include //滑动条控件
#include //进度条控件
#include //文本编辑框控件
#include
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
this->setWindowTitle("Start"); //设置窗口标题
//常用控件:(便于信号和槽之间的连接)
//文本控件
QLabel *laber= new QLabel;
laber->setParent(this);
laber->move(0,100);
laber->setText("前方路窄,方显英雄本色");
laber->setFont(QFont("楷体",20,10,1));
//滑动条控件
QSlider* slider = new QSlider;
slider->setParent(this);
slider->move(300,100);
slider->setValue(0);//设置滑动条的值
slider->setMaximum(100);
//练习2:通过滑动滑动条,改变字体大小(没有改变字体的槽,用lamda表达式)
connect(slider,&QSlider::valueChanged,[laber](int _value)->void{
laber->setFont(QFont("楷体",_value,10,1));
laber->resize(500+_value,_value+100);
});
}
Widget::~Widget()
{
}
通过滑动条改变进度条案例
#include "Widget.h"
#include //QT中按钮的头文件,按钮控件
#include //文本控件
#include //滑动条控件
#include //进度条控件
#include //文本编辑框控件
#include
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
this->setWindowTitle("Start"); //设置窗口标题
//常用控件:(便于信号和槽之间的连接)
//文本控件
QLabel *laber= new QLabel;
laber->setParent(this);
laber->move(0,100);
laber->setText("前方路窄,方显英雄本色");
laber->setFont(QFont("楷体",20,10,1));
//滑动条控件
QSlider* slider = new QSlider;
slider->setParent(this);
slider->move(300,100);
slider->setValue(0);//设置滑动条的值
slider->setMaximum(100);
//通过滑动滑动条,改变字体大小(没有改变字体的槽,用lamda表达式)
connect(slider,&QSlider::valueChanged,[laber](int _value)->void{
laber->setFont(QFont("楷体",_value,10,1));
laber->resize(500+_value,_value+100);
});
//进度条控件
QProgressBar* probar = new QProgressBar;
probar->setParent(this);
probar->move(0,300);
probar->resize(this->size().width(),20);//跟随窗口大小的宽
probar->setValue(0);
//probar->setMaximum(99);
//通过滑动条改变进度条案例
connect(slider,&QSlider::valueChanged,[probar](int _value)->void{
probar->setValue(_value);
});
}
Widget::~Widget()
{
}
通过编辑文本框,改变Laber文本内容
#include "Widget.h"
#include //QT中按钮的头文件,按钮控件
#include //文本控件
#include //滑动条控件
#include //进度条控件
#include //文本编辑框控件
#include
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
this->setWindowTitle("Start"); //设置窗口标题
//常用控件:(便于信号和槽之间的连接)
//文本控件
QLabel *laber= new QLabel;
laber->setParent(this);
laber->move(0,100);
laber->setText("前方路窄,方显英雄本色");
laber->setFont(QFont("楷体",20,10,1));
//滑动条控件
QSlider* slider = new QSlider;
slider->setParent(this);
slider->move(300,100);
slider->setValue(0);//设置滑动条的值
slider->setMaximum(100);
//通过滑动滑动条,改变字体大小(没有改变字体的槽,用lamda表达式)
connect(slider,&QSlider::valueChanged,[laber](int _value)->void{
laber->setFont(QFont("楷体",_value,10,1));
laber->resize(500+_value,_value+100);
});
//进度条控件
QProgressBar* probar = new QProgressBar;
probar->setParent(this);
probar->move(0,300);
probar->resize(this->size().width(),20);//跟随窗口大小的宽
probar->setValue(0);
//probar->setMaximum(99);
//通过滑动条改变进度条案例
connect(slider,&QSlider::valueChanged,[probar](int _value)->void{
probar->setValue(_value);
});
//文本编辑框控件
QTextEdit* texte = new QTextEdit;
texte->setParent(this);
texte->move(0,350);
texte->resize(200,200);
texte->setFontUnderline(1);
texte->setFontPointSize(qreal(35.5));
texte->setText("莫愁前路无知己");
//通过编辑文本框,改变Laber文本内容
connect(texte,&QTextEdit::textChanged,[laber,texte]()->void{
QString text = texte->toPlainText();//获取文本
laber->setText(text);
});
}
Widget::~Widget()
{
}