QT中信号与槽的常见使用

一.标准信号与槽函数

有些信号和槽的函数模板都已经被写好了,只需要调用即可

下面是一个点击按钮关闭窗口的程序

.h文件

#ifndef MYWIDGET_H
#define MYWIDGET_H

#include <QWidget>
#include <QPushButton>

class MyWidget : public QWidget
{
    Q_OBJECT    //使用信号与槽的时候需要用到它

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

public:
    QPushButton* pBtn1;

};

#endif // MYWIDGET_H

.cpp文件

#include "mywidget.h"

MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent)
{
    pBtn1 = new QPushButton(this); //指定父对象,不然按钮在窗口上是无法正常显示的
    pBtn1->setText("Close");//创建一个关闭窗口的按钮
    pBtn1->move(100,100);   //更改按钮在窗口上的位置

    //标准信号与槽函数的使用
    connect(pBtn1, &QPushButton::pressed, this, &MyWidget::close);
    /*pBtn1:信号发出者,为指针类型
     *&QPushButton::pressed 信号函数;  &发送者的类名:信号名字
     *this:信号的接收者
     *&Widget::close 槽函数,信号处理函数; &接受的类名::槽函数名称
     */

}

MyWidget::~MyWidget()
{

}

二.自定义槽函数

.h文件

#ifndef MYWIDGET_H
#define MYWIDGET_H

#include <QWidget>
#include <QPushButton>

class MyWidget : public QWidget
{
    Q_OBJECT    //使用信号与槽的时候需要用到它

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

public:
    QPushButton* pBtn1;

public:
    //自定义的槽函数
    void mySlot();

};

#endif // MYWIDGET_H

.cpp文件

#include "mywidget.h"

MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent)
{
    pBtn1 = new QPushButton(this); //指定父对象,不然按钮在窗口上是无法正常显示的
    pBtn1->setText("Close");//创建一个关闭窗口的按钮
    pBtn1->move(100,100);   //更改按钮在窗口上的位置

    connect(pBtn1, &QPushButton::pressed, this, mySlot);
    /*自定义槽函数:
     * QT5:任意的成员函数,普通的全局函数,静态函数
     * 由于信号函数是没有返回值的,所以槽函数一定也没有返回值
     * 一般在QT5中都是使用成员函数作为槽函数
     */
}

//成员函数
void MyWidget::mySlot()
{
    this->close();
}

MyWidget::~MyWidget()
{

}

三.自定义信号与槽函数

下面是一个两个窗口相互切换的程序,点击主窗口按钮,切换到子窗口;在子窗口中点击按钮,给主窗口发送自定义信号。

mainwidget.h文件

#ifndef MAINWIDGET_H
#define MAINWIDGET_H

#include <QWidget>
#include <QPushButton>
#include "subwidget.h"

class MainWidget : public QWidget
{
    Q_OBJECT

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

public:
    QPushButton* pBtn1;
    SubWidget subWidget;

public:
    void ShowSubWidget();
    void DealSub();
    void DealSubWin(int, QString);

};

#endif // MAINWIDGET_H

mainwidget.cpp文件

#include "mainwidget.h"
#include <QDebug>

MainWidget::MainWidget(QWidget *parent)
    : QWidget(parent)
{
    this->setWindowTitle("主窗口");

    pBtn1 = new QPushButton("切换到子窗口", this);
    pBtn1->move(100, 100);

    //点击按钮,显示子窗口
    connect(pBtn1, &QPushButton::pressed, this, ShowSubWidget);

    //处理子窗口发送的信号

    //不带参数的信号
    void(SubWidget::*funSignal)() = &SubWidget::mySignal;
    connect(&subWidget, funSignal, this, DealSub);

    //带有参数的信号
    void(SubWidget::*TestSignal)(int, QString) = &SubWidget::mySignal;
    connect(&subWidget, TestSignal, this, DealSubWin);

}

MainWidget::~MainWidget()
{

}

void MainWidget::ShowSubWidget()
{
    subWidget.show();
}

void MainWidget::DealSub()
{
    subWidget.hide();
    this->show();
}

void MainWidget::DealSubWin(int a, QString str)
{
    qDebug() << a;
    qDebug() << str.toUtf8().data();
}

subwidget.h文件

#ifndef SUBWIDGET_H
#define SUBWIDGET_H

#include <QWidget>
#include <QPushButton>

class SubWidget : public QWidget
{
    Q_OBJECT
public:
    explicit SubWidget(QWidget *parent = 0);

signals:
    //自定义信号
    /*信号没有返回值,但可以有参数
     * 信号就是函数的声明,只需要声明,无需定义
     * 使用emit mySignal
     * 信号可以重载
     */
    void mySignal(); //无参数的信号
    void mySignal(int, QString); //有参数的信号

public slots:

public:
    QPushButton* pBtn;

public:
    //自定义槽函数
    void sendSlot();

};

#endif // SUBWIDGET_H

subwidget.cpp文件

#include "subwidget.h"

SubWidget::SubWidget(QWidget *parent) : QWidget(parent)
{
    this->setWindowTitle("子窗口");

    pBtn = new QPushButton("切换到主窗口", this);
    pBtn->move(100, 100);

    connect(pBtn, &QPushButton::clicked, this, sendSlot);
}

void SubWidget::sendSlot()
{
    //当按钮按下时,子窗口向主窗口发送信号
    emit mySignal();
    emit mySignal(100, "我是子窗口");
}

原文地址:https://www.cnblogs.com/QingYiShouJiuRen/p/11442060.html

时间: 2024-08-12 05:03:42

QT中信号与槽的常见使用的相关文章

qt中信号与槽机制

一. 简介 就我个人来理解,信号槽机制与Windows下消息机制类似,消息机制是基于回调函数,Qt中用信号与槽来代替函数指针,使程序更安全简洁. 信号和槽机制是 Qt 的核心机制,可以让编程人员将互不相关的对象绑定在一起,实现对象之间的通信. 信号 当对象改变其状态时,信号就由该对象发射 (emit) 出去,而且对象只负责发送信号,它不知道另一端是谁在接收这个信号.这样就做到了真正的信息封装,能确保对象被当作一个真正的软件组件来使用. 槽 用于接收信号,而且槽只是普通的对象成员函数.一个槽并不知

Qt 5中信号和槽的新语法

QT 是一个跨平台的 C++ GUI 应用构架,它提供了丰富的窗口部件集,具有面向对象.易于扩展.真正的组件编程等特点,更为引人注目的是目前 Linux 上最为流行的 KDE 桌面环境就是建立在 QT 库的基础之上.QT 支持下列平台:MS/WINDOWS-95.98.NT 和 2000:UNIX/X11-Linux.Sun Solaris.HP-UX.Digital Unix.IBM AIX.SGI IRIX:EMBEDDED- 支持 framebuffer 的 Linux 平台.伴随着 KD

QT 的信号与槽

转载: QT 的信号与槽机制介绍 QT 是一个跨平台的 C++ GUI 应用构架,它提供了丰富的窗口部件集,具有面向对象.易于扩展.真正的组件编程等特点,更为引人注目的是目前 Linux 上最为流行的 KDE 桌面环境就是建立在 QT 库的基础之上.QT 支持下列平台:MS/WINDOWS-95.98.NT 和 2000:UNIX/X11-Linux.Sun Solaris.HP-UX.Digital Unix.IBM AIX.SGI IRIX:EMBEDDED- 支持 framebuffer

Qt的信号与槽机制

1.信号和槽机制是QT的核心机制,要精通QT编程就必须对信号和槽有所了解. 2.信号和槽是一种高级接口,应用于对象之间的通信,它是QT的核心特性,也是QT区别于其它工具包的重要地方. 3.信号和槽是QT自行定义的一种通信机制,它独立于标准的C/C++语言,因此要正确的处理信号和槽,必须借助一个称为moc(Meta Object Compiler)的QT工具,该工具是一个C++预处理程序,它为高层次的事件处理自动生成所需要的附加代码. 4.在我们所熟知的很多GUI工具包中,窗口小部件(widget

QT的信号和槽机制简介

信号与槽作为QT的核心机制在QT编程中有着广泛的应用,本文介绍了信号与槽的一些基本概念.元对象工具以及在实际使用过程中应注意的一些问题. QT是一个跨平台的C++ GUI应用构架,它提供了丰富的窗口部件集,具有面向对象.易于扩展.真正的组件编程等特点,更为引人注目的是目前Linux上最为流行的KDE桌面环境就是建立在QT库的基础之上.QT支持下列平台:MS/WINDOWS-95.98.NT和2000:UNIX/X11-Linux.Sun Solaris.HP-UX.Digital Unix.IB

QT的信号与槽机制介绍

信号与槽作为QT的核心机制在QT编程中有着广泛的应用,本文介绍了信号与槽的一些基本概念.元对象工具以及在实际使用过程中应注意的一些问题. QT是一个跨平台的C++ GUI应用构架,它提供了丰富的窗口部件集,具有面向对象.易于扩展.真正的组件编程等特点,更为引人注目的是目前Linux上最为流行的KDE桌面环境就是建立在QT库的基础之上.QT支持下列平台:MS/WINDOWS-95.98.NT和2000:UNIX/X11-Linux.Sun Solaris.HP-UX.Digital Unix.IB

Qt认识信号与槽

一.概述 信号与槽机制是Qt的编程很常见用到的一种机制,他可以让应用程序的一个控件(比如:一个按钮)和对应的时间绑定在一起实现相应的功能 二.信号 什么是信号,比如我拿一根针扎我自己,这个时候神经就会发送一种电信号让我感到疼痛,在我点击一个按钮的时候,他需要发出一种信号,来告诉对应的控件,我要怎么怎么样的,你要干什么, 其实这个我们还可以理解成,在中国有一个故事是烽火戏诸侯想必大家都听说过吧,就是说我这里点了狼烟,我的诸侯国看到了就要派兵过来,我们这里可以理解成,我点狼烟的时候就是发送的一个信号

【QT】信号和槽

信号和槽机制是QT对C++的拓展,只有QOBject的子类才具有这种功能. 支持信号和槽的类必须从QObject派生,并且用Q_OBJECT宏开始定义类. 信号和槽的意义在于:调用者和被调用者分离,实现高内聚,低耦合. 信号的定义: 在类中,用signals标识符表示. signal的声明和函数的声明格式是一样的,但是不需要实现. signal没有访问权限的概念,默认是protected. 槽函数的定义: 在类中,用slots来表示槽. 它可以设置访问权限. 他可以实现和普通函数一样. 它可以像

Qt之信号与槽

有关这个概念网上有太多太多的资料了,这些资料也非常健全,比如下面这些文章,后两篇比较高端,现在还没完全整明白,感谢tingsking18大神 http://www.ibm.com/developerworks/cn/linux/guitoolkit/qt/signal-slot/ http://blog.csdn.net/tingsking18/article/details/4800828 http://blog.csdn.net/tingsking18/article/details/499