3.信号与槽的对应关系

一、QT打印调试方法
1.类C语言使用方法
int val = 5;
qDebug("val = %d", a);  //方法1,类似于C的printf函数

2.类C++使用方法
int val = 5;
qDebug()<<"val = "<<val;  //方法2,类似于C++的cout函数

3.方便输出QT类

二、信号与槽
1.简介:
	信号与槽是QT在C++基础上新增特性,类似与windows编程中的事件回调机制。
	但是使用起来更加方便,可以很容易实现对象部件之间的通信。
	
	使用条件:
		1.通信的对象必须是从 QObject 派生出来的
		2.类定义开始要加入 Q_OBJECT 宏
		
2.函数原型:(帮助文档搜“connect”)
	QMetaObject::Connection QObject::connect(\
	const QObject * sender, const char * signal, \
	const QObject * receiver, const char * method, \
	Qt::ConnectionType type = Qt::AutoConnection) [static]
	
	receiver绑定了sender的signal信号,一旦sender发出signal信号,
	receiver就执行method方法。

	注意:
		1.函数是静态的,可以不用实例化即可调用
		2.信号和槽可以从帮助文档查找,也可以自己定义
		3.槽方法本身就是一个普通的方法,是可以被直接调用。
		4.信号也是一个方法,但是信号不能被直接调用,只能被发送。
		5.如果槽函数带形参,是不可以直接传入,只能通过信号传递。

3.使用步骤:
	3.1 帮助文档输入"connect",进入函数帮助文档
	3.2 复制文档中demo代码
	3.3 粘贴后根据需求做修改
	
4.实例:点击按钮,关闭窗口
		
5.自定义槽方法	
	关键字:public(private/protected) slots:
	实例:点击按钮,在qt控制台打印"btn clicked"。
	实例:界面增加label,默认"label"显示,点击按钮,改变label文字和背景色
	
7.自定义信号
	关键字:signals:定义信号     emit:发送信号
	注意:信号只需要定义,不需要实现。
	
	实例:把上面实例槽函数功能改为:记录点击次数,并作为参数发送信号。
			重新定义槽函数与此信号做连接,槽函数打印其值。

8.信号与槽关联关系
	QObject::connect( sender, SIGNAL(signal),receiver, SLOT(method) );
	
	信号与信号相连
	QObject::connect( sender, SIGNAL(signal), receiver, SIGNAL(signal) );
	
	同一个信号连接到多个槽
	QObject::connect( sender, SIGNAL(signal),receiver, SLOT(method1) );
	QObject::connect( sender, SIGNAL(signal),receiver, SLOT(method2) );
	......
	
	多个信号连接到同一个槽
	QObject::connect( sender, SIGNAL(signal1),receiver, SLOT(method) );
	QObject::connect( sender, SIGNAL(signal2),receiver, SLOT(method) );
	......

9.信号与槽的对应关系
	1.可以传递任意个数的参数
	2.信号的参数个数必须大于等于槽的参数个数
	3.参数类型必须一一匹配
	
10.取消信号与槽的关联
bool QObject::disconnect(const QObject * sender, const char * signal, \
	const QObject * receiver, const char * method)
	
四、UI编辑器中的信号与槽
1.使用类自带信号与槽
	按F4按钮进入信号与槽的编辑状态,进行相应的拖拽即可。
	qt默认不显示QWidget的信号与槽,如果要用需要勾选“显示从QWidget继承XXX”选项。

2.自定义信号与槽:在这里插入图片描述

2.1 在F3界面,右键相应的组件,选择“转到槽”选项,会自动跳转到槽函数
	这种方法不会有connect的体现,遵循的是qt内部匹配规则。
	
	
	匹配规则:on_AAA_BBB:代表连接AAA对象的BBB信号到此槽。
	比如响应对象myBtn的clicked信号,就会生成on_myBtn_clicked的槽。
	过多使用此方法会导致信号与槽对应关系不明确,项目开发中不建议使用。

	2.按照代码方式完全手写connect操作,connect中使用ui->取部件即可(建议)
#include "mygui.h"
#include <QApplication>
#include <QDebug>
#include <QPoint>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MyGUI w;
    w.resize(300, 300);

    w.show();

    return a.exec(); //进入事件循环状态,去检测外部输入及信号与槽,然后界面响应
}
#include "mygui.h"

MyGUI::MyGUI(QWidget *parent)
    : QWidget(parent)
{
    QPushButton *btn = new QPushButton(this);
    btn->setText("点击");
    btn->setStyleSheet("color:red; background-color:#FFB6C1");

    count = 0;

    QObject::connect(btn, SIGNAL(clicked()),
                     this,  SLOT(btnSlot()));

    QObject::connect(this, SIGNAL(btnSignal(int)),
                     this,  SLOT(printNum(int)));
}

MyGUI::~MyGUI()
{

}

/**
 * @brief 按钮的槽方法
 */
void MyGUI::btnSlot()
{
    count++;

    //通过发送信号,把count发送出去,在另一个槽中去接收并打印
    emit btnSignal(count);
}

void MyGUI::printNum(int num)
{
    qDebug()<<"num = "<<num;
}

#ifndef MYGUI_H
#define MYGUI_H

#include <QtWidgets>

//MyGUI继承自QWidget
class MyGUI : public QWidget
{
    Q_OBJECT  //宏,定义了信号与槽

public:
    MyGUI(QWidget *parent = 0);
    ~MyGUI();

public slots:
    void btnSlot();
    void printNum(int);

signals:
    void btnSignal(int);

private:
    int count;
};

#endif // MYGUI_H

#-------------------------------------------------
#
# Project created by QtCreator 2018-04-30T18:53:40
#
#-------------------------------------------------

QT       += core gui network#模块

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets #当QT版本大于4,增加widgets模块

TARGET = gui_test #生成程序名字
TEMPLATE = app #生成程序类型

#源文件
SOURCES += main.cpp\
        mygui.cpp

#头文件
HEADERS  += mygui.h

发布了10 篇原创文章 · 获赞 14 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_40083589/article/details/94025387