Автор: AD 8.10.2009, 9:45
connect(act, SIGNAL(triggered()), this, SLOT(prevEventAction()))
Вот есть такой connect. Как сделать так, чтобы этот вызов делался один раз? Ну то-есть необходимо определить, что уже соединение слота и сигнала совершено и вторично делать не следует! Но конечно же, чтобы была возможность, после отсоединения (disconnect) подсоединить еще раз!
Автор: 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;
}
}
Автор: kwisp 8.10.2009, 10:39
AD,
можно в слоте prevEventAction проверять кто 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:57
слушай такая бредовая идея.
е если завести объект класса
class Transmitter: public QObject {
Q_OBJECT
signals:
void transmite();
};
и соединить
triggered() с
transmite()
а
transmite с
prevEventAction то можно попробовать управлять вызовом
prevEventAction с помощью
blockSignalsblockSignals естественно объекта Transmitter
Цитата(AD @ 8.10.2009, 11:43)
Как именно это сделать?
если ты имеешь ввиду управление флагом.
то не сложно.
пусть в классе есть установленный изначально в флаг=0
в слоте проверяешь если 0, то выполняешь слот, если 1 то выходишь из слота, в конце слота устанавливаешь в 1.
перед первым выполнением флаг будет в 0, после первого в 1.
если надо чтоб следующий вызов слота сработал устанавливаешь флаг в 0.
ну естественно можно еще sender использовать чтоб знать что сработало соединение а не простой вызов слота как метода.
Автор: AD 8.10.2009, 11:02
Цитата(kwisp @ 8.10.2009, 11:57)
слушай такая бредовая идея.
... соединить
triggered() с
transmite()
а
transmite с
prevEventAction то можно попробовать управлять вызовом
prevEventAction с помощью
blockSignalsblockSignals естественно объекта Transmitter
Не путай меня!
По-моему, это "путь из Москвы в Париж через Нью-Йорк"!
Цитата(kwisp @ 8.10.2009, 11:57)
если ты имеешь ввиду управление флагом.
то не сложно.
пусть в классе есть установленный изначально в флаг=0
в слоте проверяешь если 0, то выполняешь слот, если 1 то выходишь из слота, в конце слота устанавливаешь в 1.
перед первым выполнением флаг будет в 0, после первого в 1.
если надо чтоб следующий вызов слота сработал устанавливаешь флаг в 0.
ну естественно можно еще sender использовать чтоб знать что сработало соединение а не простой вызов слота как метода.
ммм. А примерчик можно? Непонятно значение этого флага, если в конце слота значение обнуляется. Что за sender()? Заранее спасибо.
Автор: 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();