首页 > 其他分享 >Qt Sginals&Slots基本原理(1)

Qt Sginals&Slots基本原理(1)

时间:2023-06-05 20:11:19浏览次数:45  
标签:metacall Qt Sginals moc static Slots qt emit define

moc(mete object compiler)
  • C++语言原生不支持反射(简单来说就是描述自身结构的信息,例如类名、函数有多少个参数之类的信息)
  • moc准确来说是一个代码生成器,通过分析头文件(Qt的一些宏、信号、槽、属性等),生成对应的C++代码(包含类名字、信号函数、函数名字等信息)
  • moc这种非原生C++的机制会引来一些争议(消耗更多、原理更复杂)
Q_OBJECT
#define Q_OBJECT \
public: \
    static const QMetaObject staticMetaObject; \
    virtual const QMetaObject *metaObject() const; \
    virtual void *qt_metacast(const char *); \
    virtual int qt_metacall(QMetaObject::Call, int, void **); \
    QT_TR_FUNCTIONS \
private: \
    static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **);
  1. moc会生成staticMetaobject的初始化代码,并且staticMetaObject是只读数据来的
  2. moc生成metaObject函数的定义,一般来说返回staticMetaObject(QML对象可能会返回另一个对象)
  3. qt_metacast通过类名字对比进行类型转换(qobject_cast本质上就是调用这个)
  4. qt_metacall调用到qt_static_metacall
  5. qt_static_metacall信号和槽的调用都放在这个函数里面
signals、slots、emit宏定义
#define slots Q_SLOTS
#define signals Q_SIGNALS
#define Q_SLOTS QT_ANNOTATE_ACCESS_SPECIFIER(qt_slot)
#define Q_SIGNALS public QT_ANNOTATE_ACCESS_SPECIFIER(qt_signal)
#define QT_ANNOTATE_ACCESS_SPECIFIER(x)
#define emit

简化一下本质上就是

//槽本质上什么都没有定义
#define slots
//信号就是一个public关键字
#define signals public
//emit本质上什么都没有定义 emit信号本质是调用信号函数
#define emit

这些关键字的本质是让moc识别处理槽和信号,生成信号函数体、生成对应信号槽的id并放在qt_static_metacall函数中调用

标签:metacall,Qt,Sginals,moc,static,Slots,qt,emit,define
From: https://www.cnblogs.com/noexcept/p/17458655.html

相关文章

  • Qt 中事件与处理
    一、事件与处理程序在运算过程中发生的一些事情:鼠标单击、键盘的按下...这些的事件的监控与处理在Qt中不是以信号的方式处理的。当这些事件发生时会调用QObject类中的功能函数(虚函数),所有的控件类都继承了这个类。常用的鼠标事件:voidmousePressEvent(QMouseEvent*);按下voidmous......
  • Qt里怎么恢复一个被最小化的窗口
    这个需求出现在窗口最小化之后又被再次运行的时候。很多用户往往不去注意窗口是否已经存在,而是经常直接再次执行打开窗口操作。为了拦截这种情况,通常我们会去检测到窗口是否已经存在,如果存在则把它恢复正常,而不是再新创建一个。这个操作是通过ShowNormal()实现的,但这个函数在wi......
  • QT的特殊命名空间方式和C++对比
    Qt有以下的写法QT_BEGIN_NAMESPACEnamespaceUi{classWidget;}QT_END_NAMESPACE在开始和结束关键字中间进行命名空间的创建及其内部类的声明 而C++则是直接进行创建namespaceMyNamespace{//在MyNamespace命名空间内定义的类、函数、变量等classMyC......
  • QT的类的一些知识点
    给一个例子classSerialReaderThread:publicQThread{Q_OBJECTpublic:explicitSerialReaderThread(QSerialPort*serialPort,QObject*parent=nullptr):QThread(parent),serialPort(serialPort){}protected:voidrun()override......
  • pyqt5笔记-菜单与工具栏
    目录主窗口状态栏动作组合菜单栏子菜单勾选菜单右键菜单工具栏关闭当前窗口和结束应用程序主窗口QMainWindow就是主窗口,QMainWindow提供了更多的特性,如菜单栏、工具栏、状态栏和停靠窗口等,它是为复杂的主窗口应用设计的。QMainWindow继承自QWidget,所以QMainWindow不仅可以......
  • QT--C++简学
    2.1C++语言的新特点(对于C语言来说) 赋值:直接------- intx(100) 在定义的时候就可以赋值,相当于x=100;2.2输入(cin)--------输出(cout)  2.2.1   cout<<x<<endl;  //一个变量             --------printf     cout<<x<......
  • pyqt5入门
    目录基础流程基础操作面向对象基础流程面向对象跟面向过程的区别修改默认行为,在用户关闭时弹出消息盒子进行二次确认基础流程如下,就可以实现一个最基础的窗口,但也只有一个窗口:importsysfromPyQt5.QtWidgetsimportQApplication,QWidgetif__name__=='__main__':......
  • 【VS Code 与 Qt6】QCheckBox的图标为什么不会切换?
    本篇专门扯一下有关QCheckBox组件的一个问题。老周不水字数,直接上程序,你看了就明白。#include<QApplication>#include<QWidget>#include<QPushButton>#include<QCheckBox>#include<QVBoxLayout>#include<QIcon>intmain(intargc,char**argv){QAp......
  • 记录一次QT5下多线程使用Qxlsx操作写EXCEL表文件问题
    问题表述:一个主线程和两个子线程,两个子线程进行写EXCEL表格文件,线程1写demo_1.xlsx,线程2写demo_2.xlsx,运行一段时间后程序异常退出?。代码如下://两个线程代码一样,只是写入的文件名不同QXlsx::Documentdocument("demo_x.xlsx");introwLen=document.dimension()......
  • qt 一直提示找不到 libQt5Sql.so.5 库
    报错提示: 背景:1.在ubuntu下,编译了一套开源库,用的是qt5.92.但是qt5.9特别不好用,我换成了qt5.14.2,但是担心会不会报错,因为编译开源库用到的是qt5.9的库 编译工程1.一直报上面那个错2.其他错误倒没有 解决:1.参考原文链接2.我的修改:添加变量LD_LIBRARY_PATH......