Вы можете использовать std::bind
Это адаптер функциональных объектов, который позволяет адаптировать функциональные объекты к заданному количеству параметров.
Например, вы создаете свой собственный чат-сервер. Он содержит два класса: ChatServer и ServerWorker.
ChatServer — это класс QTcpServer, а ServerWorker — это QTcpSocket (управление сокетом на стороне сервера).
Сигналы в заголовке ServerWorker:
void error();
В заголовке вашего ChatServer вы определяете эти частные слоты:
void userError(ServerWorker *sender);
В файле cpp вы создаете этот объект, а в методе incomingConnection
, который запускается после подключения к сокету, вы подключаете слоты и сигналы, используя std::bind
:
void ChatServer::incomingConnection(qintptr socketDescriptor)
{
//some code
connect(worker, &ServerWorker::error, this, std::bind(&ChatServer::userError, this, worker));
}
std::bind
создает функтор с некоторыми фиксированными аргументами. Например, connect(worker, &ServerWorker::error, this, std::bind(&ChatServer::userError, this, worker));
приведет к this->userError(worker)
; вызываться каждый раз, когда рабочий выдает сигнал ошибки.
userErrorslot
выполняется каждый раз, когда сокет, подключенный к клиенту, обнаруживает ошибку. Он имеет подпись:
void ChatServer::userError(ServerWorker *sender)
{
//some code
}
Пример
person
Andrew Pilikin
schedule
21.01.2021