QT信号和槽
//mainwindow.cpp文件
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
qDebug() << "MainWindow中on_pushButton_clicked执行了" << endl;
}
//mainwindow.h文件
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow {
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_pushButton_clicked();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
信号(Signal)就是在特定情况下被发射的事件,例如 PushButton 最常见的信号就是鼠标
单击时发射的 clicked() 信号,一个 ComboBox 最常见的信号是选择的列表项变化时发射的
CurrentIndexChanged() 信号。
槽(Slot)就是对信号响应的函数。槽就是一个函数,与一般的 C++函数是一样的,可以
定义在类的任何部分( public、 private 或 protected),可以具有任何参数,也可以被直接调用。
槽函数与一般的函数不同的是:槽函数可以与一个信号关联,当信号被发射时,关联的槽函数
被自动执行。
信号与槽链接:
信号与槽关联是用QObject::connect() 函数实现的,其基本格式是:
QObject::connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));
connect() 是 QObject 类的一个静态函数,而 QObject 是所有 Qt 类的基类,在实际调用
时可以忽略前面的限定符,所以可以直接写为:
connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));
其中,sender 是发射信号的对象的名称, signal() 是信号名称。信号可以看做是特殊的函
数, 需要带括号,有参数时还需要指明参数。 receiver 是接收信号的对象名称, slot() 是槽函数
的名称,需要带括号,有参数时还需要指明参数。
信号槽断开连接
信号槽连接的方法已经讲解了。这里只是稍稍提一下,断开连接的方法,初学者基本用不
到断开连接的操作。使用disconnect()。disconnect(),这个方法重载了好几个函数,解开格式如
下。
bool QObject::disconnect(const QObject *sender, const char *signal, const QObject *receiver, const
char *method)
断开一切与myObject 连接的信号或槽。
disconnect(myObject, 0, 0, 0);
相当于非静态重载函数:
myObject->disconnect();
断开所有连接到特定信号的东西。
disconnect(myObject, SIGNAL(mySignal()), 0, 0);
相当于非静态重载函数:
myObject->disconnect(SIGNAL(mySignal()));
与指定的接收者断开连接
disconnect(myObject, 0, myReceiver, 0);
相当于非静态重载函数
myObject-->disconnect(myReceiver);
信号与槽机制是
Qt GUI 编程的基础,使用信号与槽机制可以比较容易地将信号与响应代
码关联起来。
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// QObject::connect(ui->pushButton, SIGNAL(clicked()), this,
// SLOT(close()));
connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(close())); // 可以省略QObject::
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
qDebug() << "MainWindow中on_pushButton_clicked执行了" << endl;
}
一个信号可以连接多个槽,例如:
connect(pushButton, SIGNAL(clicked()), this, SLOT(hide()); connect(pushButton, SIGNAL(clicked()), this, SLOT(close());
多个信号可以连接同一个槽
connect(pushButton,SIGNAL(clicked()),this,SLOT(close()));
connect(pushButton_2,SIGNAL(clicked()),this,SLOT(close()));
connect(pushButton_3,SIGNAL(clicked()),this,SLOT(close()));
一个信号可以连接另外一个信号(说明了connect 万物皆可连,非常好用!),例如:
connect(pushButton, SIGNAL(objectNameChanged(QString)),this, SIGNAL(windowTitelChan
ged(QString)));
//mianwindow.cpp文件
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
school = new School;
student = new Student;
connect(school, SIGNAL(sendMessages()), student, SLOT(comeBackToClass()));
connect(school, SIGNAL(sendMessages2()), student, SLOT(comeBackToClass()));
emit school->sendMessages();
}
MainWindow::~MainWindow()
{
delete ui;
}
//mianwindow.h文件
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include "student.h"
#include "school.h"
#include <QMainWindow>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class School;
class Student;
class MainWindow : public QMainWindow {
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
School *school;
Student *student;
};
#endif // MAINWINDOW_H
//shcool.h文件
#ifndef SCHOOL_H
#define SCHOOL_H
#include <QObject>
class School : public QObject {
Q_OBJECT
public:
explicit School(QObject *parent = nullptr);
signals:
// Qt里的信号关键字 只声明不用定义
void sendMessages();
void sendMessages2();
};
#endif // SCHOOL_H
//shcool.cpp文件
#include "school.h"
School::School(QObject *parent) : QObject(parent)
{
}
//student.h文件
#ifndef STUDENT_H
#define STUDENT_H
#include <QObject>
class Student : public QObject {
Q_OBJECT
public:
explicit Student(QObject *parent = nullptr);
signals:
public slots:
// 槽声明后还需要定义
void comeBackToClass();
};
#endif // STUDENT_H
//student.cpp文件
#include "student.h"
#include <QDebug>
Student::Student(QObject *parent) : QObject(parent)
{}
void Student::comeBackToClass()
{
qDebug() << "学生去上课" << endl;
}