1知识点
Qt两个窗口的建立、窗口的通信、处理子窗口的信号、信号的重载、Lamber表达式、自定义信号和自定义槽函数
结果演示
main.cpp
#include "mainwindow.h"
#include "subwidget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QPushButton>
#include "subwidget.h"
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
public slots:
void changeWin();
void ShutDown();
void delSub();
void delSubPrint(int,QString);
private:
QPushButton *p1;
QPushButton *shutdown;//关闭按钮
SubWidget subW;
};
#endif // MAINWINDOW_H
subwidget.h
#ifndef SUBWIDGET_H
#define SUBWIDGET_H
#include <QWidget>
#include <QPushButton.h>
class SubWidget : public QWidget
{
Q_OBJECT
public:
explicit SubWidget(QWidget *parent = 0);
void sendSlot();
signals:
/* 信号必须有signals关键字来声明
* 信号没有返回值,但可以有参数
* 信号就是函数的声明,只需声明,无需定义
* 使用:emit mySignal();
* 信号可以重载
*/
void mySignal();
void mySignal(int,QString);
public slots:
private:
QPushButton *subP1;//子窗口按钮
};
#endif // SUBWIDGET_H
mainwindow.cpp
#include "mainwindow.h"
#include <QDebug> //打印
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
resize(400,300);
this->setWindowTitle("BOSS");
p1=new QPushButton(this);
//p1->setParent(this);
p1->setText("切换到子窗口");
shutdown=new QPushButton(this);
shutdown->setText("关闭");
shutdown->move(100,0);
//关闭所有窗口
connect(shutdown,&QPushButton::released,this,&MainWindow::ShutDown);
//主窗口隐藏,子窗口显示
connect(p1,&QPushButton::released,this,&MainWindow::changeWin);
/* &p1: 信号发出者,指针类型
* &QPushButton::pressed:处理的信号, &发送者的类名::信号名字
* this: 信号接收者
* &MainWidget::close: 槽函数,信号处理函数 &接收的类名::槽函数名字
*/
/* 自定义槽,普通函数的用法
* Qt5:任意的成员函数,普通全局函数,静态函数
* 槽函数需要和信号一致(参数,返回值)
* 由于信号都是没有返回值,所以,槽函数一定没有返回值
*/
//主窗口调用子窗口的信号
//主窗口显示,子窗口隐藏
//connect(&subW,&SubWidget::mySignal,this,&MainWindow::delSub);//函数重载用不了
//信号的重载 一个有参数 一个无参数
//接收子窗口的信号方式一
// void (SubWidget::*SignalOnly)()=&SubWidget::mySignal;
// connect(&subW,SignalOnly,this,&MainWindow::delSub);
// void (SubWidget::*SignalCanShu)(int,QString)=&SubWidget::mySignal;
// connect(&subW,SignalCanShu,this,&MainWindow::delSubPrint);
//接收子窗口的信号方式二:宏函数SIGNAL
connect(&subW,SIGNAL(mySignal()),this,SLOT(delSub()));
connect(&subW,SIGNAL(mySignal(int,QString)),this,SLOT(delSubPrint(int,QString)));
//Lambda表达式, 匿名函数对象
//C++11增加的新特性, 项目文件: CONFIG += C++11
//Qt配合信号一起使用,非常方便
QPushButton *LamPush=new QPushButton(this);
LamPush->setText("Lamber表达式");
LamPush->move(180,0);
int a=10;
connect(LamPush,&QPushButton::clicked,
[=](){
qDebug()<<a;
}
);
}
void MainWindow::changeWin(){
this->hide();
subW.show();
}
//关闭窗口
void MainWindow::ShutDown(){
this->close();
subW.close();
}
void MainWindow::delSub(){
subW.hide();
this->show();
}
void MainWindow::delSubPrint(int age,QString name){
// str.toUtf8() -> 字节数组QByteArray
// ……data() -> QByteArray -> char *
qDebug() << age << name.toUtf8().data();
}
MainWindow::~MainWindow()
{
}
subwidget.cpp
#include "subwidget.h"
SubWidget::SubWidget(QWidget *parent) :
QWidget(parent)
{
this->setWindowTitle("SUB");
subP1=new QPushButton(this);
subP1->setText("切换到主窗口");
resize(500,400);
//子窗口发送信号 信号是有参数+无参数的
connect(subP1,&QPushButton::clicked,this,&SubWidget::sendSlot);
}
//回调函数
void SubWidget::sendSlot(){
emit mySignal();
emit mySignal(26,"唐维康");
}