> For now there is a design choice which I feel weak myself, to do factory or to use QMetaType for creating instances.
Depends on the use case I suppose. If you know the types at compile time, as is usually the case I'd go with the simple solution to make a factory. I recently, however, had a case where the deserialization routine couldn't know at compile time the exact type (i.e. for a library), so I had to put a (gadget) base class and use the runtime type ids. On Wed, Mar 2, 2016 at 9:31 AM, Sina Dogru <sinado...@gmail.com> wrote: > I thank you for your answers and solutions. > > Before I wrote, I tried to use QMetaType::create function to instantiate > an instance but since QObject have deleted copy constructor and copy > assignment operator, I have ended up using QObject pointer with QMetaType.. > And when I see that QMetaType::create() function, it just create a pointer > to QObject but not the QObject instance.. So I thought QMetaType is not for > the QObject-derived classes.. > > But I have not realised that QMetaType::metaObjectForType function returns > QMetaObject instance for the class not for the pointer to class. > > For now there is a design choice which I feel weak myself, to do factory > or to use QMetaType for creating instances. > > Thank you, > Sina > > 2016-03-01 18:51 GMT+02:00 André Somers <an...@familiesomers.nl>: > >> >> >> Op 01/03/2016 om 17:21 schreef Thiago Macieira: >> >>> On terça-feira, 1 de março de 2016 17:06:49 PST André Somers wrote: >>> >>>> The meta *object* system has no registration. >>>>> >>>>> The meta *type* system requires that the registered type be default- >>>>> constructible and copyable, but QObject is not copyable. Therefore, >>>>> QObject- derived classes cannot be registered with the meta type >>>>> system. >>>>> >>>> Am I completely misinterpretting the documentation then? >>>> http://doc.qt.io/qt-5/qmetatype.html#metaObject >>>> >>>> If I read that correctly, you can register a >>>> pointer-to-a-QObject-derived-class-instance and use that. So, indeed, >>>> you do not register the type, but the type*. And that has no problems >>>> with being default constructed or copied. >>>> >>> Correct. You can't register a QObject class with the meta type system, >>> but you >>> can register a pointer to a QObject class. The problem is that >>> QMetaType::create() will then create a pointer, not the object. >>> >> Of course. But... Again, if I read it correctly, you *can* then get the >> QMetaObject from QMetaType, and using that, you can create an actual >> instance. >> >> Just tested this trivial example: >> >> //main.cpp >> int main(int argc, char *argv[]) >> { >> qRegisterMetaType<TestClass*>(); //this could be elsewhere of course >> >> QCoreApplication a(argc, argv); >> >> auto tId = QMetaType::type("TestClass*"); //just using the class name >> with an * >> auto metaObject = QMetaType::metaObjectForType(tId); >> QObject* instance = metaObject->newInstance(); >> >> return a.exec(); >> delete instance; >> } >> >> //testclass.h >> class TestClass: public QObject >> { >> Q_OBJECT >> >> public: >> Q_INVOKABLE TestClass(); >> }; >> >> Q_DECLARE_METATYPE(TestClass*) >> >> //testclass.cpp >> TestClass::TestClass() >> { >> qDebug() << "TestClass instance created"; >> } >> >> Which prints out "TestClass instance created" on the console. My >> conclusion is that it works, and that you _can_ create a QObject derived >> instance with just the class name. >> >> Again: I am not claiming that abusing this to skip defining a factory is >> a good idea. Just that it is possible. >> >> >> André >> >> >> _______________________________________________ >> Interest mailing list >> Interest@qt-project.org >> http://lists.qt-project.org/mailman/listinfo/interest >> > > > _______________________________________________ > Interest mailing list > Interest@qt-project.org > http://lists.qt-project.org/mailman/listinfo/interest > >
_______________________________________________ Interest mailing list Interest@qt-project.org http://lists.qt-project.org/mailman/listinfo/interest