crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> connect - сделать вызов одноразовым, сигналы и слоты
AD
  опции профиля:
сообщение 8.10.2009, 9:45
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


connect(act, SIGNAL(triggered()), this, SLOT(prevEventAction()))

Вот есть такой connect. Как сделать так, чтобы этот вызов делался один раз? Ну то-есть необходимо определить, что уже соединение слота и сигнала совершено и вторично делать не следует! Но конечно же, чтобы была возможность, после отсоединения (disconnect) подсоединить еще раз!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 8.10.2009, 10:01
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(AD @ 8.10.2009, 10:45) *
connect(act, SIGNAL(triggered()), this, SLOT(prevEventAction()))

Вот есть такой connect. Как сделать так, чтобы этот вызов делался один раз? Ну то-есть необходимо определить, что уже соединение слота и сигнала совершено и вторично делать не следует! Но конечно же, чтобы была возможность, после отсоединения (disconnect) подсоединить еще раз!

В примитиве можно connect/disconnect делать в специальных функциях, где использовать флаги.

void Obj::myConnect()
{
    if( !m_alreadyConnect )
    {
        connect(act, SIGNAL(triggered()), this, SLOT(prevEventAction()));
        m_alreadyConnect = true;
    }
}

void Obj::myDisconnect()
{
    if( m_alreadyConnect )
    {
        disconnect(act, SIGNAL(triggered()), this, SLOT(prevEventAction()));
        m_alreadyConnect = false;
    }
}

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 8.10.2009, 10:39
Сообщение #3


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


AD,
можно в слоте prevEventAction проверять кто sender и отсоединять прям там.

но я бы не баловался с соединением и рассоединением.
лучше соединить один раз а флагом регулировать выполнять слот или нет.

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 8.10.2009, 10:43
Сообщение #4


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(BRE @ 8.10.2009, 11:01) *
В примитиве можно connect/disconnect делать в специальных функциях, где использовать флаги.

А есть поэлегантнее способ? Или это единственная возможность?

Цитата(kwisp @ 8.10.2009, 11:39) *
AD,
можно в слоте prevEventAction проверять кто sender и отсоединять прям там.
лучше соединить один раз а флагом регулировать выполнять слот или нет.

Как именно это сделать?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 8.10.2009, 10:57
Сообщение #5


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


слушай такая бредовая идея.
е если завести объект класса
class Transmitter: public QObject {
Q_OBJECT
signals:
void transmite();
};

и соединить triggered() с transmite()
а
transmite с prevEventAction
то можно попробовать управлять вызовом prevEventAction с помощью blockSignals


blockSignals естественно объекта Transmitter
:)

Цитата(AD @ 8.10.2009, 11:43) *
Как именно это сделать?

если ты имеешь ввиду управление флагом.
то не сложно.
пусть в классе есть установленный изначально в флаг=0
в слоте проверяешь если 0, то выполняешь слот, если 1 то выходишь из слота, в конце слота устанавливаешь в 1.

перед первым выполнением флаг будет в 0, после первого в 1.
если надо чтоб следующий вызов слота сработал устанавливаешь флаг в 0.

ну естественно можно еще sender использовать чтоб знать что сработало соединение а не простой вызов слота как метода.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 8.10.2009, 11:02
Сообщение #6


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(kwisp @ 8.10.2009, 11:57) *
слушай такая бредовая идея.
... соединить triggered() с transmite()
а
transmite с prevEventAction
то можно попробовать управлять вызовом prevEventAction с помощью blockSignals


blockSignals естественно объекта Transmitter
:)

:blink: Не путай меня! :) По-моему, это "путь из Москвы в Париж через Нью-Йорк"! :)

Цитата(kwisp @ 8.10.2009, 11:57) *
если ты имеешь ввиду управление флагом.
то не сложно.
пусть в классе есть установленный изначально в флаг=0
в слоте проверяешь если 0, то выполняешь слот, если 1 то выходишь из слота, в конце слота устанавливаешь в 1.

перед первым выполнением флаг будет в 0, после первого в 1.
если надо чтоб следующий вызов слота сработал устанавливаешь флаг в 0.

ну естественно можно еще sender использовать чтоб знать что сработало соединение а не простой вызов слота как метода.

ммм. А примерчик можно? Непонятно значение этого флага, если в конце слота значение обнуляется. Что за sender()? Заранее спасибо.

Сообщение отредактировал AD - 8.10.2009, 11:05
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 8.10.2009, 11:10
Сообщение #7


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


Цитата(AD @ 8.10.2009, 12:02) *
Не путай меня! :) По-моему, это "путь из Москвы в Париж через Нью-Йорк"! :)

отвечу словами героя "нашей раши"
- не очкуй, славик, я сто раз так делал. :)
ну если серьезно я же написал что бредовая идея. просто взять готовое и не заморачиваться. :)

Цитата(AD @ 8.10.2009, 12:02) *
А примерчик можно? Непонятно значение этого флага, если в конце слота значение обнуляется

наверное я не умею объяснять.
псевдокод
Раскрывающийся текст
class A: public QObject{
Q_OBJECT
    public:
    A():QObject(),m_doSlot(0)
    {
        connect(object1,SIGNAL(s()),this,SLOT(slSlot()));
    }

    private:
        m_doSlot;

    void slSlot()
    {
        if(m_doSlot) return;
        // делай что надо
        m_doSlot = true;
    }
};


Цитата(AD @ 8.10.2009, 12:02) *
Что за sender()?

вот тут ты меня испугал.
QObject::sender();

Сообщение отредактировал kwisp - 8.10.2009, 11:11
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 25.11.2020, 16:38