Qt文档阅读笔记-Q_INVOKABLE官方解析及Qt中反射的使用

分手后的思念是犯贱 2022-12-22 15:28 279阅读 0赞

Q_INVOKABLE宏定义了函数在元对象中可以进行调用,这个宏要写到返回值的前面,也就是函数的开头,如下例子:

  1. class Window : public QWidget
  2. {
  3. Q_OBJECT
  4. public:
  5. Window();
  6. void normalMethod();
  7. Q_INVOKABLE void invokableMethod();
  8. };

invokeableMethod()可以调用用Q_INVOKABLE修饰过的函数。加了Q_INVOKABLE的宏注册到元对象系统里面,并且能够被元对象系统使用,普通的没有注册过的函数是不能被使用的。如果是调用QML中的函数,返回的值是QObject指针或者QObject的衍生类指针,那么需要查看这个规则Data Type Conversion Between QML and C++在此不介绍此规则。

下面是博主的小栗子,Qt中使用反射。

反射这个在Java中相当重要,很多结构型和行为型的设计模式使用到反射,就会显得简单得多。

在部分的功能里面用反射也可以省略掉很多乱七八糟的板砖代码。

程序运行截图如下:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxNzg0NDI3NjE_size_16_color_FFFFFF_t_70

项目结构如下:

20201120191350997.png

源码如下:

ReflectTest.h

  1. #ifndef REFLECTTEST_H
  2. #define REFLECTTEST_H
  3. #include <QObject>
  4. class ReflectTest : public QObject
  5. {
  6. Q_OBJECT
  7. public:
  8. ReflectTest(QObject *parent = nullptr);
  9. Q_INVOKABLE void setPrint(const QString &print);
  10. Q_INVOKABLE QString getPrint();
  11. Q_INVOKABLE QString testFunction(QString para);
  12. private:
  13. QString m_print;
  14. };
  15. #endif // REFLECTTEST_H

main.cpp

  1. #include <QCoreApplication>
  2. #include <QDebug>
  3. #include <QMetaObject>
  4. #include <QMetaMethod>
  5. #include "ReflectTest.h"
  6. int main(int argc, char *argv[])
  7. {
  8. QCoreApplication a(argc, argv);
  9. ReflectTest test1;
  10. test1.setPrint("one");
  11. qDebug() << test1.getPrint();
  12. qDebug() << "----------华丽的分割线----------";
  13. int count = test1.metaObject()->methodCount();
  14. for(int i = 0; i < count; i++){
  15. qDebug() << test1.metaObject()->method(i).name();
  16. }
  17. qDebug() << "----------华丽的分割线----------";
  18. qDebug() << test1.getPrint();
  19. qDebug() << QMetaObject::invokeMethod(&test1, "setPrint", Qt::DirectConnection, Q_ARG(QString, "one+one"));
  20. QString retVal;
  21. QMetaObject::invokeMethod(&test1, "getPrint", Qt::DirectConnection, Q_RETURN_ARG(QString, retVal));
  22. qDebug() << retVal;
  23. QMetaObject::invokeMethod(&test1, "testFunction", Qt::DirectConnection, Q_RETURN_ARG(QString, retVal), Q_ARG(QString, "one+one+one"));
  24. qDebug() << retVal;
  25. return a.exec();
  26. }

ReflectTest.cpp

  1. #include "ReflectTest.h"
  2. ReflectTest::ReflectTest(QObject *parent) : QObject(parent)
  3. {
  4. }
  5. void ReflectTest::setPrint(const QString &print)
  6. {
  7. m_print = print;
  8. }
  9. QString ReflectTest::getPrint()
  10. {
  11. return m_print;
  12. }
  13. QString ReflectTest::testFunction(QString para)
  14. {
  15. return "return:" + para;
  16. }

源码打包下载地址:

https://github.com/fengfanchen/Qt/tree/master/ReflectDemo

发表评论

表情:
评论列表 (有 0 条评论,279人围观)

还没有评论,来说两句吧...

相关阅读