目录
Multiple Inheritance Example 实例解析
Multiple Inheritance Example 实例解析
这个实例很简单,主要是为了引出uic的Automatic Connections
先把代码帖上来,再来简单的解析下:
源码如下:
calculatorform.h
#ifndef CALCULATORFORM_H
#define CALCULATORFORM_H
//! [0]
#include "ui_calculatorform.h"
//! [0]
//! [1]
class CalculatorForm : public QWidget, private Ui::CalculatorForm
{
Q_OBJECT
public:
explicit CalculatorForm(QWidget *parent = nullptr);
private slots:
void on_inputSpinBox1_valueChanged(int value);
void on_inputSpinBox2_valueChanged(int value);
};
//! [1]
#endif
calculatorform.cpp
#include "calculatorform.h"
#include <QWidget>
//! [0]
CalculatorForm::CalculatorForm(QWidget *parent)
: QWidget(parent)
{
setupUi(this);
}
//! [0]
//! [1]
void CalculatorForm::on_inputSpinBox1_valueChanged(int value)
{
outputWidget->setText(QString::number(value + inputSpinBox2->value()));
}
//! [1]
//! [2]
void CalculatorForm::on_inputSpinBox2_valueChanged(int value)
{
outputWidget->setText(QString::number(value + inputSpinBox1->value()));
}
//! [2]
main.cpp
#include "calculatorform.h"
#include <QApplication>
//! [0]
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
CalculatorForm calculator;
calculator.show();
return app.exec();
}
//! [0]
个人觉得这个应该是为了提醒多继承,才有一个继承private Ui::CalculatorForm。
这里最关键的是下面这两个槽函数:
在ui界面里面并在界面中关联信号与槽,也没有在代码中写connect,关联信号与槽,而是使用了Automatic Connections机制处理(uic与元对象共同作用)
private slots:
void on_inputSpinBox1_valueChanged(int value);
void on_inputSpinBox2_valueChanged(int value);
这里使用的技术是uic编译成.h后,使用元对象自动连接,在下面的小结中将会说明。
来看看界面和各个变量名:
其中就是这个setupUi(this),这个函数是Ui::CalculatorForm里面的,通过参数this指针,使得CalculatorForm这个界面能够显示。
Automatic Connections解析
这个的主要原理是,把槽函数写成指定的格式,uic生成.h文件的时候,调用元对象的connectSlotsByName函数,从而达到自动连接的效果!
要求的槽函数格式如下:
void on_<object name>_<signal name>(<signal parameters>);
这里uic生成的.h文件中,调用了元对象系的connectSlotsByName(this)。
从而实现了自动连接!
这种方式,感觉和Spring Boot中的JPA映射数据库表名和列名一样。
下面来总结下目前3种连接信号与槽的方式:
1. 在代码中使用connect进行连接;
2. 在ui文件中,配置信号与槽;
3. 使用标准命名法利用uic与元对象连接信号与槽。