Ответ 1
Вероятно, вы забыли использовать макрос Q_OBJECT
. Каждый класс, который реализует свои собственные слоты/сигналы, нуждается в этом макросе. Не забывайте, что вам нужно добавить файл заголовка/исходного файла в файл .pro.
Я проверил другие подобные вопросы и попробовал их решения, но они не работают для меня.
Я в основном пытаюсь сделать http-клиент, который только делает почтовые запросы. Для этого мне нужно подключить QNetworkManager
готовый сигнал к некоторому слоту обратного вызова.
Вот мой код.
h файл:
...
public slots:
void finishedSlot(QNetworkReply* reply);
private:
QNetworkAccessManager *network_manager;
...
Файл cpp:
...
Class1::Class1(){
network_manager = new QNetworkAccessManager(this);
QObject::connect(network_manager, SIGNAL(finished(QNetworkReply *)), this, SLOT(finishedSlot(QNetworkReply *)));
}
...
void Class1::finishedSlot(QNetworkReply* reply)
{
// some logic with reply
}
...
Как вы можете видеть, слот определенно присутствует и объявлен в общедоступных слотах в файле заголовка. Поэтому я понятия не имею, почему это происходит. Я уже пробовал очистить, запустил qmake и перестроил.
Сообщение об ошибке: "QObject:: connect: нет такого слота QObject:: finishedSlot (QNetworkReply *)"
Любая идея?
Вероятно, вы забыли использовать макрос Q_OBJECT
. Каждый класс, который реализует свои собственные слоты/сигналы, нуждается в этом макросе. Не забывайте, что вам нужно добавить файл заголовка/исходного файла в файл .pro.
Одно замечание; поскольку вы используете Qt 5, есть новый синтаксис соединения слота сигнала, который позволит вам указать любую функцию, а не только те, которые определены как слоты.
В этой ситуации вы можете сделать следующее: -
connect(network_manager, &QNetworkAccessManager::finished, this, &Class1::finishedSlot);
Что хорошего в этом синтаксисе, так это то, что вы просто указываете адрес функции и не беспокоитесь о параметрах, поэтому, если вы меняете их в функции, вам не нужно обновлять их в операторах связи.
Вы все равно должны использовать макрос Q_OBJECT, и вы можете больше узнать о новом синтаксисе здесь.
Вероятно, вы забыли использовать макрос
Q_OBJECT
. Каждый класс, который реализует свои собственные слоты/сигналы, нуждается в этом макросе. Не забывайте, что вам нужно добавить файл заголовка/исходного файла в файл.pro
.
Как и после этих шагов, я получал некоторую ошибку в отношении "vtable не создан..." для соответствующего класса, а затем я изменил иерархию HEADERS +=
и SOURCES +=
, так как
HEADERS +=\
SOURCES +=
Ну, проблема решена. Но я не понял причину этого.
Любой мог бы просветить это отношение connect()
с помощью Q_OBJECT
, moc_*file
с *.pro
файлами (как генерируются эти про файлы).
У меня было понимание, что он анализирует *.pro
как теги (SOURCES
, HEADER
, CONFIG
и т.д.), но в этом случае почему иерархия создаст проблему?