- 使用 Spring Initializr 创建 Spring Boot 应用程序
- 在Spring Boot中配置Cassandra
- 在 Spring Boot 上配置 Tomcat 连接池
- 将Camel消息路由到嵌入WildFly的Artemis上
const QMetaObject *QObject::metaObject() const
元对象包含继承QObject的类,QObject的子类,类名,子类名,属性,信号和槽等等等。
可以使用metaObject实例会指定对象,如下代码:
QObject *obj = new QPushButton;
obj->metaObject()->className(); // returns "QPushButton"
QPushButton::staticMetaObject.className(); // returns "QPushButton"
这里定义了一个TestClass,使用Qt反射机制,创建类,并设置值打印
源码如下:
TestClass.h
#ifndef TESTCLASS_H
#define TESTCLASS_H
#include <QObject>
#include <QDebug>
class TestClass : public QObject
{
Q_OBJECT
Q_PROPERTY(int intValue READ getIntValue WRITE setIntValue)
Q_PROPERTY(float floatValue READ getFloatValue WRITE setFloatValue)
Q_PROPERTY(QString qstringValue READ getQStringValue WRITE setQStringValue)
Q_PROPERTY(qlonglong qlonglongValue READ getQlonglongValue WRITE setQlonglongValue)
Q_PROPERTY(QList<QVariant> qListValue READ getQListValue WRITE setQListValue)
public:
Q_INVOKABLE TestClass(){}
~TestClass(){ qDebug() << "~TestClass() called"; }
friend QDebug operator << (QDebug os, TestClass &testClass){
os << "[";
os << "(" << "intValue: " << testClass.getIntValue() << ", " <<
"floatValue: " << testClass.getFloatValue() << ", " <<
"QStringValue: " << testClass.getQStringValue() << ", " <<
"qlonglongValue: " << testClass.getQlonglongValue() << ")";
for(const QVariant &item : testClass.getQListValue()){
os << "list: " << item;
}
os << "]";
return os;
}
int getIntValue(){
return this->intValue;
}
float getFloatValue(){
return this->floatValue;
}
QString getQStringValue(){
return this->qstringValue;
}
qlonglong getQlonglongValue(){
return this->qlonglongValue;
}
QList<QVariant> getQListValue(){
return this->qListValue;
}
void setIntValue(int value){
this->intValue = value;
}
void setFloatValue(float value){
this->floatValue = value;
}
void setQStringValue(QString value){
this->qstringValue = value;
}
void setQlonglongValue(qlonglong value){
this->qlonglongValue = value;
}
void setQListValue(QList<QVariant> value){
qListValue.clear();
for(const QVariant &item : value){
this->qListValue.append(item);
}
}
private:
int intValue;
float floatValue;
QString qstringValue;
qlonglong qlonglongValue;
QList<QVariant> qListValue;
};
#endif // TESTCLASS_H
main.cpp
#include "TestClass.h"
#include <QMetaObject>
#include <QMetaProperty>
int main(int argc, char *argv[])
{
Q_UNUSED(argc)
Q_UNUSED(argv)
const QMetaObject *metaObject = &TestClass::staticMetaObject;
QObject *obj = metaObject->newInstance();
//获取属性
QStringList propertyList;
for(int i = metaObject->propertyOffset(); i < metaObject->propertyCount(); i++){
propertyList << metaObject->property(i).name();
}
//通过反射设置值
for(const QString &property : propertyList){
if(property == "intValue"){
obj->setProperty(property.toUtf8(), 10);
}
else if(property == "floatValue"){
obj->setProperty(property.toUtf8(), 10.1f);
}
else if(property == "qstringValue"){
obj->setProperty(property.toUtf8(), "HelloWorld");
}
else if(property == "qlonglongValue"){
obj->setProperty(property.toUtf8(), 9999999999999);
}
else if(property == "qListValue"){
QList<QVariant> list;
list << "10086" << "10010" << "10000";
obj->setProperty(property.toUtf8(), list);
}
}
qDebug() << (*(TestClass*)obj);
delete obj;
return 0;
}
程序运行截图如下:
源码打包下载地址:
Qt/StaticMetaObjectDemo at master · fengfanchen/Qt · GitHub
https://github.com/fengfanchen/Qt/tree/master/StaticMetaObjectDemo
我有一个派生自 QObject 和 QRunnable 的类,并且还有 Q_OBJECT 宏。包含该类的库编译正常,我得到一个 .lib 和 .dll 文件。我正在使用 MSVC 2013 和 QT
我有一个使用 Qt 库(共享库)的应用程序。在我的库中,我有一个包含多个枚举的类,我想在主应用程序上使用它们。我构建我的库项目没有问题,但是当我构建主应用程序项目时,出现错误: moc_myapp.c
我有一个使用 QwtPlotMagnifier 和其他 Qwt 类的库。我决定将 QwtPlotMagnifier 子类化,以便在重新缩放绘图时发出信号。库 (mylib.lib) 编译,但使用它的应
看起来 Qt 没有处理 Q_GADGET宏正确,因为我收到以下错误。有人知道为什么吗? 错误: 对“Exception::staticMetaObject”的 undefined reference
我正在尝试设置 Qt Win 迁移框架以在现有的基于 MFC 的应用程序中使用 Qt。我想将该框架用作库,因此我在 qtwinmigrate/buildlib/buildlib.pro 文件上运行 q
我刚刚开始学习 Qt,目前正在阅读 Nicolas Sheriff 的Learn Qt 5 一书。我在哪里,在第 2 章中,我正在按照所有说明进行操作并且我理解我在做什么但是我被困在一件事上:当我与其
我正在做一个大项目,我试图用 QLibrary 动态加载一个共享库,我能够在下面重现运行时链接错误(undefined symbol: staticMetaObject)示例: 文件夹结构: root
我一直在尝试导出一些 QFlags 以供在 QML 中使用(主要是从 QML 中公开的对象的属性中读取它们),但甚至遵循 this SO question我不断收到编译器错误: #ifndef HOL
所以我正在尝试构建 Maliit 框架 https://github.com/maliit在 Windows 机器上使用 Qt Creator。到目前为止,我已经修复了几个 Windows 兼容性问题
anisha@linux-dopx:~/Desktop/notes/pomodoro> ls timer.cpp anisha@linux-dopx:~/Desktop/notes/pomodoro>
我是一名优秀的程序员,十分优秀!