#include "widget.h"
#include <QPushButton>
#include <QDebug>
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
b1.setParent(this);
b1.setText("shuaiTT");
b1.move(100,100);
b2 = new QPushButton(this);
b2->setText("pangRR");
b2->move(200,100);
connect(&b1,&QPushButton::pressed,this,&Widget::close);
// &b1:信号发出者 指针类型
// &QPushButton::pressed 处理的信号, &信号发出者的类名::信号类型
// this:信号接收者
// &Widget::close 槽函数,信号处理函数
/* 自定义槽 普通函数的用法*/
//QT:任意的成员函数,普通全局函数,静态函数
// 槽函数需要和信号一致
// 由于信号没有返回值 所以槽函数也没有返回值
connect(b2,&QPushButton::pressed,this,&Widget::my_slot);
this->setWindowTitle("baba");
b3.setParent(this);
b3.setText("切换待子窗口");
b3.move(150,200);
// w2.show(); //显示子窗口
connect(&b3,&QPushButton::released,this,&Widget::changeWin); //从父窗口跳到子窗口
//connect(&w2,&SubWidget::MySignal,this,&Widget::dealsub);//从子窗口跳到父窗口
//connect(&w2,&SubWidget::MySignal,this,&Widget::dealsub2); //重载信号
//处理信号重载的选择问题的方法(1)(QT5) 函数指针
void (SubWidget::*funsignal)() = &SubWidget::MySignal;
connect(&w2,funsignal,this,&Widget::dealsub);//从子窗口跳到父窗口
void (SubWidget::*funsignal2)(int , QString) = &SubWidget::MySignal;
connect(&w2,funsignal2,this,&Widget::dealsub2);
//处理信号重载的选择问题的方法(2)(QT4)
//Lambda表达式 C++新增的特性,项目文件 CONFIG += C++11 (匿名函数对象)
//QT配合信号一起使用很方便
QPushButton *b4 = new QPushButton(this);
b4->setText("lambda");
b4->move(250,200);
int a = 2,b=6;
connect(b4,&QPushButton::released,
[=]() mutable
// [] : 里面不加任何东西 权限很低
//[=] : 外部所有局部变量,类里面所有的成员以值传递方式
//[this] : 类里面所有的成员以值传递方式
//[&] : 引用符号 外部所有局部变量以值传递方式
//mutable : 本来的权限只是only——read 现在可以改变
{
qDebug() << "1111";
qDebug() << a << b;
}
);
resize(400,300);
}
void Widget::my_slot()
{
b2->setText("pangRR beauty...");
}
void Widget::changeWin()
{
//子窗口显示,父窗口隐藏
w2.show();
this->hide();
}
void Widget::dealsub()
{
//父窗口显示,子窗口隐藏
this->show();
w2.hide();
}
void Widget::dealsub2(int a , QString str)
{
qDebug() << a << str.toUtf8().data();
}
Widget::~Widget()
{
}
接着上次,利用发射信号处理完了从子窗口跳转到父窗口之后,假如我们碰到了一种信号函数需要重载的情况,该如何实现呢
//connect(&w2,&SubWidget::MySignal,this,&Widget::dealsub);//从子窗口跳到父窗口
//connect(&w2,&SubWidget::MySignal,this,&Widget::dealsub2); //重载信号
重载的是MySignal,这个函数 而在子窗口就发射的是两个信号
void SubWidget::sendslot()
{
emit MySignal();
emit MySignal(250,"我是帅TT");
}
当然不要忘记在头文件中
void MySignal();
void MySignal(int,QString);
那么重点来了,有两个信号,父窗口怎么去判断接受哪个信号,在这里,最新的方法是用函数指针
void (SubWidget::*funsignal)() = &SubWidget::MySignal;
connect(&w2,funsignal,this,&Widget::dealsub);//从子窗口跳到父窗口
void (SubWidget::*funsignal2)(int , QString) = &SubWidget::MySignal;
connect(&w2,funsignal2,this,&Widget::dealsub2);
然后在类里面编辑这两个函数的作用。
本来在学习的过程中还提到了Qt4里面一个方法,但是不知道什么原因一直没有能实现,但是这个方法有一个弊端,需要在头文件中将槽函数改为public slots
对于这个connect函数,QT中还有一个更好的Lambda表达式,用起来很方便
QPushButton *b4 = new QPushButton(this);
b4->setText("lambda");
b4->move(250,200);
int a = 2,b=6;
connect(b4,&QPushButton::released,
[=]() mutable
// [] : 里面不加任何东西 权限很低
//[=] : 外部所有局部变量,类里面所有的成员以值传递方式
//[this] : 类里面所有的成员以值传递方式
//[&] : 引用符号 外部所有局部变量以值传递方式
//mutable : 本来的权限只是only——read 现在可以改变
{
qDebug() << "1111";
qDebug() << a << b;
}
);
如果想用这个表达式 不能忘记需要在工程文件中加入一个 CONFIG += C++11