首页 > 其他分享 >QT之静态函数发送信号

QT之静态函数发送信号

时间:2024-01-18 14:25:08浏览次数:34  
标签:静态数据 Widget QT 静态 成员 ClassA 发送 static

一、简介

由于博主本人是初学者对QT的机制不了解,所以遇到了一个比较大的坑,特此记录一下。我遇到的问题是无法在静态函数中向另外一个类发送信号。解决办法:先将信号发送给同类中的普通函数,然后在从普通函数中发送信号给外部类。

二、C与C++中static的用法

这里不是介绍QT静态函数信号的发送吗,和static的用法有什么联系,因为在编写代码中会出现静态成员无法访问普通成员的错误,这里我复制了菜鸟教程的图片。

接下来先了解一下static的用法。

  1. C语言中static的作用
    主要有三个作用:隐藏性、持久性、默认值为0
  • 隐藏性:当我们同时编译多个文件时,所有未加 static 前缀的全局变量和函数都具有全局可见性。
  • 持久性:在函数内部使用static修饰变量时,不仅可以是变量具有隐藏性,还能增加变量生命。
  • 默认初始化为 0:在静态数据区,内存中所有的字节默认值都是 0x00,其实全局变量也具备这一属性,因为全局变量也存储在静态数据区。
    想了解具体的用法可以去菜鸟教程学习《C 语言中 static 的作用》。
  1. C++ 中static的作用
    C++中使用static需要主要的地方
  • 静态成员函数中不能调用非静态成员。
  • 非静态成员函数中可以调用静态成员。因为静态成员属于类本身,在类的对象产生之前就已经存在了,所以在非静态成员函数中是可以调用静态成员的。
  • 静态成员变量使用前必须先初始化(如 int MyClass::m_nNumber = 0;),否则会在 linker 时出错。

修饰成员变量

  • 静态数据成员可以实现多个对象之间的数据共享,它是类的所有对象的共享成员,它在内存中只占一份空间,如果改变它的值,则各对象中这个数据成员的值都被改变。
  • 静态数据成员是在程序开始运行时被分配空间,到程序结束之后才释放,只要类中指定了静态数据成员,即使不定义对象,也会为静态数据成员分配空间。
  • 静态数据成员可以被初始化,但是只能在类体外进行初始化,若未对静态数据成员赋初值,则编译器会自动为其初始化为 0。
  • 静态数据成员既可以通过对象名引用,也可以通过类名引用。

修饰成员函数

  • 静态成员函数和静态数据成员一样,他们都属于类的静态成员,而不是对象成员。
  • 非静态成员函数有 this 指针,而静态成员函数没有 this 指针。
  • 静态成员函数主要用来方位静态数据成员而不能访问非静态成员。
    想了解具体的用法可以去菜鸟教程学习《C/C++ 中 static 的用法全局变量与局部变量》。

三、程序源码

ClassA.h 文件

 
  #ifndef CLASSA_H
  #define CLASSA_H
   
  #include <QObject>
  #include <iostream>
   
  class ClassA : public QObject
  {
  Q_OBJECT
  public:
  ClassA();
  ~ClassA();
   
  static void SignalGeneration(); //静态函数,信号将从此函数发生
   
  private:
  static ClassA *myClassA; //它在内存中只占一份空间
   
  signals:
  void SigExternal(QString str); //向外部的类发送信号
  void SigInsideDelier(char *str); //发送信号到此类的信号槽
   
  private slots:
  void SlotInsideDelier(char *str); //内部槽 用于响应内部信号
  };
   
  #endif // CLASSA_H
 

ClassA.cpp文件

 
  #include "ClassA.h"
   
  ClassA *ClassA::myClassA = NULL; // 静态成员变量使用前必须先初始化,否则使用是会提示变量未定义
   
  ClassA::ClassA()
  {
  myClassA = this;
  connect(this, &ClassA::SigInsideDelier, [this](char *str)
  {
  emit SlotInsideDelier(str);
  });
  }
   
  void ClassA::SignalGeneration()
  {
  const char *str = "信号生产成功";
  emit myClassA->SigInsideDelier((char *)str);
  }
   
  void ClassA::SlotInsideDelier(char *str)
  {
  emit SigExternal(QString(str));
  }
   
  ClassA::~ClassA()
  {
   
  }
 

widget.h文件

 
  #ifndef WIDGET_H
  #define WIDGET_H
   
  #include <QWidget>
  #include "ClassA.h"
   
  QT_BEGIN_NAMESPACE
  namespace Ui { class Widget; }
  QT_END_NAMESPACE
   
  class Widget : public QWidget
  {
  Q_OBJECT
   
  public:
  Widget(QWidget *parent = nullptr);
  ~Widget();
   
  private slots:
  void on_pushButton_clicked();
   
  void classA_msg(QString str);
   
  private:
  Ui::Widget *ui;
  };
  #endif // WIDGET_H
   
 

widget.cpp文件

 
  #include "widget.h"
  #include "ui_widget.h"
  #include <iostream>
  #include "ClassA.h"
   
  using namespace std;
   
  ClassA *classA;
   
  Widget::Widget(QWidget *parent)
  : QWidget(parent)
  , ui(new Ui::Widget)
  {
  classA = new ClassA();
   
  connect(classA, SIGNAL(SigExternal(QString)), this, SLOT(classA_msg(QString))); //注意这里传递信号必须使用QString不能使用char *,否则接收数据会异常,具体原因未知
  ui->setupUi(this);
  }
   
  Widget::~Widget()
  {
  delete classA;
  delete ui;
  }
   
  void Widget::on_pushButton_clicked()
  {
  ClassA::SignalGeneration();
  }
   
  void Widget::classA_msg(QString str)
  {
  ui->plainTextEdit->appendPlainText(str);
  }
 

程序界面

四、运行测试

参考文献

C 语言中 static 的作用:https://www.runoob.com/w3cnote/c-static-effect.html
C/C++ 中 static 的用法全局变量与局部变量:https://www.runoob.com/w3cnote/cpp-static-usage.html
Qt知识点梳理 —— 静态函数发送信号:https://blog.csdn.net/tingzhiyi/article/details/112631489

标签:静态数据,Widget,QT,静态,成员,ClassA,发送,static
From: https://www.cnblogs.com/kn-zheng/p/17972399

相关文章

  • QT之ARM平台的移植
      在开发板中运行QT程序的基本条件是具备QT环境,那么QT的移植尤为重要,接下载我将和小伙伴们一起学习QT的移植。一、准备材料tslib源码qt-everywhere-src-5.12.9.tar.xz源码arm开发版二、获取安装包tslib源码的git获取地址是:https://github.com/libts/tslib。qt-everywh......
  • python pyqt6 QComboBox 圆角边框
    圆角边框周围显示黑色直角QComboBox 新增如下设定即可xxx_source.view().window().setWindowFlag(Qt.WindowType.NoDropShadowWindowHint)xxx_source.view().window().setWindowFlag(Qt.WindowType.FramelessWindowHint)xxx_source.view().window().setAttribute(Qt.Widge......
  • C# 中,可以使用 System.Net.Sockets 命名空间中的 UdpClient 类来发送和接收 UDP 数据
    C#中,可以使用System.Net.Sockets命名空间中的UdpClient类来发送和接收UDP数据报文。以下是一个简单的C#示例,演示如何使用UDP发送和接收数据:点击查看代码usingSystem;usingSystem.Net;usingSystem.Net.Sockets;classProgram{staticvoidMain(){......
  • C#实例方法和静态方法有区别吗?各自的优缺点有哪些?
     实例方法和静态方法之间有几个关键的区别:1.实例方法:关联对象: 实例方法是与对象实例相关联的,必须通过实例来调用。this关键字: 实例方法中可以使用 this 关键字引用当前实例。访问实例成员: 实例方法可以直接访问和修改实例的字段、属性和其他成员。生命周期: 实例......
  • Qt/C++自定义界面大全/20套精美皮肤/26套精美UI界面/一键换肤/自定义颜色/各种导航界
    一、前言这个系列对应自定义控件大全,一个专注于控件的编写,一个专注于UI界面的编写,程序员有两大软肋,一个是忌讳别人说自己的程序很烂很多bug,一个就是不擅长UI,基本上配色就直接rgb,对于第一点,只要放松心态,直面自己的不足,不断改进,才能问鼎武林至尊。至于第二点,因为程序员擅长的是逻辑......
  • 发送邮件
    importtimeimportrandom'''定义一个函数,展示菜单栏'''defrandom_code():number=random.randint(100000,999999)returnnumber定义一个函数发送邮箱defsend_email(receiver_email,info):#zyxkyiufoghagijeimportsmtplibfromemail.mime.texti......
  • python pyqt6 颜色弹窗 QColorDialog
     defsetColor(self):#避免窗口置顶后,Dialog被主窗口覆盖,所以需要传递self#设定默认颜色使用getColor的第一个参数(使用setCurrentColor不生效)#"选择颜色"为Dialog弹窗的标题#设定QColorDialog.ColorDialogOption.ShowAlphaChanne......
  • SUSE Linux Enterprise Server 12 SP5 配置静态IP
    背景介绍近期看到的一道面试题,要求使用Suse系统。由于我之前没有接触过Suse系统,记录下如何配置IP地址。(环境是VMwareFusion虚拟机)参考文档SuSE12SP5配置静态IP地址-魔幻小生-博客园(cnblogs.com)具体步骤查看系统版本linux-nvlm:/etc/sysconfig/network#hostnamec......
  • CH395实现MQTT应用(补充说明)
    本文是对该篇文章的补充CH395+EMQX实现MQTT应用(Windows系统)-lqlq123-博客园(cnblogs.com)1.切换中文版在设置中可以选择EMQX使用语言及样式主题 2.监控主题及消息数据第一种方法:点击左侧监控,下拉可以直接看到所有客户端的数据详情第二种方法:想要监控特......
  • QT与VTK结合
    QT与VTk结合最简单的方法在代码中实例化vtkwidget,并设置其渲染窗口setRenderWindow,如下所示:#include"vtkGenericOpenGLRenderWindow.h"#include"QVTKOpenGLNativeWidget.h"QVTKOpenGLNativeWidget*qvtkWidget=newQVTKOpenGLNativeWidget();vtkGenericOpenGLRend......