信号与槽函数概念:
信号与槽函数是QT编程的基础,信号指的是在特定条件下被发射出去的事件,比如QPushButton最常见的信号就是鼠标单击信号。当信号被发出去之后,我们需要对这个信号进行响应处理,而这个响应信号处理函数就是槽函数了,槽函数可以和信号相关联,当信号被发送,槽函数自动执行。
//connect(信号的发送者,发送的信号,信号的接收者,接收者执行的槽函数)
首先在.h中申明函数
private slots:
void on_clicked_btn1();
//第一种写法
//connect(ui->btn1.&QPushButton::clicked .this,&widget::on_clicked_btn1);
//第二种写法
connect(ui->btn1,SIGNAL(clicked()),this,SLOT(on_clicked_btn1()));
通过信号和槽函数发送信息
//1:自定义信号,通俗的讲 谁触发发送信号事件就在谁那里写
//自定义信号 --信号也是一个函数,但是这个函数不需要去实现
signals://信号的声明
void dataChange(QString acount);
//2:自定义槽函数
public slots:在接收者头文件中创建
void setData(QString acount);
//3:连接,信号与槽的关联
void MyWin::on_Sing_in_clicked()
{
//this是为了等下跳转页面的时候返回原页面而给的指针
MainWindow *my = new MainWindow(this);
connect(this,&MyWin::dataChange,my,&MainWindow::setData);
//发射信号,可以带参数
//emit是发射信号的关键字
//格式 emit 信号(参数);
emit dataChange(ui->id->text());
my->show();
this->hide();
}
总结:
信号和槽中,槽函数的调用是通过信号来完成,所以槽函数的参数类型要跟信号函数的参数类型保持一致
槽的参数个数不大于信号的参数个数
槽函数的调用,必须要跟对应的信号建立连接关系,通过connect函数来实现连接
一个信号可以跟多个槽函数相关联
多个信号可以执行同一个槽函数
一个信号可以跟另一个信号相关联
使用信号与槽函数机制必须在类的声明中添加Q_OBJECT宏,因为只有标记该宏的头文件才能让元对象编译器去处理
槽函数可以当作普通函数使用
QWidget *parent = this->parentwidget();
dynamic_cast<TeacherMWin>(parent); //强转为TeacherMWin类型
QLabel标签:
作用:1、显示文本,用于提示
2、显示图像(静态图像(png bmp jpeg) 动态图像(gif));
显示静态图像:
QPixmap pic("F:/qt_project/333.bmp"); //QPixmap是一个图片类
//根据显示图像的控件大小 (label的大小)动态 调整图片的大小
pic = pic.scaled(ui->label->size()); //有返回值
ui->label->setPixmap(pic);
显示动态图像
QMovie *movie = new QMovie("F:/qt_project/111.gif"); //QMovie 是QT的电影 或者动画类
movie->start(); //启动动画
//根据显示动画的控件大小 (label的大小)动态 调整动画的大小
movie->setScaledSize(ui->label->size()); //无返回值
ui->label->setMovie(movie);
创建一个工程,将图片放进去,可以在不同主机上运行显示图片:
Add new->Qt->Qt Resourse file->Add Prefix(生成路径)->Add Files(加载图片进工程)->保存->右击工程图片复制路径,写入代码的路径区。
进度条,水平滑动条,垂直滑动条:
input Widgets->horizontal Slider(水平滑动条)
input Widgets->vertical Slider(垂直滑动条)
Display Widgets->progress Bar(进度条)
获取滑动条数据方式:
void Widget::on_verticalSlider_red_sliderMoved(int position)
{
QString red = QString::number(position); //将int类型转换为QString类型
ui->lineEdit_red->setText(red);
}
setStyleSheet(); //修改样式表 函数
当遇到多个按钮槽函数执行的都是相同的功能,可以将这多个按钮的单击信号都关联同一个槽函数
for(int i = 0; i<m_List.size(); i++)
{
connect(m_List.at(i),&QPushButton::clicked,this,&Widget::on_btn_1_clicked);
}
void Widget::on_btn_1_clicked()
{
//1、确定这个槽函数 到底是 哪个按钮(信号的发送者) 触发的
QPushButton *sender = (QPushButton*)this->sender();
//2、获取按钮的颜色样式
QString sty = sender->styleSheet();
//生效于测试框
ui->label_color->setStyleSheet(sty);
}
定时器的基本使用
包含头文件和 创建定时器对象
创建槽函数,并且关联timeout信号
启动定时器,并指定间隔发送信号的时间
停止定时器
#include "widget.h"
#include "ui_widget.h"
//m_time在类中定义
QTimer *m_time;
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
m_time = new QTimer;
//关联槽函数
connect(m_time, &QTimer::timeout, this, &Widget::on_updataUI_timeout);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_updataUI_timeout()
{
static int val = 0;
ui->label->setText(QString::number(val++));
}
void Widget::on_pushButton_clicked()
{
m_time->start(1000);//打开定时器
}
void Widget::on_pushButton_2_clicked()
{
m_time->stop(); //停止定时器
}