QObject::connect 在 QRunnable - 控制台

Posted

技术标签:

【中文标题】QObject::connect 在 QRunnable - 控制台【英文标题】:QObject::connect in QRunnable - console 【发布时间】:2013-11-18 11:47:16 【问题描述】:

我创建简单的多线程服务器:

创建服务器 如果新连接创建新的 QThreadpool - QRunnable 在可运行中向客户端发送消息并等待请求 如果客户端断开连接,runnable write qDebug 和 runnable quit。

服务器.h

class Server : public QTcpServer

Q_OBJECT
public:
explicit Server(QObject *parent = 0);
void StartServer();

protected:
void incomingConnection(int handle);

private:
QThreadPool *pool;
;

server.cpp:

#include "server.h"

Server::Server(QObject *parent) :
QTcpServer(parent)

pool = new QThreadPool(this);
pool->setMaxThreadCount(10);


void Server::StartServer()

this->listen(QHostAddress(dts.ipAddress),80));


void Server::incomingConnection(int handle)

Runnable *task = new Runnable();
task->setAutoDelete(true);

task->SocketDescriptor = handle;
pool->start(task);

runnable.h

class Runnable : public QRunnable

public:
Runnable();
int SocketDescriptor;

protected:
void run();

public slots:
void disconnectCln();
;

runnable.cpp

#include "runnable.h"

Runnable::Runnable()




void Runnable::run()

if(!SocketDescriptor) return;

QTcpSocket *newSocketCon = new QTcpSocket();
newSocketCon->setSocketDescriptor(SocketDescriptor);

!!!怎么弄的???!!! QObgect::connect(newSocketCon, SIGNAL(disconnected()), this, SLOTS(disconnectCln()));

newSocketCon->write(mes.toUtf8().data());
newSocketCon->flush();
newSocketCon->waitForBytesWritten();


void Runnable::disconnectCln()

qDebug() << "Client was disconnect";

【问题讨论】:

【参考方案1】:

您似乎忽略了实际提出问题,但这是我在您的代码中发现的直接问题:您的 Runnable 类不继承自 QObject,因此不能具有信号和插槽。你需要这样做才能让它发挥作用。

class Runnable : public QObject, public QRunnable

  Q_OBJECT
public:
  Runnable();
  int SocketDescriptor;

protected:
  void run();

public slots:
  void disconnectCln();
;

这里有两件重要的事情需要注意。 1) 如果你使用多重继承,QObject 必须在列表的第一位。 2) 要使用信号和槽,您必须在类定义中包含 Q_OBJECT 宏。

【讨论】:

非常感谢! :)

以上是关于QObject::connect 在 QRunnable - 控制台的主要内容,如果未能解决你的问题,请参考以下文章

如果在调用 QObject::connect() 之前发出信号,如何避免竞争?

包装 QObject::connect 错误

错误:'QObject' 是 'SerialPort' QObject::connect(&uartObj, SIGNAL(readDone(QByteArray)), this, SLOT(

QObject::connect: 没有这样的信号(类名)(信号名)(属性)

将 lambda 函数作为第三个参数传递给 QObject::connect 时出错

QObject::connect: 没有这样的信号