QT的信号和槽函数(非QT designer设计)

1.建立工程

2.信号和槽函数

3.以按钮控件为例演示信号和槽函数

4.自定义槽函数


1.建立工程:

选择应用程序的Qt Widgets Application 这样建好的工程的就做好一些初始化的工作了。

接着定义项目的名称:

然后一直按下一步,定义好类名就好了。

选择QWidget,基类有三个,而QWidget就其他两个的父类。然后先不勾创建界面。因为先不用QT designer来制作界面


创建工程完毕后,就会出现2个源文件和一个头文件:main.cpp 和 qt_class.cpp ,qt_class.h。前者是程序 运行的主函数程序,名字是不会变的,后者是创建工程时,基类的名字.cpp,文件名是可变的。同理,qt_class.h的名字也是可变的,可以在这个头文件里定义控件等。在main.cpp里面有一句QT_class w;表示创建一个基类,这个基类是表示窗口的。

qt_class.h:表示最先创建的基类,表示窗口本身,可以在这个头文件中加入各种变量(包括控件),表示这个窗口有这个变量。

main.cpp  :程序的主函数,表示程序怎么执行

qt_class.cpp : 表示程序有哪些方法,方法的定义都写在次源文件中

#include "qt_class.h"
#include <QApplication>

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

    return a.exec();
}
当执行到QT_class w 时,即创建QT_class对象w,就会执行构造函数(QT_class类的构造函数要定义在QT_class的源文件中,也就是上面说到的另一个源文件qt_class.cpp)。


2.信号和槽函数

信号:信号可以比作软件的中断。例如,当有 按钮控件A 被点击了,就会广播相应的信号,控件中有很多信号,每个信号代表不同的事件。而我们需要对程序指定感兴趣的事件即可,然后对不感兴趣的事件的信号,程序就会忽略掉,不作响应。

槽函数:槽函数就是程序响应某信号时后,要执行的操作。槽函数有QT写好的,也有可以自定义的槽函数。


3.以按钮控件(QPushButton)为例演示信号和槽函数

1.首先要创建按钮:

创建按钮 首先要定义一个按钮,而定义按钮等控件就要在头文件(qt_class.h)中定义。表示该控件是窗口的成员。

下面是写过的qt_class.h,有注释的代码就是写上去的,没有注释的代码是创建好工程就有的。

/*qt_class.h*/
#ifndef QT_CLASS_H
#define QT_CLASS_H

#include <QWidget>
#include <QPushButton>      //要创建按钮控件,必须加入此头文件
class QT_class : public QWidget
{
    Q_OBJECT

public:
    QT_class(QWidget *parent = 0);
    ~QT_class();
private:
    QPushButton b1;//创建一个私有的按钮控件
};

#endif // QT_CLASS_H

2.显示控件

控件的操作(方法)一般都是写在qt_class.cpp中的,由于按钮是和窗口一起出现的,所以我在窗口对象的构造函数中写显示控件的方法。

下面是qt_class.cpp代码:

/*qt_class.cpp*/
#include "qt_class.h"
#include <QPushButton>
QT_class::QT_class(QWidget *parent)
    : QWidget(parent)
{

       b1.setParent(this);//把b1按钮的父对象设置成窗口(qt_class就是表示窗口),这样的作用是,按钮不会跟窗口分离,只会在窗口里面
       b1.setText("close");//b1按钮上写着close
       b1.show();//显示b1按钮。
}

QT_class::~QT_class()
{

}
执行程序后,就出现一个按钮在一个窗口中。



3.查找有哪些信号和槽函数

我们先看看按钮(QPushButton)有哪些信号:

我们在程序中对着 #include <QPushButton> 按F1,就会出现关于这个头文件的帮助文档

信号的英文是Signals,所以我们要在Contents中找到Signals,但上图没有。没关系,我们可以看到 Inherits,表示QPushButton这个类是继承与QAbstractButton类的,所以点进去QAbstractButton就可以看见在Contents看到Signals了,再点击他,就会展示出应该有的信号了。

注意:信号不仅只有QT做好的信号,信号也可以自定义的。


可以看到,按钮(QPushButton类)会发送4个信号,我们选用pressed(),就是表示当按钮被按下的时候发送的信号。


既然我们知道了按钮中有什么信号,那么我们就可以对程序设置槽函数,例如我们对pressed()事件感兴趣,那么我们就让程序捕捉到pressed()信号后,执行槽函数。

槽函数既可以用QT写好的,也可以自定义一个。

那我们用QT写好的槽函数又怎么看有什么槽函数呢?以控制窗口的头文件为例:#include <QWidget>

对着该头文件按F1,然后查找 public slots,点进去,就能看到该头文件(类)提供的 槽函数有哪些


4.按钮绑定槽函数

关键函数:connect()

connect有4个参数,分别是:

1.发送信号的控件的引用

2.感兴趣的信号的引用

3.该兴趣的对象的引用(接受信号的对象的引用)

4.执行的槽函数的引用

对控件进行槽函数绑定也最好放在窗口(qt_class)的构造函数中,使得程序中的窗口一创建就完成绑定。

/*qt_class.cpp*/
#include "qt_class.h"

QT_class::QT_class(QWidget *parent)
    : QWidget(parent)
{
    b1.setParent(this);
    b1.setText("close");
    b1.show();
    connect(&b1,&QPushButton::pressed,this,&QWidget::close);    //进行槽函数绑定
}


QT_class::~QT_class()
{

}
上面connect的参数是 :b1按钮的引用,QPushButton类中pressed信号,该兴趣的对象是本窗口,槽函数是QWidget类中的close函数。其实换成&QT_class::close也行,因为QT_class类就是继承QWidget类的。


执行代码:当按下(用鼠标点击)close后,窗口就会被关闭。


4.自定义槽函数

1.槽函数要和信号一致(无论是参数还是返回值)

2.由于信号都是没有返回值的,所以槽函数也是没有返回值的。(返回值为void)


步骤:

1.现在qt_class.h的类中声明一个自定义的槽函数 void myslot();(先不用定义,定义写在qt_class.cpp中)

2.在qt_class.cpp中定义void myslot()函数。

3.在qt_class.cpp中的构造函数中调用connect绑定槽函数。


下面给出代码:代码实现点击b1后,b2显示 received

下面给出源文件qt_class.h 和 main.cpp(没修改) 和 qt_class.cpp,其中有注释语句的

/*qt_class.h*/
#ifndef QT_CLASS_H
#define QT_CLASS_H

#include <QWidget>
#include <QPushButton>
class QT_class : public QWidget
{
    Q_OBJECT

public:
    QT_class(QWidget *parent = 0);
    ~QT_class();
    void mySlot();//声明myslot()函数
private:
    QPushButton b1;
    QPushButton b2;
};

#endif 

/*main.cpp*/
#include "qt_class.h"
#include <QApplication>

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

    return a.exec();
}

/*qt_class.cpp*/
#include "qt_class.h"

QT_class::QT_class(QWidget *parent)
    : QWidget(parent)
{
    b1.setParent(this);
    b1.setText("send!");
    b1.show();
    b1.move(100,100);//按钮b1移到(100,100)处

    b2.setParent(this); //按钮b2设置父对象
    b2.setGeometry(0,0,200,20);//设置按钮b2的位置和大小
    b2.show();//显示按钮b2
    connect(&b1,&QPushButton::pressed,this,&QT_class::mySlot);//绑定槽函数。使按钮b1按下时,发送pressed信号,窗口接收改信号后调用myslot函数

}

void QT_class::mySlot() //定义myslot函数
{
    b2.setText("received!");    //myslot函数执行的作用就是把按钮b2上显示received!
}

QT_class::~QT_class()
{

}
注意一点,点击b1后,b2发生改变,在connect()中,为什么接收信号的对象不是b2,而是this(窗口)?因为b2是属于窗口的,而不是属于b2的,即b2中没有b2,窗口中才有b2.


  • 26
    点赞
  • 93
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值