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.