QT学习-04-信号与槽及界面跳转

信号与槽及界面跳转

1.概述

  • 信号和槽机制是QT的核心机制,要精通QT编程就必须对信号和槽有所了解。信号和槽是一种高级接口,应用于对象之间的通信,它是QT的核心特性,也是QT区别于其它工具包的重要地方。信号和槽是QT自行定义的一种通信机制,它独立于标准的C/C++语言,因此要正确的处理信号和槽,必须借助一个称为 moc (Meta Object Compiler)的QT工具,该工具是一个C++预处理程序,它为高层次的事件处理自动生成所需要的附加代码。
  • 在所有从 QObject或其子类(例如Qwidget)派生的类都能够包含信号和槽。当对象改变其状态时,信号就由该对象发射(emit)出去,这就是对象所要做的全部事情,它不知道另一端是谁在接收这个信号。这就是真正的信息封装,它确保对象被当作一个真正的软件组件来使用。槽用于接收信号,但它们是普通的对象成员函数。一个槽并不知道是否有任何信号与自己相连接。而且,对象并不了解具体的通信机制。

2.信号

  • 当某个信号对其客户或所有者发生的内部状态发生改变,信号被一个对象发射。
  • 只有定义过这个信号的类及其派生类能够发射这个信号。当一个信号被发射时,与其相关联的槽将被立刻执行,就象一个正常的函数调用一样。
  • 信号-槽机制完全独立于任何GUI事件循环。
  • 如果存在多个槽与某个信号相关联,那么,当这个信号被发射时,这些槽将会一个接一个地执行,但是它们执行的顺序将会是随机的、不确定的,我们不能人为地指定哪个先执行、哪 个后执行。

3.槽

槽是普通的 C++ 成员函数,可以被正常调用,它们唯一的特殊性就是很多信号可以与其相关联。当与其关联的信号被发射时,这个槽就会被调用。槽可以有参数,但槽的参数不能有缺省值。 槽函数分为三种类型,即 public slots、private slots 和 protected slots。

  • public slots:在这个区内声明的槽意味着任何对象都可将信号与之相连接。这对于组件编程非常有用,你可以创建彼此互不了解的对象,将它们的信号与槽进行连接以便信息能够正确的传递。
  • protected slots:在这个区内声明的槽意味着当前类及其子类可以将信号与之相连接。这适用于那些槽,它们是类实现的一部分,但是其界面接口却面向外部。
  • private slots:在这个区内声明的槽意味着只有类自己可以将信号与之相连接。这适用于联系非常紧密的类

4.QObject::connect

通过调用QObject对象的connect函数来将某个对象的信号与另外一个对象的槽函数相关联,这样当发射者发射信号时,接收者的槽函数将被调用。该函数的定义如下:

bool QObject::connect ( const QObject * sender, const char * signal, const QObject * receiver, const char * member ) [static]

这个函数的作用就是将发射者sender对象中的信号signal与接收者receiver中的member槽函数联系起来。当指定信号 signal时必须使用QT的宏SIGNAL(),当指定槽函数时必须使用宏SLOT()。如果发射者与接收者属于同一个对象的话,那么在connect 调用中接收者参数可以省略。
举例

5.跳转界面应用示例

  • main函数
#include <QtGui/QApplication>
#include "mainwidget.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    mainwidget w;
    w.show();

    return a.exec();
}

  • mainwidget.h文件
#ifndef MAINWIDGET_H
#define MAINWIDGET_H

#include <QtGui/QWidget>
#include <QPushButton>
#include "subwidget.h"
class mainwidget : public QWidget
{
    Q_OBJECT   //信号槽实现

public:
    mainwidget(QWidget *parent = 0);
    ~mainwidget();
    QPushButton btn1;//按钮1
    QPushButton *btn2;//按钮2

    subwidget w2;//子类窗口对象

public slots:
    void popUPSlot();
    void returnSlot();

};

#endif // MAINWIDGET_H
  • mainwidget.cpp文件
#include "mainwidget.h"

mainwidget::mainwidget(QWidget *parent)//构造函数
    : QWidget(parent)
{

    //设置主窗口大小即标题
    this->setWindowTitle("father window");
    this->setGeometry(50,50,500,500);

    //设置按钮btn1
    btn1.setParent(this);
    btn1.setText("close");


    //设置按钮btn2
    btn2=new QPushButton(this);
    btn2->setText("jump");
    btn2->move(100,100);

    //标准信号槽
    connect(&btn1,SIGNAL(pressed()),this,SLOT(close()));


    //绑定按钮btn2和函数popUPSlot(),点击按钮时执行popUPSlot()函数
    connect(btn2,SIGNAL(pressed()),this,SLOT(popUPSlot()));

    //绑定子窗口对象w2和函数returnSlot(),若收到子窗口发来的mySignal()信号则执行returnSlot()
    connect(&w2,SIGNAL(mySignal()),this,SLOT(returnSlot()));

}

mainwidget::~mainwidget()//析构函数
{

}

void mainwidget::popUPSlot()//跳转到子窗口
{
    w2.show();
    this->hide();

}

 void mainwidget::returnSlot()//返回主窗口
 {
     this->show();
     w2.hide();

 }
  • subwidget.h文件
#ifndef SUBWIDGET_H
#define SUBWIDGET_H

#include <QWidget>
#include <QPushButton>
class subwidget : public QWidget
{
    Q_OBJECT
public:
    explicit subwidget(QWidget *parent = 0);
    QPushButton  *sub_b1 ;//返回按钮

signals:
    void mySignal();//自定义的返回信号,用来发送给父窗口

public slots:
    void sendSignal();//槽函数,用来发送返回信号

};

#endif // SUBWIDGET_H

  • subwidget.cpp文件
#include "subwidget.h"

subwidget::subwidget(QWidget *parent) :
    QWidget(parent)
{
    //设置主窗口大小即标题
    this->setWindowTitle("son window");
    this->setGeometry(50,50,500,500);

    //设置返回按钮sub_b1
    sub_b1 = new QPushButton(this);
    sub_b1->setText("return");

    //绑定返回按钮sub_b1和sendSignal(),即点击按钮时发送给父窗口mySignal()信号
    connect(sub_b1,SIGNAL(clicked()),this,SLOT(sendSignal()));

}

void subwidget::sendSignal()
{

    emit mySignal();//发送给父窗口信号(广播信号)
}

  • 运行结果

    在这里插入图片描述
  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值