Передать указатель на себя в emit() в Qt

#c #qt #qt5 #signals-slots

#c #qt #qt5 #сигналы-слоты

Вопрос:

У меня есть класс, обрабатывающий передачу файлов. Одним из finished() отправлений является сигнал

на родительской стороне я хотел бы подключить этот finished() сигнал к fileTransferFinished() слоту, но как я могу узнать, какой экземпляр завершен? поскольку их одновременно работает множество..

Я знаю, что могу использовать QObject::sender() метод для возврата эмиттера, но таким образом я не могу получить доступ к методу моего экземпляра..

qDebug() << «готово» << QObject::sender()->getId();

в нем говорится no member named getID in QObject

Я бы хотел, чтобы мой указатель находился внутри функции Slot, возможно ли это?

Комментарии:

1. Почему бы вам просто не добавить параметр в сигнал / слот, чтобы указать готовый?

Ответ №1:

Посмотрите на прототип Object::sender() в документации:

 QObject * QObject::sender() const
 

Он возвращает указатель на экземпляр QObject, следовательно, вы не сможете вызвать getID() метод для этого возвращаемого значения.

Приведите возвращаемое значение Object::sender() к указателю вашего класса перед его использованием :

 YourClass * sender_obj = qobject_cast<YourClass*>(QObject::sender());
qDebug() << "finished " << sender_obj->getID();
 

Ответ №2:

Использование sender() не является чистым решением. Это нарушает модульность, которая обычно является целью использования сигналов и слотов.

В документации говорится:

Предупреждение: эта функция нарушает объектно-ориентированный принцип модульности.

Рекомендуется использовать QSignalMapper .

Ответ №3:

В дополнение к предыдущим решениям и учитывая, что вы используете Qt 5, другим вариантом является использование лямбда-выражения, которое передает объект в ваш слот:

 connect(object, amp;YourClass::finished, [this, object]() {
  fileTransferFinished(object);
});