Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Пара вопросов по Q_PROPERTY 
V
    Опции темы
yngwie19
Дата 10.6.2009, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



Здравствуйте. Разбираю пример из книги по Qt. Пример по использованию макроса QPROPERTY. Вот он
Код

class MyClass : QObject
{
    Q_OBJECT
    Q_PROPERTY(bool readOnly READ isReadOnly WRITE setReadOnly)

    private:
        bool m_bReadOnly;
    public:
        MyClass(QObject *proj = 0) : QObject(proj), m_bReadOnly(false)
        {;
        }
        void setReadOnly(bool bReadOnly)
        {
            m_bReadOnly = bReadOnly;
        }
        bool isReadOnly()const
        {
            return m_bReadOnly;
        }
    
};

Мне не очень понятна вот эта строчка
Код

MyClass(QObject *proj = 0) : QObject(proj), m_bReadOnly(false)

инициализация объекта базового класса QObject делается объектом этого же класса, который инициализирован в конструкторе MyClass(), Но ведь конструктор MyClass вызывается после конструктора QObject, как так?
PM MAIL   Вверх
SABROG
Дата 11.6.2009, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Цитата(yngwie19 @  10.6.2009,  23:37 Найти цитируемый пост)
MyClass(QObject *proj = 0) : QObject(proj), m_bReadOnly(false)


Это уже к создателям C++. Как мне кажется (рыться в стандарте не хочеться) происходит всё по следующей схеме:

* ты вызываешь конструктор класса MyClass и передаешь в него указатель
* вызываются базовые конструкторы
* конструктор MyClass продолжает своё выполнение и инициализацию членов


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
yngwie19
Дата 11.6.2009, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



SABROG, ну понятно, т.е вызов конструктора должен быть таким?
Код

int main(int argc, char** argv)
{  
      Object *object = new Object;
      MyClass *my = new MyClass(object);
      
      return 0;
}

PM MAIL   Вверх
ecspertiza
Дата 11.6.2009, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 3.11.2008
Где: г.Смоленск

Репутация: 4
Всего: 5



Тут на самом деле ничего сложного, эта конструкция заменит примерно следующую

Код

class MyClass : QObject
{
    Q_OBJECT
    Q_PROPERTY(bool readOnly READ isReadOnly WRITE setReadOnly)
    private:
        bool m_bReadOnly;
    public: 
         MyClass(QObject *proj = 0);
};

        MyClass::MyClass(QObject *proj) 
                     : QObject(proj), m_bReadOnly(false)
        {
        
        }
        
        void setReadOnly(bool bReadOnly)
        {
            m_bReadOnly = bReadOnly;
        }
       
        bool isReadOnly()const
        {
            return m_bReadOnly;
        }
   


Код

MyClass(QObject *proj = 0) : QObject(proj), m_bReadOnly(false)


Примет параметр proj который ты передашь при создании класса, и скажет твоему классу на чём его создавать >> QObject(proj)
и у тебя есть переменная bool m_bReadOnly он её срвзу при создании в false поставит smile



Это сообщение отредактировал(а) ecspertiza - 11.6.2009, 11:45


--------------------
С уважением,
мастер конфетного цеха!

онлайн компилер
залип
PM MAIL   Вверх
yngwie19
Дата 11.6.2009, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



Цитата(ecspertiza @  11.6.2009,  11:45 Найти цитируемый пост)
и скажет твоему классу на чём его создавать >> QObject(proj)

немного не понял фразу. Передав в конструктор MyClass адрес объекта proj, мы им инициализируем конструктор базового класса. Вы это имеете в виду?
PM MAIL   Вверх
ecspertiza
Дата 11.6.2009, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 3.11.2008
Где: г.Смоленск

Репутация: 4
Всего: 5



 smile 

Ну а вызов не обязательно должен быть таким
Код

int main(int argc, char** argv)
{  
      Object *object = new Object;
      MyClass *my = new MyClass(object);
      
      return 0;
}


Ты сможешь и просто так создать

Код

int main(int argc, char** argv)
{  
      MyClass *my = new MyClass();
      return 0;
}




--------------------
С уважением,
мастер конфетного цеха!

онлайн компилер
залип
PM MAIL   Вверх
yngwie19
Дата 11.6.2009, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



Цитата(ecspertiza @  11.6.2009,  13:24 Найти цитируемый пост)
MyClass *my = new MyClass();

т.е получается если Я в конструктор MyClass гичего не передаю, то объект Object все-равно создасться в конструкторе, о соответственно после выхода из  конструктора этот объект умрет. иак что-ли?

Это сообщение отредактировал(а) yngwie19 - 11.6.2009, 13:33
PM MAIL   Вверх
korbian
Дата 11.6.2009, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 336
Регистрация: 20.2.2007
Где: Penza

Репутация: 1
Всего: 14



Цитата(yngwie19 @  11.6.2009,  14:31 Найти цитируемый пост)
т.е получается если Я в конструктор MyClass гичего не передаю, то объект Object все-равно создасться в конструкторе, о соответственно после выхода из  конструктора этот объект умрет. иак что-ли?


 yngwie19, проинициализируется та часть MyClass, которая заимствована у QObject путем наследования.


Это сообщение отредактировал(а) korbian - 11.6.2009, 14:50


--------------------
korbian ©
PM   Вверх
yngwie19
Дата 11.6.2009, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



Цитата(korbian @  11.6.2009,  14:46 Найти цитируемый пост)
та часть MyClass, которая заимствована у QObject путем наследования.

А можно поподробнее что у меня позаимствовано от класса QObject?
PM MAIL   Вверх
korbian
Дата 11.6.2009, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 336
Регистрация: 20.2.2007
Где: Penza

Репутация: 1
Всего: 14



yngwie19, на самом деле позаимствовано все, а доступно то, что разрешает используемый спецификатор доступа. 
Почитайте Наследование  и Права доступа при наследовании и заодно уж про Порядок инициализации в конструкторах


--------------------
korbian ©
PM   Вверх
JekaZZ
Дата 11.6.2009, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 6.10.2005

Репутация: нет
Всего: 3



То ли я чего-то не понял, то ли вы куда-то не туда полезли. 

Выражение в конструкторе 
Код

: QObject(proj) 

означает не инициализацию базового класса обьектом prog, а передача указателя prog как parent (в QT это значит владелец) конструируемого объекта. 
Объект proj не создается в конструкторе MyClass, он передается в него.
Код

int main(int argc, char** argv)
{  
      Object *object = new Object;
      MyClass *my = new MyClass(object);
      
      return 0;
}

Если его не передать, то компилятор автоматически передаст NULL:
Код

MyClass(QObject *proj = 0) :...

PM MAIL   Вверх
solan
Дата 11.6.2009, 23:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 23.5.2009

Репутация: нет
Всего: нет



Цитата

MyClass(QObject *proj = 0) : QObject(proj), m_bReadOnly(false)


И еще уточню:
  В данном случает вызов конструктора QObject(proj)  не создает новый объект а инициализирует аттрибуты создаваемого объекта MyClass, которые наследуются у QObject (в принципе это все уже писали-) ).

  Далее вызывается конструктор аттрибута m_bReadOnly, специфичным для MyClass, с параметром, которым и инициализируется этот аттрибут. (С++ полностью объектный язык вопреки многим мнениям (конечно имхо-) ), и как класс здесь можно рассматривать абсолютно любой тип.)
 
  В целом, как писалось выше, конструкторы базовых типов, как и аттрибутов, можно не вызывать, и тогда они будут вызваны с параметрами по умолчанию неявно. Это правила ООП.
PM MAIL   Вверх
yngwie19
Дата 12.6.2009, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



Почему не работает этот код:
Код

#include <QApplication>
#include <QObject>

class MyClass : public QObject
{
    Q_PROPERTY(bool readwrite READ GetValue WHRITE SetValue) 

    private:
        bool bstate;
    public:
        MyClass(QObject *obj = 0);
        void SetValue(bool);
};

int main(int argc, char *argv[])
{
    QApplication app(argc,argv);

    MyClass *my = new MyClass();
    my->setProperty("readwrite",true);
    
    
    
    return app.exec();
}

MyClass::MyClass(QObject *obj) : QObject(obj), bstate(false)
{
    
}
void MyClass::SetValue(bool bval)
{
    bstate = bval;
}


ошибки:
Код

>.\main.cpp(20) : error C2664: 'QObject::setProperty' : cannot convert parameter 2 from 'bool' to 'const QVariant &'
1>        Reason: cannot convert from 'bool' to 'const QVariant'
1>        Source or target has incomplete type

PM MAIL   Вверх
SABROG
Дата 12.6.2009, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Цитата(yngwie19 @  12.6.2009,  10:03 Найти цитируемый пост)
my->setProperty("readwrite",true);


Попробуй так:

Код

my->setProperty("readwrite",qVariantFromValue(true));

Цитата(yngwie19 @  12.6.2009,  10:03 Найти цитируемый пост)
    Q_PROPERTY(bool readwrite READ GetValue WHRITE SetValue)

А тут "WRITE" пишется без 'H'.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
yngwie19
Дата 12.6.2009, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



SABROG, да так работает. В книге вообще такой пример:
user posted image

Объясните пожалуйста, почему тут сказано что из Программы мы можем изменять и узнавать значения поля через объект proj, который является объектом класса MeClass.
И почему тут при вызове setProperty не нужно приводить к типу QVariant знчение true?
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0533 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.