刚刚学习qt,如有错误,请见谅(指出),谢谢!
信号槽是 Qt 框架引以为豪的机制之一。熟练使用和理解信号槽,能够设计出解耦的非常漂亮的程序,有利于增强我们的技术设计能力。
所谓信号槽,实际就是观察者模式。当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal)
1.QObject::connect()函数是QT中的连接函数,将信号发送者sender对象中的信号signal与接受者receiver中的member槽函数联系起来。
在qt5中有5个重载:
QMetaObject
::
Connection
connect
(
const
QObject *
,
const
char
*
,
const
QObject *
,
const
char
*
,
Qt
::
ConnectionType
)
;
QMetaObject
::
Connection
connect
(
const
QObject *
,
const
QMetaMethod
&
,
const
QObject *
,
const
QMetaMethod
&
,
Qt
::
ConnectionType
)
;
QMetaObject
::
Connection
connect
(
const
QObject *
,
const
char
*
,
const
char
*
,
Qt
::
ConnectionType
)
const
;
QMetaObject
::
Connection
connect
(
const
QObject *
,
PointerToMemberFunction
,
const
QObject *
,
PointerToMemberFunction
,
Qt
::
ConnectionType
)
QMetaObject
::
Connection
connect
(
const
QObject *
,
PointerToMemberFunction
,
Functor
)
;
2.信号槽使用
#include <QApplication>
#include <QPushButton>
#include <QDebug>
//qt5
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QPushButton button("Test");
/**
* @brief QObject::connect
*button 信号发送者
*QPushButton::clicked clicked信号
*QApplication::quit 处理函数
*/
QObject::connect(&button,&QPushButton::clicked,QApplication::quit);
button.show();
return a.exec();
}
3.自定义信号槽
person.h
//QT5
#ifndef PERSON_H
#define PERSON_H
#include <QObject>
class CPerson : public QObject
{
Q_OBJECT
public:
CPerson(const QString &name,const qint16 &age):m_name(name),m_age(age) {}
void send()
{
emit PrintNameAndAge(m_name,m_age);
}
signals:
void PrintNameAndAge(const QString &name,const qint16 &age);
protected:
QString m_name;
qint16 m_age;
};
main.cpp
#endif // PERSON_H
#include <QApplication>
#include <QPushButton>
#include <QDebug>
#include "person.h"
//qt5
void PrintPerson(const QString &name,const qint16 &age)
{
qDebug()<<"姓名:"+name+" 年龄:"+QString::number(age);
}
void click()
{
CPerson ps("张三",18);
/**
* @brief QObject::connect
*ps 信号发送者
*ps.PrintNameAndAge PrintNameAndAge信号
*PrintPerson 处理函数
*/
QObject::connect(&ps,&CPerson::PrintNameAndAge,&PrintPerson);
ps.send();//发送信号
qDebug()<<"click";
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QPushButton button("Test");
button.show();
QObject::connect(&button,&QPushButton::clicked,click);
return a.exec();
}