Russian Qt Forum

Qt => Установка, сборка, отладка, тестирование => Тема начата: Alex_cs_gsp от Май 13, 2010, 10:58



Название: Свойства - ошибка компиляции
Отправлено: Alex_cs_gsp от Май 13, 2010, 10:58
Начал изучать Qt, не могу понять, что за ошибка странная возникает
Код:
#include <QObject>

//класс со свойством name
class CMyClass : public QObject
{
Q_OBJECT

Q_PROPERTY(QString name READ getName WRITE setName)

public:
    CMyClass(QObject *pobj=NULL):\
    QObject(pobj){}

    const QString & getName()const{return m_strName;}
    void setName(const QString & strName){m_strName = strName;}

private:
    QString m_strName;
};


//...
//main
#include <QtGui/QApplication>
#include "mainwindow.h"
#include "../cmyclass.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    CMyClass MyObj;
    MyObj.setProperty("name","Alex_cs_gsp");

    return a.exec();
}

Ошибка,
D:/QT/Second/main.cpp:12: error: no matching function for call to 'CMyClass::setProperty(const char [5], const char [12])'
e:\AllPrograms\QT\qt\include/QtCore/../../src/corelib/kernel/qobject.h:235: note: candidates are: bool QObject::setProperty(const char*, const QVariant&)

Спасибо.



Название: Re: Свойства - ошибка компиляции
Отправлено: m_ax от Май 13, 2010, 11:29
Попробуйте заменить:
Код
C++ (Qt)
MyObj.setProperty("name","Alex_cs_gsp");
 
на
Код
C++ (Qt)
MyObj.setProperty("name", QVariant("Alex_cs_gsp"));
 

Ну и подинклудить его разумеется.. (QVariant, в смысле)


Название: Re: Свойства - ошибка компиляции
Отправлено: Alex_cs_gsp от Май 13, 2010, 11:33
Заменял, не помогает. Пример с книги, да и  с COM библиотекой работал (правда не из QT) уже все перепробовал. Чувствую, что где-то очень элементарная ошибка, но какая?


Название: Re: Свойства - ошибка компиляции
Отправлено: m_ax от Май 13, 2010, 11:39
Да всё просто, не надо трагедий  ;D

cmayclass.h
Код
C++ (Qt)
#ifndef CMYCLASS_H
#define CMYCLASS_H
 
#include <QObject>
#include <QString>
 
class CMyClass : public QObject
{
Q_OBJECT
 
Q_PROPERTY(QString name READ getName WRITE setName)
 
public:
   CMyClass(QObject *pobj=0):
   QObject(pobj){}
 
   const QString & getName()const{return m_strName;}
   void setName(const QString & strName){m_strName = strName;}
 
private:
   QString m_strName;
};
 
#endif // CMYCLASS_H
 

main.cpp
Код
C++ (Qt)
#include <QtCore/QCoreApplication>
#include "cmyclass.h"
#include <QVariant>
 
 
int main(int argc, char *argv[])
{
   QCoreApplication a(argc, argv);
   CMyClass MyObj;
   MyObj.setProperty("name", QVariant("Alex_cs_gsp"));
   return a.exec();
}
 

И всё работает))

А теперь найдите 10 отличий))

P.S. на самом деле, можно писать просто:
Код
C++ (Qt)
MyObj.setProperty("name", "Alex_cs_gsp");
 

QVariant поймёт))


Название: Re: Свойства - ошибка компиляции
Отправлено: Alex_cs_gsp от Май 13, 2010, 11:47
У меня заработал со старым вариантом, но  когда я кроме #include <QObject> еще подключил #include <QtGui> в заголовочный файл где определен класс. Если убрать #include <QtGui> то снова не работает -  причина в этом. Какой-то библиотеки не хватает для работы со свойствами, которая в гуи используется?
 Какой смысл явно вызывать конструктор для QVariant??


Название: Re: Свойства - ошибка компиляции
Отправлено: kibsoft от Май 13, 2010, 11:48
Я извиняюсь, но какой смысл использовать setPropery, если можно просто использовать функции setName и getName?
Вот из ассистента:
Цитировать
QPushButton *button = new QPushButton;
 QObject *object = button;

 button->setDown(true);
 object->setProperty("down", true);


Название: Re: Свойства - ошибка компиляции
Отправлено: Alex_cs_gsp от Май 13, 2010, 11:50
Для самообучения - я с QT только учусь.


Название: Re: Свойства - ошибка компиляции
Отправлено: kibsoft от Май 13, 2010, 11:53
Ну а с документацией как? Так все есть и очень понятно и четко к тому же. Или плохо с английским?


Название: Re: Свойства - ошибка компиляции
Отправлено: m_ax от Май 13, 2010, 11:55
Вот исходники..


Название: Re: Свойства - ошибка компиляции
Отправлено: kibsoft от Май 13, 2010, 11:57
Цитировать
Не хватает QString))
Так QString в QtCore же..


Название: Re: Свойства - ошибка компиляции
Отправлено: m_ax от Май 13, 2010, 12:05
Цитировать
Так QString в QtCore же..
Млин, QVariant имелось в виду.. Он конечно тоже в QtCore, но тогда нужно инклудить
#include <QtCore>
а не
#include <QtCore/QtCoreApplication>



Название: Re: Свойства - ошибка компиляции
Отправлено: Alex_cs_gsp от Май 13, 2010, 12:08
Если подключать #include <QString> ошибка не пропадает. Если бы была причина в этом, тогда была бы совсем другая ошибка- неизвестный идентификатор.... Действительно нужно в main не #include <QtGui/QApplication>, а #include <QtGui> и все. Спасибо за помощь!


Название: Re: Свойства - ошибка компиляции
Отправлено: m_ax от Май 13, 2010, 12:12
Цитировать
Действительно нужно в main не #include <QtGui/QApplication>, а #include <QtGui> и все.
Да можно писать и
#include <QtGui/QtApplication>
но тогда добавте просто
#include <QVariant>