QObject::connect не может подключить сигнал к слоту *этого* объекта

Название может быть трудно понять, извините за это.

У меня проблема с подключением сигнала к слоту. Ошибок компиляции нет, но соединение возвращает false. В консоли выводится строка с ошибкой:

QObject::connect: No such slot QObject::clientConnected_() in ../server/server.cpp:8

Думаю проблема в том, что коннект не видит слот clientConnected_() в классе Server. Или, может быть, по какой-то причине ищет его в классе QObject.

Код выглядит следующим образом:

сервер.ч

#ifndef SERVER_H
#define SERVER_H

#include <QtNetwork>
#include <QTcpServer>
#include <QObject>

class Server : public QObject
{
    Q_OBJECT
public:
    bool startListening(const quint16 port);
public slots:
    static void clientConnected_();
private:
    QTcpServer * server_;
};

#endif // SERVER_H

сервер.cpp

#include "server.h"

#include <iostream>

bool Server::startListening(const quint16 port)
{
    server_ = new QTcpServer();
    QObject::connect(server_,SIGNAL(newConnection()),this,SLOT(clientConnected_()));
    return server_->listen(QHostAddress::Any,port);
}

void Server::clientConnected_()
{
    std::cout << "Connection established!" << std::endl;
    return;
}

Есть идеи?


person Jakub Matěna    schedule 08.10.2018    source источник
comment
Я проверил ваш код, я только что добавил конструктор, и у меня нет проблем с компиляцией, предоставьте минимальный воспроизводимый пример   -  person eyllanesc    schedule 09.10.2018
comment
использовать новое соединение стилей: connect(server_, &QTcpServer::newConnection, this, &Server::clientConnected_);. Проблема со старым стилем подключения в том, что он не сообщает вам, было ли подключение или нет во время компиляции, а просто кричит вам во время выполнения, поэтому рекомендуется использовать новый синтаксис. `   -  person eyllanesc    schedule 09.10.2018


Ответы (2)


статическая пустота clientConnected_();

изменить на

приватные слоты: void clientConnected_();

person Artmetic    schedule 08.10.2018

Как уже упоминалось, вы должны декалировать свой 'void clientConnected_()' как нестатический (вы не можете подключиться к статическому элементу, но если хотите, вы можете вызвать статический метод из своего слота). А также вы должны объявить слоты в разделе «slot», чтобы MOC мог анализировать ваши слоты.

Более подробную информацию вы можете найти здесь http://doc.qt.io/qt-5/signalsandslots.html

person Arman Oganesyan    schedule 09.10.2018