Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: connect - сделать вызов одноразовым
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Общие вопросы
AD
connect(act, SIGNAL(triggered()), this, SLOT(prevEventAction()))

Вот есть такой connect. Как сделать так, чтобы этот вызов делался один раз? Ну то-есть необходимо определить, что уже соединение слота и сигнала совершено и вторично делать не следует! Но конечно же, чтобы была возможность, после отсоединения (disconnect) подсоединить еще раз!
BRE
Цитата(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
AD,
можно в слоте prevEventAction проверять кто sender и отсоединять прям там.

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

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

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

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

Как именно это сделать?
kwisp
слушай такая бредовая идея.
е если завести объект класса
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
Цитата(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
Цитата(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();
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.