- A+
知识点
1.信号创建
2.槽创建
3.窗口创建
4.按钮创建
5.通过信号与槽实现按钮与窗口之间互动
6.通过信号与槽实现窗口与窗口之间互动
信号JS中的window窗体事件,onclick,onchange,mouseover 等等
槽则是具体的执行方法,QT5可以通过匿名函数来实现 [](){}
[]内可以填写当前类里边的参数
()内用来传递信号中传递过来的参数
{}匿名函数主体
监听函数写法 connect() 类似 JS中的 on
信号与槽可能叫法不是很友好,应该叫 事件触发与事件执行
例子:
03_signal.pro
#-------------------------------------------------
#
# Project created by QtCreator 2021-02-03T13:23:08
#
#-------------------------------------------------
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = 03_signal
TEMPLATE = app
# The following define makes your compiler emit warnings if you use
# any feature of Qt which has been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += \
main.cpp \
mainwidget.cpp \
sonwidget.cpp
HEADERS += \
mainwidget.h \
sonwidget.h
CONFIG += C++11
mainwidget.h
#ifndef MAINWIDGET_H
#define MAINWIDGET_H
#include <QWidget>
#include <QPushButton>
#include "sonwidget.h"//子窗口
class MainWidget : public QWidget
{
Q_OBJECT
public:
MainWidget(QWidget *parent = 0);
~MainWidget();
void mySlot();
void showSon();
void returnMain();
void getParam(int,QString);
private:
QPushButton b1;
QPushButton *b2;
QPushButton b3;
Sonwidget s;
};
#endif // MAINWIDGET_H
sonwidget.h
#ifndef SONWIDGET_H
#define SONWIDGET_H
#include <QWidget>
#include <QPushButton>
#include <QString>
class Sonwidget : public QWidget
{
Q_OBJECT
public:
explicit Sonwidget(QWidget *parent = nullptr);
void sendSlot();
signals:
/*
*
* 信号必须有 signals 关键字来声明
* 信号没有返回值,但可以有参数
* 信号就是函数的声明,只需声明,无需定义
* 使用 emit mysignal();
* 信号可以重载
*/
void mySignal();
void mySignal(int,QString);
public slots:
private:
QPushButton b;
};
#endif // SONWIDGET_H
mainwidget.cpp
#include "mainwidget.h"
#include <QPushButton>
#include <QDebug>
MainWidget::MainWidget(QWidget *parent)
: QWidget(parent)
{
b1.setParent(this);
b1.setText("close");
b1.move(100,100);
b2 = new QPushButton(this);
b2->setText("jack");
connect(&b1,&QPushButton::pressed,this,&MainWidget::close);
/*
&b1 信号发出者 指针类型
&QPushButton::pressed 处理的信号 &发送者的类名::信号名字
this 信号接收者
&MainWidget::close 槽函数,信号处理函数 &接收的类名::槽函数名字
*/
/* 自定义槽
qt5 任意的成员函数,普通全局函数,静态函数
槽函数需要和信号一致(参数,返回值)
由于信号都是没有返回值,所以槽函数一定没有返回值
*/
connect(b2,&QPushButton::released,this,&MainWidget::mySlot);
connect(b2,&QPushButton::released,&b1,&QPushButton::hide);
setWindowTitle("老大");
b3.setParent(this);
b3.setText("切换到子窗口");
b3.move(50,50);
// s.show();//显示子窗口
connect(&b3,&QPushButton::released,this,&MainWidget::showSon);
//声明一个 指针函数来指向 子窗口的信号
void (Sonwidget::*funSignal)() = &Sonwidget::mySignal;
connect(&s,funSignal,this,&MainWidget::returnMain);
void (Sonwidget::*paramSignal)(int,QString) = &Sonwidget::mySignal;
connect(&s,paramSignal,this,&MainWidget::getParam);
//Lambda 表达式 匿名函数对象
//C++11增加的新特性,项目文件: CONFIG += C++11
//Qt 配合信号一起使用,非常方便
//声明一个 btn
QPushButton *btn_4 = new QPushButton(this);
btn_4->setText("Lambda表达式");
btn_4->move(150,150);
int a = 10,b = 100;
connect(btn_4,&QPushButton::released,
// = 把外部所有局部变量,类中所有成员按值传值
// this 把类中所有成员以值传递方式
[=](bool is_check) mutable//mutable 可以修改变量
{
btn_4->setText("123");
qDebug() << "11111";
qDebug() << a << b;
qDebug() << is_check;
}
);
}
void MainWidget::mySlot(){
b2->setText("666");
}
//隐藏主窗口 展示子窗口
void MainWidget::showSon()
{
this->hide();
s.show();
}
//返回主窗口 隐藏子窗口
void MainWidget::returnMain()
{
s.hide();
this->show();
}
//从主窗口获取字窗口的参数 并打印出来
void MainWidget::getParam(int a,QString str)
{
qDebug() << a << str.toUtf8().data();
}
MainWidget::~MainWidget()
{
}
sonwidget.cpp
#include "sonwidget.h"
Sonwidget::Sonwidget(QWidget *parent) : QWidget(parent)
{
this->setWindowTitle("小弟");
b.setParent(this);
b.setText("切换到主窗口");
//发送信号
connect(&b,&QPushButton::clicked,this,&Sonwidget::sendSlot);
}
void Sonwidget::sendSlot()
{
emit mySignal();
emit mySignal(250,"我是子窗口");
}
main.cpp
#include "mainwidget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWidget w;//先执行 构造函数
w.show();
return a.exec();
}
以上是一个简单的学习小例子
- 我的微信
- 这是我的微信扫一扫
-
- 我的微信公众号
- 我的微信公众号扫一扫
-