QT开发(二)(信号和槽)

2023-11-13

标准信号和槽

—main.cpp如图所示,诸多的控件应该在主窗口中去实现而不应在主函数中实现

在这里插入图片描述
—改变编码
TOOLS—>options—>TextEditor—>behavor—>file coding 选择Utf-8—>apply—>OK

—设置控件

MainWdiget.h

private:
    QPushButton b1;//对象
    QPushButton *b2;//指针方式
    QPushButton b3;

在MainWidget.cpp实现

  b1.setParent(this);
  b1.setText("close");
  b1.move(100, 100);
  
  b2 = new QPushButton(this);//注意指针需要动态分配空间,否则会发生段错误
  b2->setText("abc");

至此可以在主窗口上显示两个按键

—实现点击b1就会关闭主窗口

如何查看一个类帮助文档:点击类名,按F1(按两次全屏显示帮助文档),如果没有发现signal,则去查看其基类(Inherits)的signals

在这里插入图片描述
QPushbutton帮助文档无信号,其基类的信号如图所示

    b1.setParent(this);
    b1.setText("close");
    b1.move(100, 100);
    
    connect(&b1, &QPushButton::pressed, this, &MainWidget::close);
    /* &b1: 信号发出者,指针类型
     * &QPushButton::pressed:处理的信号,  &发送者的类名::信号名字
     * this: 信号接收者
     * &MainWidget::close: 槽函数,信号处理函数  &接收的类名::槽函数名字
    */

自定义槽

自定义槽的用法与普通函数的用法一样,Qt5中自定义槽可以是任意的成员函数,普通全局函数,静态函数。槽函数需要和信号一致(参数,返回值),信号是没有返回值的,故槽函数没有返回值

—通过点击b2将控件名字改变

 connect(b2, &QPushButton::released, this, &MainWidget::mySlot);//b2是指针,不用取地址
 
 写自定义槽函数时,一般写成共有的成员函数
 MainWidget.h
  void mySlot();//声明自定义槽函数 
  
 MainWidget.cpp
 void MainWidget::mySlot()
{
    b2->setText("123");
}

—通过点击抬起后b2使b1隐藏

MainWidget.cpp

connect(b2, &QPushButton::released, &b1, &QPushButton::hide);

—主窗口和 窗口切换

新建一个子窗口:

点击工程目录—>ADD NEW—>C++ CLASS—>命名为SubWidget基类选择为窗口类
添加一个按钮:在SubWidget.h中
private
QPushButton b;

SubWidget.cpp
    this->setWindowTitle("son");
    b.setParent(this);
    b.setText("切换到主窗口");
在主窗口设置一个按钮
    b3.setParent(this);
     setWindowTitle("father");//this—>setWindowTitle("father")也可以
    b3.setText("切换到子窗口");
    b3.move(50, 50);

注意,在设置完该子窗口后RUN并不会显示两个独立窗口,应该将SubWidget.h包含到MainWidget.h中并定义一个对象w(private: SubWidget w;),然后在MainWidget.cpp中w.show()即可显示出两个独立窗口

MainWidget.h
public :
void changeWin();

MainWidget.cpp
 connect(&b3, &QPushButton::released, this, &MainWidget::changeWin);


void MainWidget::changeWin()
{
  //子窗口显示
    subWin.show();
    //本窗口隐藏
    this->hide();
}

此时RUN,点击b3会显示子窗口w但是点击子窗口无反应,解决思路:在子窗口按下按钮后发出一个信号由主窗口处理

SubWidget.h
signals:
     /* 信号必须有signals关键字来声明
      * 信号没有返回值,但可以有参数
      * 信号就是函数的声明,只需声明,无需定义
      * 信号的使用:emit mySignal();
      * 信号可以重载
     */
    void mySignal();
 SubWidget.cpp
  connect(&b, &QPushButton::clicked, this, &SubWidget::sendSlot);

void SubWidget::sendSlot()
{
  emit mySignal();
}
MainWidget.cpp

connect(&w,&SubWidget::mySignal,this,&MainWidget::dealSub);


void MainWidget::dealSub()
{
    //子窗口隐藏
    subWin.hide();
    //本窗口显示
    show();
}

至此可以通过点击按钮实现两个窗口之间的切换

带参信号

信号重载
函数指针
正确输出QString

SubWidget.cpp
//将mySignal()重载,产生一个带参信号
void SubWidget::sendSlot()
{
    emit mySignal();
    emit mySignal(250, "我是子窗口");//切换子窗口时打印内容
}
MMainWidget.h
//在头文件中声明
void dealSlot();



MainWidget.cpp
  /*//之前也定义过一次,故会产生二义性,应该使用函数指针解决
connect(&w,&SubWidget::mySignal,this,&MainWidget::dealSub);
connect(&w,&SubWidget::mySignal,this,&MainWidget::dealSlot)*/

 void (SubWidget::*funSignal)() = &SubWidget::mySignal;
connect(&subWin, funSignal, this, &MainWidget::dealSub);


  void (SubWidget::*testSignal)(int, QString) = &SubWidget::mySignal;
  connect(&subWin, testSignal, this, &MainWidget::dealSlot);

void MainWidget::dealSlot(int a, QString str)
{
    // str.toUtf8() 转换成字节数组QByteArray
    // ……data()  将 QByteArray 转换成 char *可以输出
    qDebug() << a << str.toUtf8().data();

Lambda表达式

匿名函数对象
C++11新增加特性,需要在项目文件(.proc)加上 CONFIG += C++11

 QPushButton *b4 = new QPushButton(this);
    b4->setText("Lambda表达式");
    b4->move(150, 150);
    int a = 10, b = 100;
    connect(b4, &QPushButton::clicked,
            // = :把外部所有局部变量、类中所有成员以值传递方式,最常用
            // this: 类中所有成员以值传递方式
            // & : 把外部所有局部变量, 引用符号
            [=](bool isCheck)
            {
                 b4—>setText("123")
                qDebug() << isCheck;
                qDebug() << a<<b;//注意这样传进的参数是只读形式,想要修改则在()后加mutable
            }
            );
   //注意void QabstractButton::clicked(bool checked = false)是有参数的,一点击值就会变false,
   ()用来接收信号参数,所以使用这种方式可以不用定义常函数体

代码

MainWidget.h

#ifndef MAINWIDGET_H
#define MAINWIDGET_H


#include <QWidget>
#include <QPushButton>
#include "subwidget.h" //子窗口头文件


class MainWidget : public QWidget
{
    Q_OBJECT


public:
    MainWidget(QWidget *parent = 0);
    ~MainWidget();


public slots:
    void mySlot();
    void changeWin();
    void dealSub();
    void dealSlot(int, QString);


private:
    QPushButton b1;
    QPushButton *b2;
    QPushButton b3;


    SubWidget subWin;
};


#endif // MAINWIDGET_H
SubWidget.h

#ifndef SUBWIDGET_H
#define SUBWIDGET_H


#include <QWidget>
#include <QPushButton>


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 b;
};


#endif // SUBWIDGET_H
MainWidget.cpp

MainWidget::MainWidget(QWidget *parent)
    : QWidget(parent)
{
    b1.setParent(this);
    b1.setText("close");
    b1.move(100, 100);


    b2 = new QPushButton(this);
    b2->setText("abc");


    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("老大");
    //this->setWindowTitle("老大");


    b3.setParent(this);
    b3.setText("切换到子窗口");
    b3.move(50, 50);


    //显示子窗口
    //subWin.show();


    connect(&b3, &QPushButton::released, this, &MainWidget::changeWin);




    //处理子窗口的信号
//    void (SubWidget::*funSignal)() = &SubWidget::mySignal;
//    connect(&subWin, funSignal, this, &MainWidget::dealSub);


//     void (SubWidget::*testSignal)(int, QString) = &SubWidget::mySignal;
//    connect(&subWin, testSignal, this, &MainWidget::dealSlot);


    //Qt4信号连接
    //Qt4槽函数必须有slots关键字来修饰
    connect(&subWin, SIGNAL(mySignal()), this, SLOT(dealSub()) );


    connect(&subWin, SIGNAL(mySignal(int,QString)),
            this, SLOT(dealSlot(int,QString)) );
    // SIGNAL SLOT 将函数名字 -> 字符串  不进行错误检查


    //Lambda表达式, 匿名函数对象
    //C++11增加的新特性, 项目文件: CONFIG += C++11
    //Qt配合信号一起使用,非常方便


    QPushButton *b4 = new QPushButton(this);
    b4->setText("Lambda表达式");
    b4->move(150, 150);
    int a = 10, b = 100;
    connect(b4, &QPushButton::clicked,
            // = :把外部所有局部变量、类中所有成员以值传递方式
            // this: 类中所有成员以值传递方式
            // & : 把外部所有局部变量, 引用符号
            [=](bool isCheck)
            {
                qDebug() << isCheck;
            }




            );




    resize(400, 300);
}


void MainWidget::dealSlot(int a, QString str)
{
    // str.toUtf8() -> 字节数组QByteArray
    // ……data()  -> QByteArray -> char *
    qDebug() << a << str.toUtf8().data();
}


void MainWidget::mySlot()
{
    b2->setText("123");
}


void MainWidget::changeWin()
{
    //子窗口显示
    subWin.show();
    //本窗口隐藏
    this->hide();
}




void MainWidget::dealSub()
{
    //子窗口隐藏
    subWin.hide();
    //本窗口显示
    show();
}


MainWidget::~MainWidget()
{


}
SubWidget.cpp
#include "subwidget.h"


SubWidget::SubWidget(QWidget *parent) : QWidget(parent)
{
    this->setWindowTitle("小弟");
    b.setParent(this);
    b.setText("切换到主窗口");


    connect(&b, &QPushButton::clicked, this, &SubWidget::sendSlot);


    resize(400, 300);
}


void SubWidget::sendSlot()
{
    emit mySignal();
    emit mySignal(250, "我是子窗口");
}·
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QT开发(二)(信号和槽) 的相关文章

  • Qt常用部件介绍

    这里先给大家介绍 Designer 界面设计器 中例举的常用部件 以便对 Qt 的部件有一定认识 其具体用法后面再作介绍 布局管理组 Layouts 空间间隔组 弹簧 Spacers 按钮组 buttons 项目视图组 Item Views
  • Qt浅谈之一:内存泄露

    一 简介 Qt内存管理机制 Qt 在内部能够维护对象的层次结构 对于可视元素 这种层次结构就是子组件与父组件的关系 对于非可视元素 则是一个对象与另一个对象的从属关系 在 Qt 中 在 Qt 中 删除父对象会将其子对象一起删除 C 中del
  • QT学习 之 QwtPlot(数学绘图)

    QT对于统计图像 函数图像等的绘制是没有相关组件的帮助的 只有利用手工绘制图片 QwtPlot是用来绘制二维图像的widget 继承自QFrame 和 QwtPlotDict 不过严格的说来 它只是一个视图窗口 真正的绘制设备是它的中心部件
  • QT 5 中元对象系统的改变

    Qt 5 的元对象系统作出了一定的改变 既有底层变化 又有 API 的变化 其中有些修改与 Qt 4 不是源代码兼容的 本文将介绍这些改变 以及如何修改现有代码 使其能够使用 Qt 5 进行编译 同时 我们也将阐述下新增加的一些 API 使
  • Qt中实现单击button按钮发送单击信号,触发searchitem(QModelIndezparent,qsringtxt)槽函数,搜索后设置选中状态并设置背景色为红色。

    首先 我们依旧需要先创建一个 QPushButton 按钮 并且还需要创建一个槽函数 searchitem QModelIndex parent QString txt 来接收其发射的信号 接下来 在槽函数 searchitem 中 我们需
  • 自定义信号槽机制

    自定义信号槽机制 自定义信号 自定义槽 自定义信号和槽函数的使用 解决办法 如果想要在QT类中自定义信号槽 需要满足一些条件 并且有些事项也需要注意 要编写新的类并且让其继承Qt的某些标准类 这个新的子类必须从QObject类或者是QObj
  • Qt加载动态链接库

    Qt加载动态链接库 1 直接在pro文件中添加 首先将 a 或者 lib 和 dll文件放入某一目录中 一般是放入程序目录下 例如在程序目录下放入了mydll lab和mydll dll文件 然后在 pro文件中添加 LIBS L PWD
  • Ubuntu 配置第三方动态库的系统环境变量

    环境 ubuntu16 04 Qt5 7 1 简述 将第三方动态库配置到系统环境变量中 便于使用 步骤 1 将第三方动态库的头文件及 so 文件拷贝到桌面 RSAInclude文件夹 lib文件夹 2 进入桌面文件夹 打开命令框 3 输入命
  • Qt获取文件路径的方法

    Qt获取文件路径的方法 QString file full file name filePath file path file suffix QFileInfo fileinfo filePath QCoreApplication appl
  • Qt:读写SVG

    Qt 读写SVG 绘制SVG图形 SvgView SvgView const QString file QWidget parent QWidget parent doc new QSvgRenderer file this QSvgRen
  • QT信号与槽的连接方式

    一 Qt AutoConnectionQt AutoConnection表示系统自动选择相应的连接方式 如果信号与槽在同一线程 就采用Qt DirectConnection 如果信号与槽不在同一线程 将采用Qt QueuedConnecti
  • Qt内存泄露(总结)

    一 简介 Qt内存管理机制 Qt 在内部能够维护对象的层次结构 对于可视元素 这种层次结构就是子组件与父组件的关系 对于非可视元素 则是一个对象与另一个对象的从属关系 在 Qt 中 在 Qt 中 删除父对象会将其子对象一起删除 C 中del
  • QT开发(二)(信号和槽)

    QT开发 标准信号和槽 自定义槽 带参信号 Lambda表达式 代码 标准信号和槽 main cpp如图所示 诸多的控件应该在主窗口中去实现而不应在主函数中实现 改变编码 TOOLS gt options gt TextEditor gt
  • Qt 控制台运行无法弹出小黑框

    Qt Console Application Qt 主要是GUI界面的设计 但在学习的时候控制台运行显得更加方便一些 小编在第一次新建控制台运行的时候 点击运行没有弹出小黑框 解决方法 主要是因为没有执行qmake 就需要在Qt的pro文件
  • QT中日期和时间类

    QT中日期和时间类 QDate QTime QDateTime QDate QDate类可以封装日期信息也可以通过这个类得到日期相关的信息 包括 年 月 日 构造函数 QDate QDate QDate QDate int y int m
  • error: static assertion failed: Type is not registered, please use the Q_DECLARE_METATYPE macro to m

    error static assertion failed Type is not registered please use the Q DECLARE METATYPE macro to m 解决方案 报错信息如下 调用了类的静态函数导
  • Qt样式表-详解

    一 QT样式表简介 1 1 QT样式表简介 QSS的主要功能是使界面的表现与界面的元素分离 使得设计皮肤与界面控件分离的软件成为可能 QT样式表是允许用户定制widgets组件外观的强大机制 此外 子类化QStyle也可以定制widgets
  • Qt学习笔记——对release版本的.exe添加图标 程序发布

    Qt程序发布 1 将 ico图标文件拷贝到工程目录helloworld下 并重命名为Myico ico 2 在此工程目录下新建一个txt文档 输入 IDI ICON1 ICON DISCARDABLE Myico ico 另存为后缀名为pr
  • QT进程间通信 详细介绍

    在QT中 信号和槽的机制取代了这种繁杂的 易崩溃的对象通信机制 信号是当对象状态改变时所发出的 槽是用来接收发射的信号并响应相应事件的类的成员函数 信号和槽的连接是通过connect 函数来实现的 AD 1 QT通信机制 为了更好的实现QT
  • Qmake VS Cmake 对比讲解

    用 cmake 构建Qt工程 对比qmake进行学习 cmake vs qmake qmake 是为 Qt 量身打造的 使用起来非常方便 cmake 使用上不如qmake简单直接 但复杂换来的是强大的功能 内置的 out of source

随机推荐

  • 帧动画和补间动画的使用

    文章目录 一 Android 动画分类 二 帧动画 二 补间动画 1 alpha anim xml 动画实现 2 scale xml 动画实现 3 set 标签将多个动画组合 4 Java Code 实现 一 Android 动画分类 总的
  • 龙书笔记(11)

    chap 11 网格 后篇 这次涉及的内容微多 如何将x文件中的数据加载到id3dxmesh对象中 如何使用渐近网格接口id3dxpmesh 如何使用d3dx创建外接体 1 ID3DXBuffer 这是一个泛型数据结构 在使用的时候转换成自
  • Jmeter(二十) - 从入门到精通 - JMeter监听器 -下篇(详解教程)

    1 简介 监听器用来监听及显示JMeter取样器测试结果 能够以树 表及图形形式显示测试结果 也可以以文件方式保存测试结果 JMeter测试结果文件格式多样 比如XML格式 CSV格式 默认情况下 测试结果将被存储为xml格式的文件 文件的
  • 第一次做蛋糕,还不错呵呵。

    戚风蛋糕 味道还不错 img http dl iteye com upload attachment 313524 f5f5cd3b 7b82 34bb b343 70bba85f1ae0 jpg img img http dl iteye
  • uk码对照表_英码和中国码对照表

    刚来英国逛街 网购 或者在国内海淘的时候 相信总会有一个问题困扰你 这衣服和鞋子上标注的英码怎么看啊 分不清楚的时候 不得不拿上好几件试过才知道自己的码数 有时候不清楚码数连帮爸妈买件合身的衣服都困难 海淘的宝宝买错了尺码再退货更是个麻烦事
  • 网络_VMware网络连接模式——桥接模式、NAT模式以及仅主机模式的介绍和区别

    VMware网络连接模式 桥接模式 NAT模式以及仅主机模式的介绍和区别
  • C#之 JSon的使用

    Json简介 贴上百度简介地址 关于JSon的介绍 在c 中使用JSON首先需要在NugGit中加载第三方dll接口 NeWtonsoft Json 在需要使用的类中导入命名空间 using NewTonsoftJson Linq 处理Js
  • 未来刷脸支付就是一个必不可少的浪潮

    刷脸就是潮流 时代的产物扫码付款谁都拥有 那刷脸支付体验过吗 那代表未来设备升级就是一个必不可少的浪潮 还在犹豫的你准备加入这年代巨浪吗 AI刷脸支付功能定位就是安全认证 便捷省时 环保省资源 高效率 降低人工成本 人性化 解放双手 在顾客
  • QEventLoop 使用用例

    第一篇 QEventLoop 使用用例 问题描述 实验1 未使用 QEventLoop 实验2 使用 QEventLoop 问题描述 在while循环执行过程中同时响应其它时间 问题比较简单 记录一下实验过程 头文件 class MainW
  • 位运算计算规则

    0 0 0 0 1 0 1 0 0 1 1 1 按位与 两个相应的二进制位中都为1 该位的结果值为1 例 101010 110011 100010 0 0 0 0 1 1 1 0 1 1 1 1 按位或 两个相应的二进制位中只要有一个为1
  • 深入浅出设计模式之观察者设计模式

    举例 先让我们看一个简单的现实生活中的观察者设计模式 我们都知道老师与学生家长的关系 老师会把每次考试的成绩告诉家长 主题 只要是老师所教的班级的学生的家长才能收到 别的班级的家长不能收到 当学生毕业后 学生家长就无法收到学生成绩 只要产生
  • RabbitMQ理论+实战

    1 引出 1 1 中间件应用场景 1 跨系统数据传输 2 高并发的流量削峰 3 数据的分发与异步处理 4 大数据分析与传递 5 分布式事务 1 2 中间件常用协议 01 什么是协议 所谓协议是指 1 计算机底层操作系统和应用程序通讯时共同遵
  • 【华为OD机试/笔试真题 python】出错的或电路

    题目描述 出错的或电路 某生产门电路的厂商发现某一批次的或门电路不稳定 具体现象为计算两个二进制数的或操作时 第一个二进制数中某两个比特位会出现交换 交换的比特位置是随机的 但只交换这两个位 其他位不变 很明显 这个交换可能会影响最终的或结
  • 从零搭建完整python自动化测试框架(UI自动化和接口自动化 )——持续更新

    目录 一 总体框架 二 PO模式 DDT数据驱动 关键字驱动 三 框架技术选择 四 框架运行结果 五 各用例对应的定义方式 PO DDT 六 API接口定义方式 七 测试执行结果 从零开始搭建项目 一 开发环境搭建 二 新建项目 三 基础功
  • 软件测试分类、分级与软件缺陷管理

    软件测试分类与分级 4 1软件测试分类 4 1 1是否关心内部结构 1 白盒测试 白盒测试一般是静态测试 注重于内部结构 又称为结构测试或逻辑驱动测试 是一种按照程序内部逻辑结构和编码结构设计测试数据并完成测试的一种测试方法 2 黑盒测试
  • 回复上一篇文章,RuntimeError: CUDA error: CUBLAS_STATUS_ALLOC_FAILED when calling cublasCreate(handle)成功解决

    回应自己的上一篇文章地址在这 花了两天时间 找了各种方法 各种案例 以及各种的尝试 修改了很多次 也尝试用CPU去跑 后面发现还是跑不起来这个数据集 我罗列一部分方法 方法一 改batch size 的值 有的人问题就是这个 方法二 系统的
  • 报错“Cannot read properties of null (reading ‘addEventListener‘)“

    场景 控制台报错 Cannot read properties of null reading addEventListener 错误原因 因为 JavaScript 中操作DOM元素的函数方法需要在 HTML 文档渲染完成后才可以使用 如
  • 三层交换机配置----ensp

    没有你需要的三层交换配置类型 评论区留言 博主第一时间补充 说明 交换机统一为S3700 连接线为Ethernet 目录 一 最简形式 二 一交换机 多主机 三 三层交换机 二层交换机 四 两台三层交换机 一 最简形式 system vie
  • 国外那些富有创意的 404 页面

    点击上方 前端号 点亮你的前端技能树 最近在搜集前端相关文章时 无意看到了几篇关于国内外 404 页面的收集 觉得很多网站的 404 页面 特别富有创意 所以趁着周末还有些空余的时间 去梳理了一份富有创意的 国外网站 404 页面 正值周末
  • QT开发(二)(信号和槽)

    QT开发 标准信号和槽 自定义槽 带参信号 Lambda表达式 代码 标准信号和槽 main cpp如图所示 诸多的控件应该在主窗口中去实现而不应在主函数中实现 改变编码 TOOLS gt options gt TextEditor gt