设计一个信号和槽
具体场景:
上回书说到:connect函数需要有四个参数,分别是:
- 信号的发送者
- 发送的信号 (函数地址)
- 信号的接受者
- 处理的槽函数 (函数的地址)
首先搞定信号的发送者:“女朋友”。
发送的信号,我们命名一个函数叫angry(),用来发送信号
信号的接受者:“男朋友”
处理的槽函数,我们命名一个函数叫coax(),用来处理信号
创建Boyfriend与Girlfriend类
右键点击项目文件夹
Base class选QObject或者QWidget,其他还没学到先不要选,避免出错
会多出来4个文件
女朋友发送信号
在对应的.h文件声明angry()函数
发送端由于只是发送信号,并没有需要其他功能,所以cpp文件不用实现angry()函数功能
男朋友接受信号,并调用槽函数处理信号
创建后是没有槽的声明,需要手动添加public slots:
在对应的.h文件声明coax()函数
接收端需要处理信号并输出【哄宝宝开心~】语句,需要在cpp文件实现coax()函数
窗口类实现连接
widget.h文件:引入头文件,声明自定义对象。定义一个触发信号函数,名字叫menstrualPeriod()-月经期,调用这个函数时,发送生气信号
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include "Boyfriend.h" //引入自定义的头文件
#include "Girlfriend.h" //引入自定义的头文件
QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
//在窗口类声明两个对象
Boyfriend *boy;
Girlfriend *girl;
//定义一个接口
void menstrualPeriod(); //月经期
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
widget.cpp文件:
- 实现menstrualPeriod()函数,用于发送信号,emit关键字就是发送的意思。
- 构造两个对象,this作为参数传入对应cpp的构造函数中
- 连接信号和槽
- 调用menstrualPeriod()函数,发送信号
#include "widget.h"
#include "ui_widget.h"
#include <QPushButton> //按钮头文件
#include <QColor> //用于改颜色
//Widget构造函数
Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget)
{
ui->setupUi(this);
this->boy = new Boyfriend(this); // 创建一个Boyfriend对象,并将当前对象作为参数传递给构造函数
this->girl = new Girlfriend(this); // 创建一个Girlfriend对象,并将当前对象作为参数传递给构造函数
//连接信号和槽,当女朋友生气时,男朋友会尝试哄她开心
connect(girl, &Girlfriend::angry, boy, &Boyfriend::coax);
//连接成功,调用函数
menstrualPeriod();
}
void Widget::menstrualPeriod() //月经期
{
//发送信号,emit意为发送
emit girl->angry();
}
Widget::~Widget()
{
delete ui;
}
运行结果
打开窗口后就控制台输出语句
实现新功能:点一下按钮,控制台发一条语句
给按钮加上背景颜色
上一篇的代码搬出来重用,做一个小改动,加个粉色和改一下文字
效果图
改文字很简单,怎么改颜色?
1. 首先,确保已经包含了必要的头文件:
#include <QColor>
2. 为了改变按钮的颜色,可以使用setStyleSheet
方法来设置按钮的背景颜色
btn2->setStyleSheet("background-color: pink"); //设置按钮的背景颜色
完整代码:
#include "widget.h"
#include "ui_widget.h"
#include <QPushButton> //按钮头文件
#include <QColor> //用于改颜色
Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget)
{
ui->setupUi(this);
//第二种new方式,省略上面两行
QPushButton *btn2 = new QPushButton("女朋友生气了", this);
btn2->move(100,100); //按钮左上点移动到100*100的位置上
btn2->setStyleSheet("background-color: pink"); //设置按钮的背景颜色
//connect(btn2, &QPushButton::clicked, this, &QWidget::close);
}
Widget::~Widget()
{
delete ui;
}
连接按钮的点击信号和槽函数
widget.cpp文件:
#include "widget.h"
#include "ui_widget.h"
#include <QPushButton> //按钮头文件
#include <QColor> //用于改颜色
//Widget构造函数
Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget)
{
ui->setupUi(this);
this->boy = new Boyfriend(this); // 创建一个Boyfriend对象,并将当前对象作为参数传递给构造函数
this->girl = new Girlfriend(this); // 创建一个Girlfriend对象,并将当前对象作为参数传递给构造函数
//第二种new方式,省略上面两行
QPushButton *btn2 = new QPushButton("女朋友生气了", this);
btn2->move(100,100); //按钮左上点移动到100*100的位置上
btn2->setStyleSheet("background-color: pink"); //设置按钮的背景颜色
//连接按钮点击事件与coax槽函数
connect(btn2, &QPushButton::clicked, boy, &Boyfriend::coax);
}
/*
void Widget::menstrualPeriod() //月经期
{
//发送信号,emit意为发送
emit girl->angry();
}
*/
Widget::~Widget()
{
delete ui;
}
运行结果
当然,你把menstrualPeriod()作为槽函数也可以,前提是【当女朋友生气时,男朋友会尝试哄她开心】这个信号和槽要先连接,效果一样:
#include "widget.h"
#include "ui_widget.h"
#include <QPushButton> //按钮头文件
#include <QColor> //用于改颜色
//Widget构造函数
Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget)
{
ui->setupUi(this);
this->boy = new Boyfriend(this); // 创建一个Boyfriend对象,并将当前对象作为参数传递给构造函数
this->girl = new Girlfriend(this); // 创建一个Girlfriend对象,并将当前对象作为参数传递给构造函数
//连接信号和槽,当女朋友生气时,男朋友会尝试哄她开心
connect(girl, &Girlfriend::angry, boy, &Boyfriend::coax);
//第二种new方式,省略上面两行
QPushButton *btn2 = new QPushButton("女朋友生气了", this);
btn2->move(100,100); //按钮左上点移动到100*100的位置上
btn2->setStyleSheet("background-color: pink"); //设置按钮的背景颜色
//连接按钮点击事件与menstrualPeriod槽函数
connect(btn2, &QPushButton::clicked, this, &Widget::menstrualPeriod);
//connect(btn2, &QPushButton::clicked, boy, &Boyfriend::coax);
//连接成功,调用函数
menstrualPeriod();
}
void Widget::menstrualPeriod() //月经期
{
//发送信号,emit意为发送
emit girl->angry();
}
Widget::~Widget()
{
delete ui;
}
补充知识点:
打印语句:
- 引入头文件<QDebug>
- qDebug() 作为输出,类似c++的cout
新的英文单词:说不定四六级能用上