Russian Qt Forum
Май 28, 2024, 23:29 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Что можно почитать по рефлексии в Qt?  (Прочитано 7057 раз)
Я.К.
Гость
« : Июль 06, 2009, 17:51 »

Собственно, сабж. Я знаю, что в Qt поддерживается рефлексия, но как здесь ею пользоваться и где ее брать?
Записан
Rcus
Гость
« Ответ #1 : Июль 06, 2009, 17:55 »

http://doc.trolltech.com/4.5/metaobjects.html
И далее по ссылкам.
Записан
Я.К.
Гость
« Ответ #2 : Июль 07, 2009, 07:32 »

Я открым документацию, нашел там статью о Q_PROPERTY и попытался скомпилировать пример. Я добавил реализацию конструктора с деструктором, но и это не помогло

Код:
#include <QtCore>

#include <iostream>
using namespace std;

class MyClass : public QObject
{
Q_OBJECT
Q_PROPERTY(Priority priority READ priority WRITE setPriority)
Q_ENUMS(Priority)

public:
MyClass(QObject *parent = 0)
:QObject(parent)
{

};
~MyClass()
{
cout << "MyClass Destructor"<<endl;
};

enum Priority { High, Low, VeryHigh, VeryLow };

void setPriority(Priority priority);
Priority priority() const;
};


int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
MyClass megaInst;
return a.exec();
}

Компилятор ругается так:

Цитировать
1>main.obj : error LNK2001: unresolved external symbol "public: virtual struct QMetaObject const * __thiscall MyClass::metaObject(void)const " (?metaObject@MyClass@@UBEPBUQMetaObject@@XZ)
1>main.obj : error LNK2001: unresolved external symbol "public: virtual void * __thiscall MyClass::qt_metacast(char const *)" (?qt_metacast@MyClass@@UAEPAXPBD@Z)
1>main.obj : error LNK2001: unresolved external symbol "public: virtual int __thiscall MyClass::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@MyClass@@UAEHW4Call@QMetaObject@@HPAPAX@Z)
Как это исправить?
Записан
BRE
Гость
« Ответ #3 : Июль 07, 2009, 07:46 »

Как это исправить?
Добавь в конец файла:
#include "main.moc"

Вместо "main" нужно поставить имя файла исходника без расширения.
Записан
Я.К.
Гость
« Ответ #4 : Июль 07, 2009, 08:13 »

Как это исправить?
Добавь в конец файла:
#include "main.moc"

Вместо "main" нужно поставить имя файла исходника без расширения.


Опять не выходит!
Теперь ругается на то, что ему не хватает функций setPriority и priority()!
Код:
#include <QtCore>

#include <iostream>
using namespace std;

class MyClass : public QObject
{
Q_OBJECT
Q_PROPERTY(Priority priority READ priority WRITE setPriority)
Q_ENUMS(Priority)

public:
MyClass(QObject *parent = 0)
:QObject(parent)
{

};
~MyClass()
{
cout << "MyClass Destructor"<<endl;
};

enum Priority { High, Low, VeryHigh, VeryLow };

void setPriority(Priority priority);
Priority priority() const;
};


int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
MyClass megaInst;
return a.exec();
}

#include "main.moc"

Цитировать
1>main.obj : error LNK2019: unresolved external symbol "public: void __thiscall MyClass::setPriority(enum MyClass::Priority)" (?setPriority@MyClass@@QAEXW4Priority@1@@Z) referenced in function "public: virtual int __thiscall MyClass::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@MyClass@@UAEHW4Call@QMetaObject@@HPAPAX@Z)
1>main.obj : error LNK2019: unresolved external symbol "public: enum MyClass::Priority __thiscall MyClass::priority(void)const " (?priority@MyClass@@QBE?AW4Priority@1@XZ) referenced in function "public: virtual int __thiscall MyClass::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@MyClass@@UAEHW4Call@QMetaObject@@HPAPAX@Z)
1>C:\Documents and Settings\user\Мои документы\Visual Studio 2005\Projects\Reflections\Debug\Reflections.exe : fatal error LNK1120: 2 unresolved externals
1
Записан
Rcus
Гость
« Ответ #5 : Июль 07, 2009, 08:19 »

Ну и правильно ругается, метаобъектная модель не заменяет собой объектную модель плюсов. И код все-таки придется писать
Записан
Я.К.
Гость
« Ответ #6 : Июль 07, 2009, 08:36 »

Ну и правильно ругается, метаобъектная модель не заменяет собой объектную модель плюсов. И код все-таки придется писать

Хмм... А как это вообще-то написать правильно?
Записан
BRE
Гость
« Ответ #7 : Июль 07, 2009, 09:04 »

Код
C++ (Qt)
#include <QtCore>
 
#include <iostream>
using namespace std;
 
class MyClass : public QObject
{
Q_OBJECT
Q_PROPERTY(Priority priority READ priority WRITE setPriority)
Q_ENUMS(Priority)
 
public:
MyClass(QObject *parent = 0)
:QObject(parent), m_priority( High )
{
 
};
~MyClass()
{
cout << "MyClass Destructor"<<endl;
};
 
enum Priority { High, Low, VeryHigh, VeryLow };
 
void setPriority(Priority priority) { m_priority = prioriry; }
Priority priority() const { return m_priority; }
 
private:
Priority m_priority;
};
 
 
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
MyClass megaInst;
return a.exec();
}
 
#include "main.moc"
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.076 секунд. Запросов: 17.