巩固信号和槽
1.标准的信号和槽
connect:
- 参数1: 信号的发送者;
- 参数2: 发送的信号;
- 参数3: 信号的接收者;
- 参数4: 接收信号后调用的槽函数.
#include "mainwindow.h"
#pragma execution_character_set("utf-8")
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
//this 指向 w对象的指针
this->setWindowTitle("标准的信号和槽");
resize(600,600);
pBtn1 = new QPushButton(this);
pBtn1->setText("开始");
pBtn2 = new QPushButton(this);
pBtn2->setText("结束");
pBtn2->move(200,200);
//注册 信号发送者;发送标准信号,信号接收者(main.cpp里的w对象),自定义的槽函数
connect(pBtn1,&QPushButton::pressed,this,&MainWindow::changeBtnText);
}
MainWindow::~MainWindow()
{
}
void MainWindow::changeBtnText()
{
pBtn2->setText("^o^");
}
2. 自定义信号
做两个窗口,父窗口和子窗口;
父窗口上有一个按钮;
子窗口上也有一个按钮;
点击父窗口上面的按钮,切换到子窗口;点击子窗口上面的按钮,切换到父窗口.
emit 信号(); //发送信号
#include "mainwindow.h"
#include <QDebug>
#pragma execution_character_set("utf-8")
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
setWindowTitle("父窗");
resize(500,500);
pBtn = new QPushButton(this);
pBtn->setText("切换到子窗口");
pChildWnd = new childmanwindow;
connect(pBtn,&QPushButton::pressed,this,&MainWindow::hidThisAndShowChild);
/*------------------------------------------------------------------------------------------*/
//Qt4版本的信号和槽的写法
connect(pChildWnd,SIGNAL(mySignal()),this,SLOT(handChild()));
connect(pChildWnd,SIGNAL(mySignal(QString,int)),this,SLOT(handChildSignal(QString,int)));
}
MainWindow::~MainWindow()
{
}
void MainWindow::hidThisAndShowChild()
{
//显示子窗口
pChildWnd->show();
//隐藏当前窗口
this->hide();
}
void MainWindow::handChild()
{
qDebug() << "无参的槽函数" << endl;
//显示父窗口
this->show();
//隐藏之窗口
pChildWnd->hide();
}
void MainWindow::handChildSignal(QString str,int n)
{
qDebug() << "带参的槽函数" << endl;
qDebug() << str << ":" << n <<endl;
//显示父窗口
this->show();
//隐藏子窗口
pChildWnd->hide();
}
#include "childmanwindow.h"
childmanwindow::childmanwindow(QWidget *parent) : QMainWindow(parent)
{
setWindowTitle("子窗");
resize(500,500);
pBtn = new QPushButton(this);
pBtn->setText("切换到父窗口");
connect(pBtn,&QPushButton::pressed,this,&childmanwindow::mySlot);
}
void childmanwindow::mySlot()
{
//发信号
emit mySignal();
emit mySignal("测试",666);
}
3. lambda表达式
C++11中的lambda表达式用于定义并创建匿名的函数对象,以简化编程工作.
Lamdba表达式的基本构成:
[函数对象参数](操作符重载函数参数)mutable ->返回值{函数体}
[capture](parameters) mutable ->return-type
{
statement
}
[]把当前的区域的一些内容传递到lambda表达式的{}里面.
#include "mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
setWindowTitle("lambda");
resize(500,500);
QPushButton* pBtn1 = new QPushButton(this);
QPushButton* pBtn2 = new QPushButton(this);
pBtn1->setText("你好");
pBtn1->move(200,200);
pBtn2->setText("我好");
connect(pBtn2,&QPushButton::pressed,this,&MainWindow::mySlot);
connect()
connect(pBtn1,&QPushButton::pressed,[pBtn2](){
qDebug() << "点击 你好 按钮" << endl;
if(pBtn2->text() == "你好")
pBtn2->setText("大家都好");
else
pBtn2->setText("我好");
});
}
MainWindow::~MainWindow()
{
}
void MainWindow::mySlot()
{
qDebug() << "点击 ---我好--- 按钮" << endl;
}