Поиск:

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


Опытный
**


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

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



Всем привет вот мой код. Подскажите почему при показе QLabel появляется пустое окно без текста "My Name":
Код

#include <QtGui>

class MyClass : public QObject
{
    Q_OBJECT
    Q_PROPERTY(char* name READ GetName WRITE SetName)
    public:
        MyClass(QObject *obj = NULL);
        char* GetName()const;
        void SetName(char*);
    private:
        char *szName;
};

int main(int argc, char *argv[])
{
    QApplication app(argc,argv);
    MyClass *mc = new MyClass;
    QLabel *lbl = new QLabel(mc->property("name").toString()); 
    lbl->show();
    
    return app.exec();
}

MyClass::MyClass(QObject *obj) : QObject(obj), szName("My Name")
{;
}

char* MyClass::GetName()const
{
    return szName;
}

void MyClass::SetName(char* name)
{
}

#include "main.moc"

PM MAIL   Вверх
andrew_121
Дата 14.6.2009, 04:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


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

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



Потому что метод show() вызывать нужно у объекта MyClass. А QLabel должен быть его членом, и в качестве парента должен использовать this. Именно об этом я тебе и пытался сказать здесь: http://forum.vingrad.ru/forum/topic-263063.html


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Любитель
Дата 14.6.2009, 05:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

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



Это, конечно, не по теме вопроса, но:
1. Возвращать указатель на char?! smile Мало того, что это ужасно неудобно юзать, так ещё и даёт возможность модификации поля извне...
2. В чём смысл пользование методом property со статическим параметром (известным в компайл-тайм, всмысле) для известного класса? Это ж ведь значительно медленнее, чем нормальный вызов конкретного метода!
3. Зачем создавать lbl и mc в куче? Да ещё и не удалять их (да, это уже обсуждалось тут не раз - в данном случае ничего не случится, но это ужасная практика).
4. И ещё - NULL в С++ всё-таки не особо принято писать (ибо требует никому не нужного инклюда, а ведь достаточно написать 0).


--------------------
PM MAIL ICQ Skype   Вверх
yngwie19
Дата 14.6.2009, 09:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



andrew_121, 
не понял. у MyClass нет метода show. исправь пожалуйста в моем коде, покажи что ты имеешь в виду.
PM MAIL   Вверх
Любитель
Дата 14.6.2009, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

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



yngwie19, посмотри какие дебажные сообщения при запуске выводит твой код ;)

Цитата

QMetaProperty::read: Unable to handle unregistered datatype 'char*' for property 'MyClass::name'


Ещё раз - зачем так извращаться?! Почему не использовать "обычный" (для Qt) QString?


--------------------
PM MAIL ICQ Skype   Вверх
yngwie19
Дата 14.6.2009, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Любитель, спасибо теперь получилось! Я не понял о чем говорит andrew_121, стоит так делать?

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


Hacker
****


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

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



У QVariant'a нет типа "char *": QVariant::type
Поэтому тебе надо использовать QString, если ты хочешь содержать в свойстве строку.

Но, если ты все-таки хочешь содержать там указатель на Си строку или любой другой тип, то тогда тебе его нужно зарегистрировать:

Код

#include <QtCore/QMetaType>
#include <QtCore/QVariant>
#include <QtGui/QApplication>
#include <QtGui/QLabel>

Q_DECLARE_METATYPE(char *)

class MyClass : public QObject
{
    Q_OBJECT
    Q_PROPERTY(char *name READ GetName WRITE SetName)
public:
    MyClass(QObject *parent = 0) : QObject(parent), name("My Name") {}
    inline char *GetName() const {return name;}
    inline void SetName(char *newname) {name = newname;}
private:
    char *name;
};

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    qRegisterMetaType<char *>("char *");
    MyClass mc;
    QLabel lbl(QLatin1String(mc.property("name").value<char *>()));
    char *buff = "New Name";
    mc.setProperty("name", qVariantFromValue(buff));
    QLabel lbl2(QLatin1String(mc.property("name").value<char *>()));
    lbl.show();
    lbl2.show();   
    return app.exec();
}

#include "main.moc"




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


Опытный
**


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

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



SABROG, спасибо тебе большое.
PM MAIL   Вверх
andrew_121
Дата 14.6.2009, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


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

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



Цитата(Любитель @  14.6.2009,  05:17 Найти цитируемый пост)
в данном случае ничего не случится, но это ужасная практика

Да. И за это нужно бить по рукам.



SABROG, Странный код получился) Обычно виджеты пихают в базовый класс.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
SABROG
Дата 14.6.2009, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



Цитата(andrew_121 @ 14.6.2009,  13:28)
Цитата(Любитель @  14.6.2009,  05:17 Найти цитируемый пост)
в данном случае ничего не случится, но это ужасная практика

Да. И за это нужно бить по рукам.



SABROG, Странный код получился) Обычно виджеты пихают в базовый класс.

Предлагаешь привести указатель QObject'a к QWidget'у и передать в качестве родителя? ;)

setParent() тоже не поможет, он переопределен у QWidget'a под QWidget* вместо QObject*.

Это сообщение отредактировал(а) SABROG - 14.6.2009, 14:23


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


Кодофей
****


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

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



В %QTDIR%/examples есть куча примеров. Именно для того, чтоб не возникало подобных вопросов.


Цитата(SABROG @  14.6.2009,  14:19 Найти цитируемый пост)
Предлагаешь привести указатель QObject'a к QWidget'у и передать в качестве родителя? ;)

setParent() тоже не поможет, он переопределен у QWidget'a под QWidget* вместо QObject*.

Кроме нормального учебника, тутваще ничего не поможет)))

Добавлено @ 15:19
Цитата(yngwie19 @  14.6.2009,  09:11 Найти цитируемый пост)
у MyClass нет метода show

Естественно! Я бы удивился если бы он там был smile  Унаследуйся от QDialod. читай книжки....

Это сообщение отредактировал(а) andrew_121 - 14.6.2009, 15:20


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
SABROG
Дата 14.6.2009, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



Цитата(andrew_121 @  14.6.2009,  15:17 Найти цитируемый пост)
Кроме нормального учебника, тутваще ничего не поможет)))

Учебники - скукота. Я например пишу то, что мне интересно, выбираю себе задачки сам. Если мне не интересно возится с сокетами, пока не припрет не стану изучать. 

Цитата(SABROG @  14.6.2009,  14:19 Найти цитируемый пост)
Обычно виджеты пихают в базовый класс.

Создавать третий виджет как-то влом было, да и превращать QObject в QWidget неохото smile


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


Кодофей
****


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

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



Цитата(SABROG @  14.6.2009,  15:47 Найти цитируемый пост)
Учебники - скукота. Я например пишу то, что мне интересно, выбираю себе задачки сам.

Гм... Уважаемый, вы же не новичек!



Цитата(SABROG @  14.6.2009,  15:47 Найти цитируемый пост)
пока не припрет не стану изучать. 

Все так. Потом локти грызем.




Цитата(SABROG @  14.6.2009,  15:47 Найти цитируемый пост)
Создавать третий виджет как-то влом было, да и превращать QObject в QWidget неохото

Да. Но было бы правильно.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
SABROG
Дата 14.6.2009, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



Цитата(andrew_121 @  14.6.2009,  16:48 Найти цитируемый пост)
Гм... Уважаемый, вы же не новичек!

Новичек. Я еще ни одного серьезного приложения на Qt не написал. Всё утилиты небольшие.

Цитата(andrew_121 @  14.6.2009,  16:48 Найти цитируемый пост)
Да. Но было бы правильно.

Еще было бы правильно придерживаться стиля Qt и написать так:

Код

Q_DECLARE_METATYPE(char *)

class MyClass : public QObject
{
    Q_OBJECT
    Q_PROPERTY(char *name READ name WRITE setName)
public:
    MyClass(QObject *parent = 0) : QObject(parent), m_name("My Name") {}
    inline char *name() const {return m_name;}
    inline void setName(char *newname) {m_name = newname;}
private:
    char *m_name;
};


Тогда не смотря на внутреннее имя переменной m_name к свойству можно обращаться как к "name" и использовать методы в Qtшном стиле: 

Код

    QLabel lbl(QLatin1String(mc.name()));
    char *buff = "New Name";
    mc.setName(buff);
    QLabel lbl2(QLatin1String(mc.name()));


Странно, что на это никто не обратил внимания smile


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


Кодофей
****


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

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



Цитата(SABROG @  14.6.2009,  19:58 Найти цитируемый пост)
Странно, что на это никто не обратил внимания

 smile 


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

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

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


 




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


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

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