01 创建文件
首先创建程序,命名(我的命名为MainWidget)、选择保存位置,然后无脑下一步就可以了
这时候会有三个文件:
mainwidget.h
mainwidget的头文件,所有在mianwidget.cpp中使用的函数必须要在这里声明,不然运行时候不会起作用的
main.cpp
主函数
mainwidget.cpp
窗口函数,添加按钮,窗口功能都在这里实现
注意: ①在实现功能之前,在 工具 ->选项 中,选择文本编辑器,并选择UTF-8编码模式
②写mainwidget.cpp的时候,按F4可以跳转到.h文件,很方便
02功能实现
2.1 一个值得注意的小错误
#include "mainwidget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWidget w; //先执行构造函数,执行MainWidget的构造函数
w.show();
return a.exec(); //等待用户操作
}
main.cpp 就这么几行,在中间MainWidget时候,就会跳转到mainwidget.cpp去执行构造函数(就是窗口各个功能的实现)
//mainwidget.cpp函数
#include "mainwidget.h"
#include <QPushButton>
MainWidget::MainWidget(QWidget *parent)
: QWidget(parent)
{
//函数功能的实现,这里是写了一个按钮
QPushButton b1; //创建一个按钮b1
b1.setParent(this);//把按钮的父类指定为这个窗口
b1.setText("^_^"); //把按钮的文本设置为^_^
}
MainWidget::~MainWidget()
{
}
开始基本上都会这么写,但是程序跑起来之后会发现没有作用,这是为什么呢?
这是因为我们在运行程序时候,这个按钮就变成局部变量了,只有在头文件中声明之后才可以在显示框里显示。
2.2 实现两个按钮
首先我们实现两个按钮的编写
先在.h文件里声明按钮
#ifndef MAINWIDGET_H
#define MAINWIDGET_H
#include <QWidget>
#include <QPushButton>
class MainWidget : public QWidget
{
Q_OBJECT
public:
MainWidget(QWidget *parent = 0);
~MainWidget();
private:
QPushButton b1; //声明按钮b1
QPushButton *b2; //声明按钮b2
};
#endif // MAINWIDGET_H
然后不用管main.cpp直接写mainwidget.cpp
#include "mainwidget.h"
#include <QPushButton> //包含按钮操作的头文件
MainWidget::MainWidget(QWidget *parent)
: QWidget(parent)
{
b1.setParent(this); //指定b1的父对象为此窗口,就是说b1在这个窗口上显示
b1.setText("123"); //设定b1的文本为123
b1.move(100, 100); //将b1挪动到100,100像素点的位置
b2 = new QPushButton(this); //因为b2是指针,要分配空间,就这样分配
b2->setText("abc"); //设定b2的文本
}
MainWidget::~MainWidget()
{
}
运行后就可以得到两个按钮
2.3信号和槽(signal和slot)
2.3.1 使用已经定义好的信号和槽函数
信号和槽函数,举个例子:你按下去一个按钮就是发送了一个信号,发送这个信号想干什么呢?可以关闭这个窗口,也可以最小化等等。而信号只要发出来了,不管这个程序在干嘛,都要执行相应的槽函数(就像不论你是在打游戏还是看书,你妈叫你,你都得去一样,至于是拖地扫地还是吃饭,由你妈说了算^_^)。
不知道用什么槽函数,可以参考2.4查找功能
这里我们实现的功能是:按下b1按钮,关闭窗口
基于之前的程序,在mainwidget.cpp里加这么一行就可以了
connect(&b1 ,&QPushButton::pressed, this,&MainWidget::close);
这句话什么意思呢?
&b1:信号发出者,指针类型
&QPushButton::pressed:处理的信号, &发送者的类名::信号名字
this:信号接受者,指针类型
&MainWidget::close:槽函数, &接受者的类名::槽名字
一句话就是:看“b1”有没有发出“pressed”按下这个信号,如果发出了,那么“this”这个主窗口,就要被“close”关闭了
整个mainwidget.cpp函数如下,嫌麻烦可以跳过:
#include "mainwidget.h"
#include <QPushButton>
MainWidget::MainWidget(QWidget *parent)
: QWidget(parent)
{
b1.setParent(this);
b1.setText("123");
b1.move(100, 100);
b2 = new QPushButton(this);
b2->setText("abc");
connect(&b1 ,&QPushButton::pressed, this,&MainWidget::close);
/* &b1:信号发出者,指针类型
* &QPushButton::pressed:处理的信号, &发送者的类名::信号名字
* &MainWidget::close:槽函数, &接受者的类名::槽名字
*/
}
MainWidget::~MainWidget()
{
}
2.3.2 自定义槽函数
除了他给的槽函数之外,我们还可以自定义槽函数,实现我们想实现,但是没有的功能。
比如:我想实现按下按钮,让b2这个按钮的文字改变
那么按照上边的逻辑来说,我们的connect函数结构不用变,就是把最后一个接收的槽函数自定义一下就可以了。
①首先,我们要在.h文件里声明槽函数,不然就会像2.1一样愚蠢-_-。只需要在public下自定义一个void myslot();就可以了
public:
MainWidget(QWidget *parent = 0);
~MainWidget();
void myslot(); //自定义槽函数
②接下来要在mainwidget.cpp函数里写myslot函数的功能
void MainWidget::myslot()
{
b2->setText("456"); //将b2的文本更改为456
}
③在mainwidget函数里写下调用文件就可以啦
connect(b2, &QPushButton::released, this, &MainWidget::myslot);
最后就实现功能了
2.3.3 信号和槽是一一对应的吗
我们可以把信号看做短信,槽函数看做接收短信的人,那么我们可以发现,一个信号可以对应多个槽(就像老板群发消息,我们就得干自己相应的活一样);一个槽也可以对应多个信号(就像很多老板问我要材料一样,不管谁要都得给)。
2.4查找功能
将光标放在某一个定义上,这里以QPushButton为例,按F1,再按F1,就会出现帮助界面
这时候按F1
再按F1
就会跳到帮助文档
帮助文档里可以看到它包含的内容,我们要找到signal不在里边,说明可能是继承的,就去他的父类里找
这个就是他的父类,点进去
我们发现有signal了,点进去
这些就是signal对应的槽函数,看到那个就可以点进去看说明,我们看pressed()
void表示信号没有返回值,解释说明:按下时信号被发射
这是我原创的笔记,学习的课程是:黑马程序员Qt(第一部分)_哔哩哔哩_bilibili
大家有问题欢迎留言~