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

  • Post author:
  • Post category:其他




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.



版权声明:本文为u014453898原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。