QT学习笔记2

 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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值