首页 > 其他分享 >Qt 反射 newInstance

Qt 反射 newInstance

时间:2024-10-26 18:47:24浏览次数:7  
标签:反射 return Qt newInstance qt age Person include name

pragma once

include <qobject.h>

include

using namespace std;
class Person :
public QObject
{
Q_OBJECT
public:
Q_INVOKABLE Person(int age, string name)
{
this->_age = age;
this->_name = name;
}
Person(const Person& p) noexcept {
this->_age = p._age;
this->_name = p._name;
}
Person& operator =(const Person& p) noexcept {
this->_age = p._age;
this->_name = p._name;
return *this;
}
Person& operator =(Person&& p) noexcept {
this->_age = p._age;
this->_name = p._name;
return *this;
}
Person(Person&& p) noexcept {
this->_age = p._age;
this->_name = p._name;
}
Person() noexcept {}
~Person()
{}
friend ostream& operator<<(ostream& os, const Person& dt);

private:
int _age;
string _name;
};

//Q_DECLARE_METATYPE(Person)

include <QtCore/QCoreApplication>

include <Person.h>

include

include

using namespace std;
ostream& operator<<(ostream& os, const Person& dt)
{
os << "{ age: " << dt._age << " , name: " << dt._name << " }";
return os;
}
int main(int argc, char argv[])
{
QCoreApplication a(argc, argv);
const QMetaObject
p = &Person::staticMetaObject;
QVariant variant;

Person *person = (Person*)p->newInstance(12, std::string("lilei"));
variant.setValue<Person>(move(*person));
Person personobj = variant.value<Person>();
std::cout << personobj;
//std::cout << std::is_copy_constructible_v<Person>;
//std::cout << std::is_destructible_v<Person>;

return a.exec();

}

/****************************************************************************
** Meta object code from reading C++ file 'Person.h'
**
** Created by: The Qt Meta Object Compiler version 68 (Qt 6.7.2)
**
** WARNING! All changes made in this file will be lost!
*****************************************************************************/

include "../../../../Person.h"

include <QtCore/qmetatype.h>

include <QtCore/qtmochelpers.h>

include

include <QtCore/qxptype_traits.h>

if !defined(Q_MOC_OUTPUT_REVISION)

error "The header file 'Person.h' doesn't include ."

elif Q_MOC_OUTPUT_REVISION != 68

error "This file was generated using the moc from 6.7.2. It"

error "cannot be used with the include files from this version of Qt."

error "(The moc has changed too much.)"

endif

ifndef Q_CONSTINIT

define Q_CONSTINIT

endif

QT_WARNING_PUSH
QT_WARNING_DISABLE_DEPRECATED
QT_WARNING_DISABLE_GCC("-Wuseless-cast")
namespace {

ifdef QT_MOC_HAS_STRINGDATA

struct qt_meta_stringdata_CLASSPersonENDCLASS_t {};
constexpr auto qt_meta_stringdata_CLASSPersonENDCLASS = QtMocHelpers::stringData(
"Person",
"",
"age",
"string",
"name"
);

else // !QT_MOC_HAS_STRINGDATA

error "qtmochelpers.h not found or too old."

endif // !QT_MOC_HAS_STRINGDATA

} // unnamed namespace

Q_CONSTINIT static const uint qt_meta_data_CLASSPersonENDCLASS[] = {

// content:
12, // revision
0, // classname
0, 0, // classinfo
0, 0, // methods
0, 0, // properties
0, 0, // enums/sets
1, 19, // constructors
0, // flags
0, // signalCount

// constructors: parameters
0x80000000 | 1, QMetaType::Int, 0x80000000 | 3, 2, 4,

// constructors: name, argc, parameters, tag, flags, initial metatype offsets
0, 2, 14, 1, 0x0e, 1 /* Public */,

   0        // eod

};

Q_CONSTINIT const QMetaObject Person::staticMetaObject = { {
QMetaObject::SuperData::linkQObject::staticMetaObject(),
qt_meta_stringdata_CLASSPersonENDCLASS.offsetsAndSizes,
qt_meta_data_CLASSPersonENDCLASS,
qt_static_metacall,
nullptr,
qt_incomplete_metaTypeArray<qt_meta_stringdata_CLASSPersonENDCLASS_t,
// Q_OBJECT / Q_GADGET
QtPrivate::TypeAndForceComplete<Person, std::true_type>,
// constructor 'Person'
QtPrivate::TypeAndForceComplete<int, std::false_type>,
QtPrivate::TypeAndForceComplete<string, std::false_type>
>,
nullptr
} };

void Person::qt_static_metacall(QObject _o, QMetaObject::Call _c, int _id, void **_a)
{
if (_c == QMetaObject::CreateInstance) {
switch (_id) {
case 0: { Person _r = new Person((reinterpret_cast<std::add_pointer_t>(_a[1])),(
reinterpret_cast<std::add_pointer_t>(_a[2])));
if (_a[0]) reinterpret_cast<QObject**>(_a[0]) = _r; } break;
default: break;
}
} else if (_c == QMetaObject::ConstructInPlace) {
switch (_id) {
case 0: { new (_a[0]) Person((
reinterpret_cast<std::add_pointer_t>(_a[1])),(*reinterpret_cast<std::add_pointer_t>(_a[2]))); } break;
default: break;
}
}
(void)_o;
}

const QMetaObject *Person::metaObject() const
{
return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject;
}

void *Person::qt_metacast(const char _clname)
{
if (!_clname) return nullptr;
if (!strcmp(_clname, qt_meta_stringdata_CLASSPersonENDCLASS.stringdata0))
return static_cast<void
>(this);
return QObject::qt_metacast(_clname);
}

int Person::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
{
_id = QObject::qt_metacall(_c, _id, _a);
return _id;
}
QT_WARNING_POP

标签:反射,return,Qt,newInstance,qt,age,Person,include,name
From: https://www.cnblogs.com/DesertCactus/p/18504352

相关文章

  • Qt开发技巧(十九):定时器的调用问题,控件的透明问题,慎用事件过滤器,依赖库的路径链接,对话框
    继续讲一些Qt开发中的技巧操作:1.定时器的调用问题有一个场景经常遇到,那就是在符合某个条件下,延时一段时间去执行一段代码,如果短时间内触发多次又不需要频繁执行,只需要执行一次就行。如果选择用QTimer::singleShot无法终止已经触发的,这个时候就要主动实例化一个单次定时器,......
  • 华为OD机试真题 - 反射计数
    华为OD机试真题-反射计数介绍反射计数问题是华为OD机试中的一道经典题目,主要考察考生对二维矩阵的操作能力和算法设计能力。题目通常要求在一个包含0和1的二维矩阵中,模拟一个物体的运动,并计算在特定时间内物体经过1的次数。原理详解反射计数的基本原理包括以下几个方面:矩阵......
  • Qt编程技巧小知识点(5)GPIB缓存区数据读取(升级版)
    文章目录Qt编程技巧小知识点(5)GPIB缓存区数据读取(升级版)小结Qt编程技巧小知识点(5)GPIB缓存区数据读取(升级版)  大端小端的问题,GPIB返回的数据经常是小端数据,而我们转化需要大端数据,看代码,Qt的这个函数很好用哦!代码输入//添加库文件#include<QtDebug>#include<Q......
  • QtCreator通过CMake多文件编译.cpp、.qss、.h、.ui文件,达到MVC三层架构的效果
        博主在构建C++项目的时候,一般都喜欢将头文件和源文件分开为不同的文件夹,比如include目录下只存放.h文件和.ui文件,src目录下只存放.cpp和.qss文件,res目录下只存放图片、音频等文件,这时候使用CMake对项目进行分文件管理就特别方便和清晰了。  很多人写qt项目的......
  • 基于圆柱体镜子和光线跟踪实现镜反射观测全景观图的matlab模拟仿真
    1.程序功能描述基于圆柱体镜子和光线跟踪实现镜反射观测全景观图.模拟的场景如下所示: 2.测试软件版本以及运行结果展示MATLAB2022a版本运行 3.核心程序%%step1fori=1:mmx_new(i)=i-round(mm/2);endfori=1:nny_new(i)=i-round(nn/2);......
  • 反射、代理简单理解
    反射反射允许对成员变量,成员方法和构造方法的信息进行编程访问但是获取不是从类里面获取的,是从类的字节码(.class)文件中获取的,所以我们首先要学习如何获取类的class对象。在Java中,定义好了一个类Class,就是用来描述字节码文件的获取class对象的三种方式  1.Class.forna......
  • 如何在Qt框架中使用C++进行跨平台开发
    摘要:使用Qt框架结合C++实现跨平台开发的要点涉及1、选择合适的Qt版本及工具集、2、掌握QtCreator与Qt库的使用、3、深入理解信号与槽机制、4、遵循模块化和解耦的设计原则、5、依据不同平台进行特定优化。特别地,掌握QtCreator与Qt库的使用是基础,该集成开发环境(IDE)包含了代码编辑......
  • Java的反射到底是有什么用处
    Java的反射提供了一种强大的机制,允许程序在运行时检查、修改类的行为。这一特性在以下多个方面发挥着重要作用:1.动态创建对象和调用方法;2.实现通用代码;3.支持各种框架和库;4.进行测试和调试。反射使得可以在运行时创建任意类的对象,调用任意方法,这对于编写通用代码或框架非常有......
  • [QT基础系列]按钮QPushButton
    按钮QPushButton属性和方法、案例文本可以获取和设置按钮上显示的文本//获取和设置按钮的文本QStringtext()constvoidsetText(constQString&text)图标可以获取和设置按钮上显示的图标//获取和设置按钮的图标QIconicon()constvoidsetIcon(constQIcon......
  • [QT基础系列]窗口QWidget
    QWidget所有窗口类的基类Qt中有3个窗口的基类:QWidget、QMainWindow、QDialog在创建Qt工程时,会让我们选择继承自哪一个窗口类其中,QMainWindow、QDialog都是继承自QWidge所有控件类的基类Qt中的控件类(按钮、输入框、单选框等)也属于窗口类它们的基类也是QWid......