C++ Qt 核心机制:信号和槽

作为C++优秀的图形界面编辑工具Qt(没有之一),信号和槽是一个核心的机制,
笔者利用信号和槽,写了一个简陋的小程序,希望能帮初学者了解信号和槽是怎么工作的
一、创建工程
详见我之前写过的一篇详细的文档
http://blog.csdn.net/larger5/article/details/78587076
就有了如下自动生成的代码模版

二、界面和功能
这里写图片描述
Ⅰ在 主窗口(never say never)中
①点击的 larger,主窗口会变大,
②点击bigger_son,子窗口(son)会变大
③点击主窗口的close,主窗口会关闭
Ⅱ在 子窗口(son)中
①点击 bigger_boss,父窗口(nerver say nerver)就会变大

注:这里的变大,其实只是同按钮这个事件,出响应的反应(改变边框的范围罢了)
说得专业点,就是点击按钮,发出一个信号,对应的槽函数就会做出响应的对策

三、代码和解释(很多代码都是自动生成的、注意注释中的代码就好了)
这里写图片描述

①头文件(按图片的顺序给代码)
这里写图片描述

#ifndef MYWIDGET_H
#define MYWIDGET_H

#include <QWidget>
#include <QPushButton>
#include "son.h" //头文件使用引号
class myWidget : public QWidget
{
Q_OBJECT

public:
myWidget(QWidget *parent = 0);
~myWidget();
public slots:
void larger();
void bigger_son();
void dm();
private:
QPushButton b1;
QPushButton b2;
QPushButton b3;
son s;//有了上面son 的头文件,这里就可以创建该对象
};

#endif // MYWIDGET_H
 #ifndef SON_H
#define SON_H

#include <QWidget>
#include<QPushButton>
class son : public QWidget
{
Q_OBJECT
public:
explicit son(QWidget *parent = 0);
void send();
signals:
void bigger_boss();
public slots:
private:
QPushButton b1;
};

#endif // SON_H

②源文件(按图片的顺序给代码)

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

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

w.show();

return a.exec();
}
#include "mywidget.h"
#include<QPushButton>

myWidget::myWidget(QWidget *parent)
: QWidget(parent)
{
//设置窗口的标题
setWindowTitle("never say never");
//设置窗口的大小
this->resize(400,250);
//设置son对象的可视
s.show();

//使用默认的槽函数:关闭当前界面
b1.move(100,100);
b1.setParent(this);
b1.setText("close");
connect(&b1,&QPushButton::pressed,this,&myWidget::close);

//自定义槽函数:变大当前界面
b2.move(10,10);
b2.setParent(this);
b2.setText("larger");
connect(&b2,&QPushButton::pressed,this,&myWidget::larger);

b3.move(100,10);
b3.setParent(this);
b3.setText("bigger_son");
connect(&b3,&QPushButton::pressed,this,&myWidget::bigger_son);

//处理信号
connect(&s,&son::bigger_boss,this,&myWidget::dm);
}

myWidget::~myWidget(){}

void myWidget::larger()
{
this->resize(500,400);
}
void myWidget::bigger_son()
{
s.resize(550,450);
}
void myWidget::dm()//注意点
{
this->resize(450,300);//注意点:改变大小的反应
}

#include "son.h"

son::son(QWidget *parent) : QWidget(parent)
{
this->setWindowTitle("son");
this->resize(300,300);

b1.setParent(this);
b1.setText("bigger_boss");
b1.move(50,50);
connect(&b1,&QPushButton::pressed,this,&son::send);
}
void son::send()
{
emit bigger_boss();//注意点
}

四、思考小结
思考:
①借助 Qt 学习 C++ 的头文件、源文件、声明与定义 分开的编程思维习惯,挺符合前沿知识的!
②在主窗口处声明一个子窗口对象,主窗口就可以通过自定义的槽,任意操作子窗口
③而子窗口只能通过发送信号来操作主窗口

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT小村

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值