被动关联与自动关联区别:
被动关联:也就是我们经常使用的connect函数,显示的指定SIGNAL和SLOT。
自动关联:隐式指明信号与槽的关系,主要利用部件设置的Objectname与信号signal名字关联。
自动关联说明:
规则要求1:
自动关联槽函数命名:
void on_<object name>_<signal name>(<signal parameters>);
objectName:部件的名字,通过setObjectName成员函数设置。
signalname:也就是我们信号名字,
signal parameters:形参
规则要求2:
调用connectSlotsByName
[static] void QMetaObject::connectSlotsByName(QObject *object)
官网翻译:
调用connectSlotsByName将会递归搜索该对象的所有子对象,自动关联子部件符合
void on_<object name>_<signal name>(<signal parameters>);的槽函数。
例如我们对象的对象中有一个对象名为button1的QPushButton,那么这个匹配的槽将是:
void on_button1_clicked();
自动关联举例:
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QPushButton>
#include <QMetaObject>
class UI;
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
public slots:
void on_ok_btn_clicked();
void on_cancle_btn_clicked();
private:
UI *ui;
};
class UI
{
public:
UI(QWidget * parent = 0);
private:
QPushButton *ok_btn;
QPushButton *cancle_btn;
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include <QDebug>
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
ui = new UI(this);
QMetaObject::connectSlotsByName(this);
}
Widget::~Widget()
{
}
void Widget::on_ok_btn_clicked()
{
qDebug()<<"on_ok_btn_clicked";
}
void Widget::on_cancle_btn_clicked()
{
qDebug()<<"on_cancle_btn_clicked";
}
UI::UI(QWidget * parent)
{
ok_btn = new QPushButton(parent);
ok_btn->setObjectName("ok_btn");
ok_btn->setText("OK");
ok_btn->setGeometry(0,0,60,30);
cancle_btn = new QPushButton(parent);
cancle_btn->setObjectName("cancle_btn");
cancle_btn->setText("cancle");
cancle_btn->setGeometry(100,0,60,30);
}
main.cpp
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
输出:
![](https://img-blog.csdnimg.cn/d588b8d3ca3745f3802c0809539e0748.png)
疑问:
为什么UI类中并没有继承Object类,以及UI类中并没有Q_OBJECT关键字,也能关联信号与槽?
嘿嘿,你知道吗?