1、指定父对象
为什么要指定父对象?因为如果不指定父对象,打开的窗口时独立的,这显然不是我们想要的,我需要的是一个窗口嵌套一个窗口,有不同层级。
指定父对象有个好处就是,父窗口显示,子窗口自动显示,这样窗口非常多的时候,因为默认窗口时隐藏的,而一个个show了。
首先,我们不在main.cpp中编辑,因为主函数太长并不美观,而在构造函数中写。因为要完成什么功能是窗口来完成
接下来在mywidget.cpp中编辑:
设置主窗口:
resize(600,600);//主窗口大小
//与 this->resize(100,100) 等价
this->setWindowTitle("计算器");//主窗口设定标
设定按钮:
QPushButton b;
b.setText("111");
b.show();
以上三行代码直接这样在mywidget.cpp写有两个问题:
1)这个按钮的作用域只在构造函数,构造完按钮就没了,所以不存在按钮
2)如果不指定父对象,对象与对象之间(窗口)没有关系,互相独立
a指定b为它的父对象,a在b的上面
指定父对象的方式:
2.1)setParent
使用这种方式要把按钮设置为成员变量
2.2)通过构造函数传参
通过new 动态分配 缺点后面再说 指定父对象,只需要父对象显示,上面的子对象自动显示
private:
QPushButton b;
QPushButton *b1;
b.setText("close");//给按钮设定内容
b.setParent(this);//指定父对象
b.move(100,100);//以左上角为(0,0)
b.resize(50,20);//设定按钮大小
//方式2
b1 = new QPushButton(this);
b1->setText("222");
在.h和.cpp中加入
2、标准信号和槽:
connect(&b,&QPushButton::pressed,this,&MyWidget::close);
/*
* & :信号发出者,指针类型
* &QPushButton::pressed: 处理的信号, &发送者的名字::信号名
* this: 信号接收者
* &MyWidget::close: 槽函数,信号处理函数 &接收的类名::槽函数名字
*/
connect(b1, &QPushButton::released, &b, &QPushButton::hide);
//信号:短信 槽函数:接受短信的手机
3、自定义信号和槽
自定义槽:
connect(b1, &QPushButton::released, this, &MyWidget::mySlot);
此处的mySlot()要在类中声明为成员函数,注意参数返回值一致
自定义信号:
404 NOT FOUND
4、Lambda表达式
connect(b1, &QPushButton::released,
// = : 吧外部的局部变量和类中的变量按值传递
[=]()
{
qDebug() << " 111 ";
}
);
/*
* Lambda表达式, 匿名函数对象
* C++11的新特性, 项目文件: CONFIG += C++11
*/
codes:
#include "mywidget.h"
#include <QPushButton>
#include <QDebug>
MyWidget::MyWidget(QWidget *parent)
: QWidget(parent)
{
resize(600,600);//主窗口大小
//与 this->resize(100,100) 等价
this->setWindowTitle("计算器");//主窗口设定标题
// QPushButton b;
// b.setText("111");
// b.show();
/*
* 此处有两个问题:
* 1)这个按钮的作用域只在构造函数,构造完按钮就没了,所以不存在按钮
* 2)*如果不指定父对象,对象与对象之间(窗口)没有关系,互相独立,如以上三行代码
* a指定b为它的父对象,a在b的上面
* 指定父对象的方式:
* 1)setParent
* 使用这种方式要把按钮设置为成员变量
* 2)通过构造函数传参
* 通过new 动态分配 缺点后面再说
* 指定父对象,只需要父对象显示,上面的子对象自动显示
*/
b.setText("close");//给按钮设定内容
b.setParent(this);//指定父对象
b.move(100,100);//以左上角为(0,0)
b.resize(50,20);//设定按钮大小
//方式2
b1 = new QPushButton(this);
b1->setText("222");
connect(&b,&QPushButton::pressed,this,&MyWidget::close);
/*
* & :信号发出者,指针类型
* &QPushButton::pressed: 处理的信号, &发送者的名字::信号名
* this: 信号接收者
* &MyWidget::close: 槽函数,信号处理函数 &接收的类名::槽函数名字
*/
/*
* 自定义槽,普通函数的用法
* Qt5: 任意的成员函数,普通全局函数,静态函数
* 槽函数需要和信号一致(参数,返回值)
* 由于信号都没返回值,所以,槽函数一定没有返回值
*/
connect(b1, &QPushButton::released, this, &MyWidget::mySlot);
connect(b1, &QPushButton::released, &b, &QPushButton::hide);
//信号:短信 槽函数:接受短信的手机
connect(b1, &QPushButton::released,
// = : 吧外部的局部变量和类中的变量按值传递
[=]()
{
qDebug() << " 111 ";
}
);
/*
* Lambda表达式, 匿名函数对象
* C++11的新特性, 项目文件: CONFIG += C++11
*/
}
void MyWidget::mySlot()
{
b1->hide();
}
MyWidget::~MyWidget()
{
}
#ifndef MYWIDGET_H
#define MYWIDGET_H
#include <QWidget>
#include <QPushButton>
class MyWidget : public QWidget
{
Q_OBJECT//信号和槽需要
private:
QPushButton b;
QPushButton *b1;
public:
MyWidget(QWidget *parent = 0);
~MyWidget();
void mySlot();
};
#endif // MYWIDGET_H