h5企业模板网站模板下载,雄安智能网站建设,兰州网站建设lst0931,汕头百度搜索排名优化目录
信号槽
1. 概念
2. 函数原型
3. 连接方式
3.1 自带信号 → 自带槽
3.2 自带信号 → 自定义槽
3.3 自定义信号
4. 信号槽传参
5. 对应关系
5.1 一对多
5.2 多对一 信号槽 1. 概念 之前的程序界面只能看#xff0c;不能交互#xff0c;信号槽可以让界面进行人机…目录
信号槽
1. 概念
2. 函数原型
3. 连接方式
3.1 自带信号 → 自带槽
3.2 自带信号 → 自定义槽
3.3 自定义信号
4. 信号槽传参
5. 对应关系
5.1 一对多
5.2 多对一 信号槽 1. 概念 之前的程序界面只能看不能交互信号槽可以让界面进行人机交互。 信号槽是Qt在C基础上新增的特性类似于其他编程中的回调机制其目的是实现对象之间的通信。 使用信号槽需要具备两个先决条件 通信的对象必须继承自QObject QObject是Qt所有对象的基类内部规定了Qt最基础的对象特性。 类中要包含Q_OBJECT宏 2. 函数原型 信号槽的建立是通过connect函数实现的。 // 信号槽连接函数
// 参数1发射者因发起的对象n.
// 参数2信号函数因的动作v.需要使用SIGNAL()包裹函数名称
// 参数3接收者果执行的对象n.
// 参数4槽函数果的动作v.需要使用SLOT()包裹函数名称
QObject::connect(const QObject * sender, const char * signal, const QObject * receiver, const char * slot) [static] 信号函数一定来自于发射者槽函数一定来自于接收者。信号槽的连接必须在发射者对象和接收者对象创建完成后进行如果成功连接后发射者或接收者对象销毁了连接断开。 信号槽的连接也可以程序员手动断开只需要把connect函数改为disconnect即可参数保持不变。 3. 连接方式 为了讲课按照难易程度分为三种连接方式 自带信号 → 自带槽自带信号 → 自定义槽自定义信号 → 槽 3.1 自带信号 → 自带槽 这种连接方式是最简单的连接方式因为信号函数和槽函数都是Qt内置的程序员只需要找到连接的四个参数直接连接即可。 【例子】点击按钮关闭窗口。 分析 参数1发射者——按钮对象 参数2信号函数——点击 void QAbstractButton::clicked() [signals] 参数3接收者——窗口对象 参数4槽函数——关闭 bool QWidget::close() [slot] dialog.h #ifndef DIALOG_H
#define DIALOG_H#include QDialog
#include QPushButtonclass Dialog : public QDialog
{Q_OBJECTpublic:Dialog(QWidget *parent 0);~Dialog();private:QPushButton *btn;
};#endif // DIALOG_Hdialog.cpp #include dialog.hDialog::Dialog(QWidget *parent): QDialog(parent)
{resize(400,400);btn new QPushButton(关闭,this);btn-move(100,100);// 参数1发射者——按钮对象// 参数2信号函数——点击// 参数3接收者——窗口对象// 参数4槽函数——关闭connect(btn,SIGNAL(clicked()),this,SLOT(close()));
}Dialog::~Dialog()
{delete btn;
}3.2 自带信号 → 自定义槽 这种连接方式是使用的最多的一种连接方式因为在实际开发中Qt无法预设所有的槽函数情况对于复杂的操作执行逻辑需要程序员手动编写槽函数。 槽函数是一种特殊的成员函数。 【例子】点击按钮窗口向右下角移动10个像素并且后台输出当前窗口的位置。 dialog.h #ifndef DIALOG_H
#define DIALOG_H#include QDialog
#include QPushButton
#include QDebugclass Dialog : public QDialog
{Q_OBJECTpublic:Dialog(QWidget *parent 0);~Dialog();private:QPushButton *btn;// 槽函数的声明
private slots: // 最小权限原则void mySlot(); // 自定义槽函数
};#endif // DIALOG_Hdialog.cpp #include dialog.hDialog::Dialog(QWidget *parent): QDialog(parent)
{resize(400,400);btn new QPushButton(关闭,this);btn-move(100,100);// 连接信号槽connect(btn,SIGNAL(clicked()),this,SLOT(mySlot()));
}void Dialog::mySlot()
{// 先获得当前坐标int x this-x();int y this-y();// 移动move(x10,y10);// 输出当前窗口位置qDebug() this-x() this-y();
}Dialog::~Dialog()
{delete btn;
}3.3 自定义信号 自定义信号通常用于解决一些对象之间“远距离”通信问题本节属于强行使用因此并不是问题最优解只是为了展示自定义信号的使用方式。 【例子】点击按钮按钮上显示点击的次数。 先忽略自定义信号展示正常解法 dialog.h #ifndef DIALOG_H
#define DIALOG_H#include QDialog
#include QPushButton
#include QDebugclass Dialog : public QDialog
{Q_OBJECTpublic:Dialog(QWidget *parent 0);~Dialog();private:QPushButton* btn;int count;private slots:void btnClickedSlot(); // 点击按钮的槽函数
};#endif // DIALOG_Hdialog.cpp #include dialog.hDialog::Dialog(QWidget *parent): QDialog(parent),count(0) // 构造初始化列表
{resize(400,400);btn new QPushButton(0,this);btn-move(200,200);connect(btn,SIGNAL(clicked()),this,SLOT(btnClickedSlot()));
}void Dialog::btnClickedSlot()
{count;// int → QStringQString text QString::number(count);// 设置到按钮上显示btn-setText(text);
}Dialog::~Dialog()
{delete btn;
}基于上面的解法强行增加自定义信号发射环节 信号函数是一种特殊的函数只有声明没有定义声明后可以直接配合emit关键字发射。 dialog.h #ifndef DIALOG_H
#define DIALOG_H#include QDialog
#include QPushButton
#include QDebugclass Dialog : public QDialog
{Q_OBJECTpublic:Dialog(QWidget *parent 0);~Dialog();private:QPushButton* btn;int count;signals:void countSignal(); // 自定义信号private slots:void btnClickedSlot(); // 点击按钮的槽函数void countSlot(); // 与自定义信号连接的槽函数
};#endif // DIALOG_Hdialog.cpp #include dialog.hDialog::Dialog(QWidget *parent): QDialog(parent),count(0) // 构造初始化列表
{resize(400,400);btn new QPushButton(0,this);btn-move(200,200);connect(btn,SIGNAL(clicked()),this,SLOT(btnClickedSlot()));connect(this,SIGNAL(countSignal()),this,SLOT(countSlot()));
}void Dialog::btnClickedSlot()
{count;// 发射自定义信号emit countSignal();
}/*** brief Dialog::countSlot* 中转之后更新按钮显示的槽函数*/
void Dialog::countSlot()
{QString text QString::number(count);btn-setText(text);
}Dialog::~Dialog()
{delete btn;
}4. 信号槽传参 信号槽可以进行参数传递信号函数携带参数发射槽函数可以收到此参数。 dialog.h #ifndef DIALOG_H
#define DIALOG_H#include QDialog
#include QPushButton
#include QDebugclass Dialog : public QDialog
{Q_OBJECTpublic:Dialog(QWidget *parent 0);~Dialog();private:QPushButton* btn;int count;signals:void countSignal(int); // 自定义信号private slots:void btnClickedSlot(); // 点击按钮的槽函数void countSlot(int); // 与自定义信号连接的槽函数
};#endif // DIALOG_H dialog.cpp #include dialog.hDialog::Dialog(QWidget *parent): QDialog(parent),count(0) // 构造初始化列表
{resize(400,400);btn new QPushButton(0,this);btn-move(200,200);connect(btn,SIGNAL(clicked()),this,SLOT(btnClickedSlot()));connect(this,SIGNAL(countSignal(int)),this,SLOT(countSlot(int)));
}void Dialog::btnClickedSlot()
{count;// 发射自定义信号(携带参数)emit countSignal(count);
}/*** brief Dialog::countSlot* count参数是信号函数发来的不是成员变量* 中转之后更新按钮显示的槽函数*/
void Dialog::countSlot(int count)
{QString text QString::number(count);btn-setText(text);
}Dialog::~Dialog()
{delete btn;
}需要注意的是 理论上可以传递任意多个参数信号函数的参数个数必须大于等于槽函数的参数个数参数类型需要匹配 5. 对应关系 同一个信号可以连接到多个槽一对多多个信号也可以连接到同一个槽多对一。 5.1 一对多 槽函数也是成员函数因此在一对多的连接关系中把连接的多个槽函数可以看做是普通的成员函数合并为一个槽函数。 dialog.h #ifndef DIALOG_H
#define DIALOG_H#include QDialog
#include QPushButton
#include QDebugclass Dialog : public QDialog
{Q_OBJECTpublic:Dialog(QWidget *parent 0);~Dialog();private:QPushButton* btn1;QPushButton* btn2;private slots:void btnClickedSlot1();void btnClickedSlot2();void btnClickedSlot3(); // 3 1 2
};#endif // DIALOG_Hdialog.cpp #include dialog.hDialog::Dialog(QWidget *parent): QDialog(parent)
{resize(400,400);btn1 new QPushButton(一对多, this);btn1-move(200,100);btn2 new QPushButton(一对一, this);btn2-move(100,200);// 一对多connect(btn1,SIGNAL(clicked()),this,SLOT(btnClickedSlot1()));connect(btn1,SIGNAL(clicked()),this,SLOT(btnClickedSlot2()));// 一对一connect(btn2,SIGNAL(clicked()),this,SLOT(btnClickedSlot3()));
}void Dialog::btnClickedSlot1()
{qDebug() A;
}void Dialog::btnClickedSlot2()
{qDebug() B;
}void Dialog::btnClickedSlot3()
{// 直接把Slot1和Slot2两个函数当做普通的成员函数// 使用this指针调用btnClickedSlot1();btnClickedSlot2();
}Dialog::~Dialog()
{delete btn1;
}5.2 多对一 多对一的连接方式下槽函数无法区分信号来源可以在槽函数中调用sender函数获取发射者对象从而判断信号来源。 // 在槽函数中调用返回发射者对象
QObject * QObject::sender() const dialog.h #ifndef DIALOG_H
#define DIALOG_H#include QDialog
#include QPushButton
#include QDebugclass Dialog : public QDialog
{Q_OBJECTpublic:Dialog(QWidget *parent 0);~Dialog();private:QPushButton* btn1;QPushButton* btn2;private slots:void btnsClickedSlot();
};#endif // DIALOG_Hdialog.cpp #include dialog.hDialog::Dialog(QWidget *parent): QDialog(parent)
{resize(400,400);btn1 new QPushButton(A,this);btn2 new QPushButton(B,this);btn1-move(150,100);btn2-move(150,200);// 多对一connect(btn1,SIGNAL(clicked()),this,SLOT(btnsClickedSlot()));connect(btn2,SIGNAL(clicked()),this,SLOT(btnsClickedSlot()));
}void Dialog::btnsClickedSlot()
{if(btn1 sender()){qDebug() 点击了按钮1;}else if(btn2 sender()){qDebug() 点击了按钮2;}qDebug() 槽函数触发;
}Dialog::~Dialog()
{delete btn1;delete btn2;
}