类似这个的一个函数,如何通过一个字符串函数名来实例一个具体的对象,求大牛
#include <QtCore>
class Parser {
public:
virtual void parse() = 0;
virtual ~Parser() {}
};
class Parser1 : public Parser {
public:
Parser1() {
qDebug() <<"Parser1::Parser1()";
}
void parse() {
qDebug() << "Parser1::parse()";
}
~Parser1() {
qDebug() <<"Parser1::~Parser1()";
}
};
Q_DECLARE_METATYPE(Parser1)
class Parser2 : public Parser {
public:
Parser2() {
qDebug() <<"Parser2::Parser2()";
}
void parse() {
qDebug() << "Parser2::parse()";
}
~Parser2() {
qDebug() <<"Parser2::~Parser2()";
}
};
Q_DECLARE_METATYPE(Parser2)
void factory( const char* parserName ) {
int id = QMetaType::type( parserName );
if (id == -1) return; // ERROR HERE
Parser *parser = static_cast<Parser*>(QMetaType::construct(id));
parser->parse();
delete parser;
}
int main () {
qRegisterMetaType<Parser1>("Parser1");
qRegisterMetaType<Parser2>("Parser2");
qDebug() << "###### Trying create Parser1";
factory("Parser1");
qDebug() << "###### Trying create Parser2";
factory("Parser2");
}
#include <QtCore>
#define Q_DECLARE_QTBUILTIN_METATYPE(TYPE) \
template <> \
void *qMetaTypeConstructHelper(const TYPE *t) { \
Q_UNUSED(t) \
return new TYPE(); \
} \
Q_DECLARE_METATYPE(TYPE)
Q_DECLARE_QTBUILTIN_METATYPE(QSettings)
Q_DECLARE_QTBUILTIN_METATYPE(QTimer)
void outputObject(const char* parseName) {
QObject* obj = static_cast<QObject*>(QMetaType::construct(QMetaType::type(parseName)));
qDebug() << obj;
delete obj;
}
int main(int argc, char *argv[])
{
qRegisterMetaType<QTimer>("QTimer");
qRegisterMetaType<QSettings>("QSettings");
outputObject("QTimer");
outputObject("QSettings");
QTimer* tmr = static_cast<QTimer*>(QMetaType::construct(QMetaType::type("QTimer")));
tmr->setInterval(50000);
qDebug() << tmr->interval();
delete tmr;
return 0;
}
对于Qt 来说,是可以做到运行时,根据对象的类名字(字符串)来获得对象的实例的,这点和一些语言的反射机制是一样的。但是在Qt中,我们需要所额外的一步,就是注册。只要做到了注册,我们就可以 自由的创建对象了...
//获取类型信息 //如果调用其他的DLL //System.Reflection.Assembly asmb = System.Reflection....// Type t = asmb.GetType("类名"); //如果是不调用其他DLL System.Type t = System.Type.GetType
在我继续一系列的Qt数据序列化文章之前,有一个相对重要的需要提及的话题,那就是:基于类名动态创建类对象的能力。 假定现在我们要创建一系列的形状,形状是一个抽象类,实际类是存储在一个列表中的各种各样的...
在用自己编写的类实例化c++stl容器vector时,调用了vector.erase()方法,结果编译器报了以下错误 错误 C2280 “(类名)::operator =(const (类名) &)”: 尝试引用已删除的函数 F:\vs2015\VC\include\x
在写 头文件的时间 经常会 有一些 class QFile 等这类 看似 是声明的东西..... ...QT_BEGIN_NAMESPACE class QTcpServer; class QTcpSocket; class QProgressBar; class QLabel; class QDialo
如何根据字符串动态创建类对象 今天跟同事聊天的时候,同事有一个需求,就是如何根据类的名字和值,动态返回该类的实例对象。比如,我们给一个函数传入字符串类名”java.lang.String”和值“wuguowei”,则该函数则...
QT中使用信号与槽机制来传递信号,实现按钮响应,菜单栏响应等操作。与先实例化类的对象,再调用类的成员函数,实现了类似的功能。本文讨论QT中使用信号与槽机制来传递信号的2中情况。
源代码public class Student{ ... // 静态变量的访问可以不用创建类的实例就可就可使用类名.属性 >的方法访问 String name; // 学生姓名 Student( ){ // 无参构造函数 System.out.println("创建学生成功。。");
如何通过类名动态的创建对象(类反射),对于Java开发者来说一点也不陌生,当然Qt也提供了一个元对象系统(The Meta-Object System),通过这个系统我们可以动态的在运行时获取一个类的构造函数、方法、字段、枚举等信息...
例如: // 在所选路径下创建文件夹 QDir::mkpath(地址); 错误:调用不带对象参数... //先实例化一个对象 tempDir.mkpath(projectDir); 这样就对了。 如果是自己写的类,还可以在类体中函数的声明前加上...
2、Class的对象.getInstance(),仅仅只是实例化; 也就是说,在执行 Class的对象.getInstance() 之前一定要先加载对应的类。 //示例代码 /** * new 对象和Class的对象.getInstance()的区别? * 答: * 1、new...
在Process.cs文件中有... }在另外一个ASPX页面中如果想通过函数名和类名调用这个函数,方法如下:Assembly ab = Assembly.GetExecutingAssembly();//得到当前运行的程序集Type tp = ab.GetType("Test.Process");//得
一、在使用指针之前,要进行指针是否为null的判断,如果为NULL却直接使用该指针,就会异常终止。如在QTableView:QStandardItemModel *model = new QStandardItemModel; model->item(0,1)->text()单元格没编辑过,...
qml调用Q_INVOKABLE关键字修饰的方法: ...3)qml里:引入注册的对象+对象实例化 eg: 1)MyTitle.h 方法的声明 #ifndef MYTITLE_H #define MYTITLE_H #include //函数声明 class MyTitle : public QObjec
终于到了使用 QtAndroid 的时候了,这次会结合实例详细讲解 QtAndroid 名字空间中最重要的 startActivity() 方法的使用……
信号与槽是QT的一大创新,通过自定义信号与槽可以实现自己想实现的功能。 标准的信号与槽写法如下: connect(&button,&QPushButton::clicked,this,&QWidget::close); /* * 对上面的connect信号与槽的...
1.用PYQT的Qt设计师设计完程序UI后,将其转换为UI.py脚本。 ... 2.在同目录下新建Main.py,根据设计UI时选择...如图,图中根窗口类名(此处为QDialog)对象名(此处为Dialog),即如下填写: # -*- coding: ...
在写 头文件的时间 经常会 有一些 class QFile 等这类 ...QT_BEGIN_NAMESPACE class QTcpServer; class QTcpSocket; class QProgressBar; class QLabel; class QDial
先看一个普通的C++类的定义:#include using std::string;class MyClass{public:MyClass( const string& text );const string& text() const;void setText( const string& text );int getLengthOfTe
简述Qt的元对象系统(Meta-Object System)提供了信号与槽机制,可用于对象间通信、运行时类别信息和动态属性系统。元对象系统基于三个方面: QObject类:为Objects提供了一个可以利用元对象系统的基类。 Q_OBJECT宏...
QObject的子类都有一个staticMetaObject静态成员变量,可通过staticMetaObject.newInstance()来创建这个类的实例。如果我们用QMap将类名和这个类的staticMetaObject成员变量映射起来,就可以实现通过类名创建类对象...
从Qt的元对象系统可知,除了提供信号/槽机制的特性之外,它还提供了以下特性: ■ QObject::metaObject() 返回关联的元对象 ■ QObject::className() 在运行时状态下返回类名 ...
但它不是万能的,也有很多局限性,原来 Qt 的一些技术,比如低阶的网络编程如 QTcpSocket ,多线程,又如 XML 文档处理类库 QXmlStreamReader / QXmlStreamWriter 等等,在 QML 中要么不可用,要么用起来不方便,...
VS2017集成环境,使用Qt插件,编写基于Qt5.9.1库的windows应用程序,比MFC美观好用,比QtCreate好编码调试,真是完美组合。记录一下Qt下怎么使用COM组件,以便后来翻阅。 在Qt的安装目录下有dumpcpp.exe工具,可以...
在我以前的意识中,我们需要用到某个类的时候,需要先实例化这个类,实例化出一个对象,然后在使用这个类里面的方法和属性,今天偶然的机会了解到,原来有些类是不需要实例化就可以直接用的——静态(static)类,...
Qt元对象系统,即meta object system(mos),提供了大家熟知的用于对象间信息传递的信号与槽机制,运行时类型信息和动态属性系统。 mos基于三件法宝: 一是QObject类,是所有Qt对象的基类,可以很好的使用mos。 二...
Qt编程中所使用的语言是面向对象的C++,在初学GUI编程时,如果仅仅依靠Qt Designer编辑器来通过拖拽一些widget来设计界面,则会很容易迷惑我们,并且很难弄懂其中所涉及的面向对象思想,也不容易弄懂Qt GUI的一个...
转载自http://blog.csdn.net/xiehuin/article/details/2087235 http://blog.csdn.net/liang890319/article/details/7062928 ...第一:使用extern關鍵字聲明(不推薦,破壞了封裝性) ...第一:使用extern關
1.概述 QCustomPlot 是一个超强超小巧的qt绘图类,非常漂亮,非常易用,只需要加入一个qcustomplot.h和qcustomplot.cpp文件即可使用,远比qwt方便和漂亮 下面展示一下它的超强功能: