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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Свойство Tag у дочерних классов класса QWidget  (Прочитано 6568 раз)
Nimbus
Гость
« : Май 25, 2010, 11:46 »

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

Цитировать
Вызов функции sender() внутри слота - не вариант.
а почему не вариант?? можно же получить имя объекта!?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



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

bool QObject::setProperty ( const char * name, const QVariant & value )
Записан

Qt 5.11/4.8.7 (X11/Win)
Nimbus
Гость
« Ответ #3 : Май 25, 2010, 12:04 »

bool QObject::setProperty ( const char * name, const QVariant & value )
Так даже универсальнее получается, т. к. можно задать несколько произвольных свойств.
Thanks, bro =) Лучей добра тебе.
Записан
MoPDoBoPoT
Гость
« Ответ #4 : Май 25, 2010, 12:49 »

bool QObject::setProperty ( const char * name, const QVariant & value )
Да, это более универсально, но, для данного случая, как я понял, подойдет QObject::setObjectName(), QObject::objectName().
Записан
ритт
Гость
« Ответ #5 : Май 25, 2010, 13:03 »

!qtdoc: QSignalMapper
Записан
SASA
Гость
« Ответ #6 : Май 26, 2010, 15:10 »

!qtdoc: QSignalMapper
+1

Для описанной задачи это луший вариант. QSignalMapper специально для этого сделали.
Записан
Nimbus
Гость
« Ответ #7 : Май 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() и вызывать его методы. %)
« Последнее редактирование: Май 27, 2010, 12:19 от Nimbus » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



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

Зачем так усложнять?
Почему нельзя сделать так:

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

Цитировать
Ведь по-сути указатель - это число, может при задании присваивании указателя QVariant'у его сначала преобразовать в int, а потом как-то обратно. Или это сильно нагло и невозможно?
Указатель в лучшем случае нужно приводить к size_t, а не как к int.
« Последнее редактирование: Май 27, 2010, 14:11 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
Nimbus
Гость
« Ответ #9 : Май 27, 2010, 15:08 »

Зачем так усложнять?
Почему нельзя сделать так:

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


Цитировать
Ведь по-сути указатель - это число, может при задании присваивании указателя QVariant'у его сначала преобразовать в int, а потом как-то обратно. Или это сильно нагло и невозможно?
Указатель в лучшем случае нужно приводить к size_t, а не как к int.
Эмммм... Что ты хочешь этим сказать? sender() возвращает указатель на объект типа QObject, который не содержит метода window(). Вот если его привести к QWidget*, то да, только что мне это даст в итоге?
« Последнее редактирование: Май 27, 2010, 15:12 от Nimbus » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



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

Цитировать
только что мне это даст в итоге?
После внимательной прочитки проблемы понял, что ничего Улыбающийся

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

Qt 5.11/4.8.7 (X11/Win)
Nimbus
Гость
« Ответ #11 : Май 27, 2010, 17:50 »

А что такое QBaseDialog? Как описан?
Да обычный класс, унаследованный от QDialog с несколькими своими методами (и несколькими виртуальными).
Такой код компилируется без ошибок, но я что-то боюсь его запускать на выполнение  Смеющийся
Код
C++ (Qt)
...
//закидываем указатель в свойства баттона
pButton->setProperty("dlg", reinterpret_cast<intptr_t>(pChildClassObj));
...
//В слоте вызываем
QBaseDialog *pBaseDialog = sender()->property("dlg").value<QBaseDialog*>();
...
 
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



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

Цитировать
Да обычный класс, унаследованный от QDialog с несколькими своими методами (и несколькими виртуальными).
Q_OBJECT не забыли добавить?

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

Q_DECLARE_METATYPE(QBaseDialog*)

QBaseDialog* dlg;
pButton->setProperty( "dlg", QVariant::fromValue(dlg) );
« Последнее редактирование: Май 27, 2010, 18:03 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
Nimbus
Гость
« Ответ #13 : Май 27, 2010, 18:23 »

Q_OBJECT не забыли добавить?
Да как такое можно забыть-то? Улыбающийся
Наверное так будет лучше

Q_DECLARE_METATYPE(QBaseDialog*)

QBaseDialog* dlg;
pButton->setProperty( "dlg", QVariant::fromValue(dlg) );
Чем лучше?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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