LINUX.ORG.RU

Qt динамическая связка сигналов-слотов

 


0

1

Добрый вечер, есть массив из n-го кол-ва QTimer каждый из них запускается в разное время. Чтобы не плодить повторяющийся код хочу чтобы слот для приема этих таймеров был один. Как мне в слоте узнать для какого именно таймера он был вызван?

UPD: есть некая структура, которая содержит таймер, так вот таких структур может быть n-ое кол-во и в слоте нужно узнать для какой именно структуры был вызван слот таймаута.



Последнее исправление: hell_wood (всего исправлений: 1)

Как мне в слоте узнать для какого именно таймера он был вызван?

sender()

UPD: есть некая структура, которая содержит таймер, так вот таких структур может быть n-ое кол-во и в слоте нужно узнать для какой именно структуры был вызван слот таймаута.

Карту сделай. Или parent().

Stil ★★★★★
()

Свой класс таймера и сигнал с параметром

Elyas ★★★★★
()
Ответ на: комментарий от hell_wood

В слоте можно вызывать функцию sender(), она вернет указатель на объект эмиттер сигнала – твой таймер. Если твоя «структура» – это унаследованный от QObject класс, то ты можешь подкидывать this в конструктор QTimer, тогда ты сможешь получать указатель на свой объект методом parent() таймера.

Stil ★★★★★
()
Ответ на: комментарий от Stil

а дальше как связать сигнал таймера? И понять для какого именно экземпляра он был вызван?

hell_wood
() автор топика

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

https://habrahabr.ru/post/50812/

anonymous
()

Как-то так:

struct MyStruct {
  quint8 number;
  MyTimer timer;
  // other stuff
}
А в таймер запихни номер структуры, которая тебе нужна
class MyTimer : QTimer 
{
public:
QTimer(quint8 number, QObject* parent);

private:
quint8 number; // номер структуры
};

или прямо ссылку на саму структуру:

class MyTimer : QTimer 
{
public:
QTimer(MyStruct* struct, QObject* parent);

private:
MyStruct* struct; // или прямо ссылка на структуру
};

В коде слота:

MyTimer* timer = qobject_cast<MyTimer*>(sender());
timer->number // получили номер структуры
timer->struct // получили саму структуру 

ncuxer
()
Ответ на: комментарий от anonymous

Не знал, что такая штука есть, спасибо

Автор, может тебе и предпочтительней будет этот вариант.

ncuxer
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.