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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Свойства - ошибка компиляции  (Прочитано 7638 раз)
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&)

Спасибо.

Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #1 : Май 13, 2010, 11:29 »

Попробуйте заменить:
Код
C++ (Qt)
MyObj.setProperty("name","Alex_cs_gsp");
 
на
Код
C++ (Qt)
MyObj.setProperty("name", QVariant("Alex_cs_gsp"));
 

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

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Alex_cs_gsp
Гость
« Ответ #2 : Май 13, 2010, 11:33 »

Заменял, не помогает. Пример с книги, да и  с COM библиотекой работал (правда не из QT) уже все перепробовал. Чувствую, что где-то очень элементарная ошибка, но какая?
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #3 : Май 13, 2010, 11:39 »

Да всё просто, не надо трагедий  Смеющийся

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 поймёт))
« Последнее редактирование: Май 13, 2010, 11:46 от m_ax » Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Alex_cs_gsp
Гость
« Ответ #4 : Май 13, 2010, 11:47 »

У меня заработал со старым вариантом, но  когда я кроме #include <QObject> еще подключил #include <QtGui> в заголовочный файл где определен класс. Если убрать #include <QtGui> то снова не работает -  причина в этом. Какой-то библиотеки не хватает для работы со свойствами, которая в гуи используется?
 Какой смысл явно вызывать конструктор для QVariant??
Записан
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #5 : Май 13, 2010, 11:48 »

Я извиняюсь, но какой смысл использовать setPropery, если можно просто использовать функции setName и getName?
Вот из ассистента:
Цитировать
QPushButton *button = new QPushButton;
 QObject *object = button;

 button->setDown(true);
 object->setProperty("down", true);
Записан

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
Alex_cs_gsp
Гость
« Ответ #6 : Май 13, 2010, 11:50 »

Для самообучения - я с QT только учусь.
Записан
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #7 : Май 13, 2010, 11:53 »

Ну а с документацией как? Так все есть и очень понятно и четко к тому же. Или плохо с английским?
Записан

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #8 : Май 13, 2010, 11:55 »

Вот исходники..
« Последнее редактирование: Май 13, 2010, 11:59 от m_ax » Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #9 : Май 13, 2010, 11:57 »

Цитировать
Не хватает QString))
Так QString в QtCore же..
Записан

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #10 : Май 13, 2010, 12:05 »

Цитировать
Так QString в QtCore же..
Млин, QVariant имелось в виду.. Он конечно тоже в QtCore, но тогда нужно инклудить
#include <QtCore>
а не
#include <QtCore/QtCoreApplication>

Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Alex_cs_gsp
Гость
« Ответ #11 : Май 13, 2010, 12:08 »

Если подключать #include <QString> ошибка не пропадает. Если бы была причина в этом, тогда была бы совсем другая ошибка- неизвестный идентификатор.... Действительно нужно в main не #include <QtGui/QApplication>, а #include <QtGui> и все. Спасибо за помощь!
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #12 : Май 13, 2010, 12:12 »

Цитировать
Действительно нужно в main не #include <QtGui/QApplication>, а #include <QtGui> и все.
Да можно писать и
#include <QtGui/QtApplication>
но тогда добавте просто
#include <QVariant>

Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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