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