Название: Свойство 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 Зачем так усложнять? Эмммм... Что ты хочешь этим сказать? sender() возвращает указатель на объект типа QObject, который не содержит метода window(). Вот если его привести к QWidget*, то да, только что мне это даст в итоге?Почему нельзя сделать так: qobject_cast< QBaseDialog* >( sender()->window() ) Цитировать Ведь по-сути указатель - это число, может при задании присваивании указателя QVariant'у его сначала преобразовать в int, а потом как-то обратно. Или это сильно нагло и невозможно? Указатель в лучшем случае нужно приводить к size_t, а не как к int.Название: Re: Свойство Tag у дочерних классов класса QWidget Отправлено: GreatSnake от Май 27, 2010, 15:26 Цитировать только что мне это даст в итоге? После внимательной прочитки проблемы понял, что ничего :)А что такое QBaseDialog? Как описан? Название: Re: Свойство Tag у дочерних классов класса QWidget Отправлено: Nimbus от Май 27, 2010, 17:50 А что такое QBaseDialog? Как описан? Да обычный класс, унаследованный от QDialog с несколькими своими методами (и несколькими виртуальными).Такой код компилируется без ошибок, но я что-то боюсь его запускать на выполнение ;D Код
Название: 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) ); |