crossplatform.ru

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


  Ответ в connect - сделать вызов одноразовым
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
kwisp Дата 8.10.2009, 11:10
 
Цитата(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();
AD Дата 8.10.2009, 11:02
 
Цитата(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()? Заранее спасибо.
kwisp Дата 8.10.2009, 10:57
  слушай такая бредовая идея.
е если завести объект класса
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, 10:43
 
Цитата(BRE @ 8.10.2009, 11:01) *
В примитиве можно connect/disconnect делать в специальных функциях, где использовать флаги.

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

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

Как именно это сделать?
kwisp Дата 8.10.2009, 10:39
  AD,
можно в слоте prevEventAction проверять кто sender и отсоединять прям там.

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

BRE Дата 8.10.2009, 10:01
 
Цитата(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;
    }
}

AD Дата 8.10.2009, 9:45
 
connect(act, SIGNAL(triggered()), this, SLOT(prevEventAction()))

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