Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Nimbus от Май 25, 2010, 11:46



Название: Свойство Tag у дочерних классов класса QWidget
Отправлено: Nimbus от Май 25, 2010, 11:46
В Qt я по-прежнему считаю себя чайником.
Перехожу с .NET платформы. Вот там у каждого графического элемента управления есть свойство Tag типа object (аналогичное QVariant), так вот, есть ли подобное свойство у GUI элементов в Qt? Например, у меня один слот для сигнала clicked() с нескольких объектов класса QPushButton? Как мне различать их? Вызов функции sender() внутри слота - не вариант.


Название: Re: Свойство Tag у дочерних классов класса QWidget
Отправлено: garryHotDog от Май 25, 2010, 11:56
Цитировать
Вызов функции sender() внутри слота - не вариант.
а почему не вариант?? можно же получить имя объекта!?


Название: Re: Свойство Tag у дочерних классов класса QWidget
Отправлено: GreatSnake от Май 25, 2010, 11:57
bool QObject::setProperty ( const char * name, const QVariant & value )


Название: Re: Свойство Tag у дочерних классов класса QWidget
Отправлено: Nimbus от Май 25, 2010, 12:04
bool QObject::setProperty ( const char * name, const QVariant & value )
Так даже универсальнее получается, т. к. можно задать несколько произвольных свойств.
Thanks, bro =) Лучей добра тебе.


Название: Re: Свойство Tag у дочерних классов класса QWidget
Отправлено: MoPDoBoPoT от Май 25, 2010, 12:49
bool QObject::setProperty ( const char * name, const QVariant & value )
Да, это более универсально, но, для данного случая, как я понял, подойдет QObject::setObjectName(), QObject::objectName().


Название: Re: Свойство Tag у дочерних классов класса QWidget
Отправлено: ритт от Май 25, 2010, 13:03
!qtdoc: QSignalMapper


Название: Re: Свойство Tag у дочерних классов класса QWidget
Отправлено: SASA от Май 26, 2010, 15:10
!qtdoc: QSignalMapper
+1

Для описанной задачи это луший вариант. QSignalMapper специально для этого сделали.


Название: Re: Свойство Tag у дочерних классов класса QWidget
Отправлено: Nimbus от Май 27, 2010, 11:15
Так... А если я хочу в этом свойстве (оно же типа QVariant) сохранить указатель на объект какого-либо класса, а затем получить его через qobject_cast шаблонную функцию, то как поступать? Ведь по-сути указатель - это число, может при задании присваивании указателя QVariant'у его сначала преобразовать в int, а потом как-то обратно. Или это сильно нагло и невозможно?

Ок. На Гугле бан сняли. Воспользовался методами класса QVariant setValue(...) и value<...>(). Надеюсь, это правильно.
Q_DECLARE_METATYPE(QBaseDialog*)
И фейл:
..\..\..\..\Qt\2010.02.1\qt\include/QtCore/../../src/corelib/kernel/qmetatype.h:200: error: 'qt_metatype_id' is not a member of 'QMetaTypeId<QBaseDialog*>'

Вообще, по сути, создаю интерфейс - много кнопочек, на все один слот, который открывает при нажатии соответствующее ей диалоговое окно (класс диалога унаследован от класса QBaseDialog, который у меня тоже описан). Просто, не хочется для каждой кнопки создавать отдельный слот или юзать оператор switch (...) { case ... } для различения нажатий. Может кто подскажет другой путь? Я хотел в конструкторе класса динамически создать по одному объекту каждого диалогового класса и через setProperty назначить каждой кнопке указатель на объект диалогового класса, и потом уже в слоте получать указатель на базовый класс вызовом sender()->property() и вызывать его методы. %)


Название: Re: Свойство Tag у дочерних классов класса QWidget
Отправлено: GreatSnake от Май 27, 2010, 14:06
Зачем так усложнять?
Почему нельзя сделать так:

qobject_cast< QBaseDialog* >( sender()->window() )

Цитировать
Ведь по-сути указатель - это число, может при задании присваивании указателя QVariant'у его сначала преобразовать в int, а потом как-то обратно. Или это сильно нагло и невозможно?
Указатель в лучшем случае нужно приводить к size_t, а не как к int.


Название: Re: Свойство Tag у дочерних классов класса QWidget
Отправлено: Nimbus от Май 27, 2010, 15:08
Зачем так усложнять?
Почему нельзя сделать так:

qobject_cast< QBaseDialog* >( sender()->window() )


Цитировать
Ведь по-сути указатель - это число, может при задании присваивании указателя QVariant'у его сначала преобразовать в int, а потом как-то обратно. Или это сильно нагло и невозможно?
Указатель в лучшем случае нужно приводить к size_t, а не как к int.
Эмммм... Что ты хочешь этим сказать? sender() возвращает указатель на объект типа QObject, который не содержит метода window(). Вот если его привести к QWidget*, то да, только что мне это даст в итоге?


Название: Re: Свойство Tag у дочерних классов класса QWidget
Отправлено: GreatSnake от Май 27, 2010, 15:26
Цитировать
только что мне это даст в итоге?
После внимательной прочитки проблемы понял, что ничего :)

А что такое QBaseDialog? Как описан?


Название: Re: Свойство Tag у дочерних классов класса QWidget
Отправлено: Nimbus от Май 27, 2010, 17:50
А что такое QBaseDialog? Как описан?
Да обычный класс, унаследованный от QDialog с несколькими своими методами (и несколькими виртуальными).
Такой код компилируется без ошибок, но я что-то боюсь его запускать на выполнение  ;D
Код
C++ (Qt)
...
//закидываем указатель в свойства баттона
pButton->setProperty("dlg", reinterpret_cast<intptr_t>(pChildClassObj));
...
//В слоте вызываем
QBaseDialog *pBaseDialog = sender()->property("dlg").value<QBaseDialog*>();
...
 


Название: Re: Свойство Tag у дочерних классов класса QWidget
Отправлено: GreatSnake от Май 27, 2010, 17:56
Цитировать
Да обычный класс, унаследованный от QDialog с несколькими своими методами (и несколькими виртуальными).
Q_OBJECT не забыли добавить?

Наверное так будет лучше

Q_DECLARE_METATYPE(QBaseDialog*)

QBaseDialog* dlg;
pButton->setProperty( "dlg", QVariant::fromValue(dlg) );


Название: Re: Свойство Tag у дочерних классов класса QWidget
Отправлено: Nimbus от Май 27, 2010, 18:23
Q_OBJECT не забыли добавить?
Да как такое можно забыть-то? :)
Наверное так будет лучше

Q_DECLARE_METATYPE(QBaseDialog*)

QBaseDialog* dlg;
pButton->setProperty( "dlg", QVariant::fromValue(dlg) );
Чем лучше?