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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: передача параметров в слот  (Прочитано 6841 раз)
spigel
Гость
« : Июль 12, 2007, 12:05 »

для примера:
есть сигнал у кнопки clicked()
есть слот у объекта onClick(int)

необходимо для каждого соединения передавать свой константный параметр.

т.е. использование sender() в этом случае не подходит по многим причинам ( в том числе недоступности объектов в слоте ).

известно что при обработке сигнала, передача управления происходит в порядке подключения сигнала к слоту (по номерам)
получается что каждый вызов слота индивидуальный и в принципе может содержать индивидуальный аргумент.

Вопрос, как это сделать?
как при установке связи через функцию connect
указать как вызывать слот на этом сигнале?
Записан
WW
Гость
« Ответ #1 : Июль 12, 2007, 12:46 »

Цитировать
т.е. использование sender() в этом случае не подходит по многим причинам ( в том числе недоступности объектов в слоте ).

Он для этого и сделан, чтобы узнать, кто сгенерировал сигнал.
Цитировать
известно что при обработке сигнала, передача управления происходит в порядке подключения сигнала к слоту (по номерам)

Вот здесь тролли категорически против. они даже утвреждают обратное, что надееться на это ни в коем случае нельзя.
Записан
spigel
Гость
« Ответ #2 : Июль 12, 2007, 13:25 »

да, по sender нужно делать "свои" объекты, которые сумеют вернуть заветный параметр = у них должен быть интерфейс
таким образом надо сделать вроде CMyPushButton, в котором будет getMyID
и конечно преобразовать объект sender'a к нужному интерфейсу,
но так сделать невозможно = очень велик объем (в моем случае)

да, конечно порядок вызова не важен, я на него и не закладываюсь
но посмотрев как они вызывают слоты пришел к выводу что для каждой связи строится отдельная конструкция вызова
соответственно каждый вызов слота (для одного и того же сигнала) может содержать собственные параметры.
Записан
-=s0L=-
Гость
« Ответ #3 : Июль 12, 2007, 15:15 »

Каждому объекту можно назначить символьное имя. Делай этим кнопкам setObjectName(QString::number(ID)), а потом в слоте sender()->objectName().toInt()
Записан
spigel
Гость
« Ответ #4 : Июль 12, 2007, 16:19 »

да, спасибо, интересное решение! :-)
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #5 : Июль 12, 2007, 16:43 »

Если речь идёт о кнопках, тогда юзай QButtonGroup
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Вячеслав
Гость
« Ответ #6 : Июль 12, 2007, 22:23 »

Еще вроде как QSignalMapper был Подмигивающий ( Название по памяти писал - ногами не бить )
Записан
spigel
Гость
« Ответ #7 : Июль 13, 2007, 08:15 »

основная идея была передать параметр, с которым вызывать слот по происшествии сигнала. Действительно, если знать от кого пришел сигнал (кнопка, action), то многое решается доп. средствами. setObjectName - опасная функция, т.к. по ней работают некоторые другие методы (например: поиск по имени класса, связывание сигнала и слота по имени). Пока нет решения, приходится идти в обход.
Записан
Вячеслав
Гость
« Ответ #8 : Июль 13, 2007, 09:21 »

Цитировать

The QSignalMapper class bundles signals from identifiable senders.

This class collects a set of parameterless signals, and re-emits them with integer, string or widget parameters corresponding to the object that sent the signal.

The class supports the mapping of particular strings or integers with particular objects using setMapping(). The objects' signals can then be connected to the map() slot which will emit the mapped() signal with the string or integer associated with the original signalling object. Mappings can be removed later using removeMappings().

Example: Suppose we want to create a custom widget that contains a group of buttons (like a tool palette). One approach is to connect each button's clicked() signal to its own custom slot; but in this example we want to connect all the buttons to a single slot and parameterize the slot by the button that was clicked.

Here's the definition of a simple custom widget that has a single signal, clicked(), which is emitted with the text of the button that was clicked:


Это не оно случаем ? в смысле решения ?
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #9 : Июль 13, 2007, 09:49 »

Цитата: "spigel"
основная идея была передать параметр, с которым вызывать слот по происшествии сигнала. Действительно, если знать от кого пришел сигнал (кнопка, action), то многое решается доп


А конкретнее можно описать. Определить кнопка это или экшн можно и при помощи sender()

Код:
void SomeClass::someSlot()
{
    QObject *obj = sender();
    if (!obj) return;

    if (qobject_cast<QAction *>(obj)) {
        <do_something with QAction>
        return;
    }

    if (qobject_cast<QPushButton *>(obj)) {
        <do_something with QPushButton>
        return;
    }
}


Можешь глянуть ещё такие методы как

Код:
bool QObject::inherits ( const char * className ) const
const char * QMetaObject::className () const


Вобще почитать про QMetaObject
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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