#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);
});