作为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
#include
#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
#include
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
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
myWidget w;
w.show();
return a.exec();
}
#include "mywidget.h"
#include
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++ 的头文件、源文件、声明与定义 分开的编程思维习惯,挺符合前沿知识的!
②在主窗口处声明一个子窗口对象,主窗口就可以通过自定义的槽,任意操作子窗口
③而子窗口只能通过发送信号来操作主窗口