-
UID:131481
-
- 注册时间2012-05-08
- 最后登录2012-06-07
- 在线时间14小时
-
- 发帖9
- 搜Ta的帖子
- 精华0
- 金钱90
- 威望19
- 贡献值0
- 好评度9
-
访问TA的空间加好友用道具
|
我的程序是这样的, 服务器端有clientsocket类,dcThread类,server类,以及主 界面类,程序加入用于改变界面的signal和slot之后,一直发生以下 错误,找网上的办法都不行!! [size=; font-size:10pt,10pt] [font='Courier']QObject: Cannot create children for a parent that is in a different thread.[size=; font-size:10pt,10pt] [font='Courier'](Parent is DCSThread(0x13006d0), parent's thread is QThread(0x15e9ed0), current thread is DCSThread(0x13006d0)[size=; font-size:10pt,10pt] [font='Courier']
本来在加入改变界面的signal和slot之前,这个错误通过添加Qt::DirectConnection参数解决,但是现在也不行了,请大家帮忙哈~~ 以下是部分代码: - #ifndef CLIENTSOCKET_H
- #define CLIENTSOCKET_H
- #include <QtNetwork/QTcpSocket>
- #include <QPixmap>
- #include <QImage>
- class ClientSocket : public QTcpSocket
- {
- Q_OBJECT
- public:
- explicit ClientSocket(QObject *parent = 0,int client_id=0);
- void sendInfor();//发信息:N=正常,W=警告,B=阻塞,U=取消阻塞
- signals:
- void createOne(int,QString,QString,QImage);
- public slots:
- void readInfor();//读取:I=客户端信息+截图,P=截图,C=关机
- private:
- quint16 nextBlockSize;
- quint8 type;
- int clientId;
- //客户端信息
- QString clientName;
- QString clientIP;
- //QPixmap clientPic;
- QImage clientPic;
- };
- #endif // CLIENTSOCKET_H
clientsocket的实现: - #include "clientsocket.h"
- #include <QMessageBox>
- #include <QDebug>
- ClientSocket::ClientSocket(QObject *parent,int client_id) :
- QTcpSocket(parent),clientId(client_id)
- {
- //type初始化
- qDebug()<<"start a socket!";
- type='N';
- connect(this,SIGNAL(readyRead()),this,SLOT(readInfor()),Qt::DirectConnection);
- connect(this,SIGNAL(disconnected()),this,SLOT(deleteLater()));
- nextBlockSize=0;
- qDebug()<<"client_id:"<<clientId;
- }
- void ClientSocket::sendInfor()//发信息:N=正常,W=警告,B=阻塞,U=取消阻塞
- {
- //服务器发信息:大小+类型
- QByteArray block;
- QDataStream out(&block,QIODevice::WriteOnly);
- out.setVersion(QDataStream::Qt_4_8);
- out<<quint16(0)<<type;
- out.device()->seek(0);
- out<<quint16(block.size()-sizeof(quint16));
- write(block);
- nextBlockSize=0;
- }
- void ClientSocket::readInfor()//读取:I=客户端信息+截图,P=截图,C=关机
- {
- qDebug()<<"read infor!";
- //服务器收到信息:大小+类型+内容,除了C没有内容
- QDataStream in(this);
- in.setVersion(QDataStream::Qt_4_8);
- if(nextBlockSize==0)
- {
- if(bytesAvailable()<sizeof(quint16)){
- return;
- }
- in>>nextBlockSize;
- qDebug()<<nextBlockSize;
- }
- in>>type;
- qDebug()<<type;
- switch (type)
- {
- case 'I':
- //客户端信息:显示图片和计算机名字等
- in>>clientName>>clientIP;
- //暂且不考虑截图切割比较以及huffman编码压缩等,直接读取图片
- in>>clientPic;
- qDebug()<<clientName<<" "<<clientIP;
- qDebug()<<clientPic.size();
- //应该弄一个信号,由于这个信号,引发建立一个图片,显示名字,connect信号和信号等
- //emit createOne(clientId,clientName,clientIP,clientPic);//发送信号
- //qDebug()<<"emit createOne()--socket";
- type='N';//test
- break;
- case 'P':
- //截图,显示变化
- qDebug()<<"should p";
- type='N';
- break;
- case 'C':
- //显示关闭图片
- break;
- default:
- break;
- }
- sendInfor();
- }
DCThread类 - #ifndef DCSTHREAD_H
- #define DCSTHREAD_H
- #include <QThread>
- #include <QtNetwork/QTcpSocket>
- #include "clientsocket.h"
- class DCSThread : public QThread
- {
- Q_OBJECT
- public:
- explicit DCSThread(int handle,QObject *parent = 0,int clientid=0);
- signals:
- void createOne(int,QString,QString,QImage);
- public slots:
- protected:
- void run();
- private:
- ClientSocket *tcpSocket;
- int socketID;
- int clientID;
- };
- #endif // DCSTHREAD_H
- #include "dcsthread.h"
- #include <QDebug>
- DCSThread::DCSThread(int handle,QObject *parent,int clientid) :
- QThread(parent),socketID(handle),clientID(clientid)
- {
- qDebug()<<"start a thread!";
- //clientID=11;
- }
- void DCSThread::run()
- {
- qDebug()<<"run thread!";
- tcpSocket=new ClientSocket(this,clientID);
- tcpSocket->setSocketDescriptor(socketID);
- //socket的信号和thread的信号相连
- //connect(tcpSocket,SIGNAL(createOne(int,QString,QString,QImage)),this,SIGNAL(createOne(int,QString,QString,QImage)));
- exec();
- }
server类 - #ifndef DCTCPSERVER_H
- #define DCTCPSERVER_H
- #include <QtNetwork/QTcpServer>
- #include "dcsthread.h"
- class DCTcpServer : public QTcpServer
- {
- Q_OBJECT
- public:
- explicit DCTcpServer(QObject *parent = 0);
- signals:
- void createOne(int,QString,QString,QImage);
- public slots:
- private:
- void incomingConnection(int handle);
- int client_count;
- };
- #endif // DCTCPSERVER_H
- #include "dctcpserver.h"
- #include <QDebug>
- DCTcpServer::DCTcpServer(QObject *parent) :
- QTcpServer(parent)
- {
- qDebug()<<"server start!";
- client_count=0;
- }
- void DCTcpServer::incomingConnection(int handle)
- {
- client_count++;
- DCSThread *serverThread=new DCSThread(handle,this,client_count);
- connect(serverThread,SIGNAL(finished()),serverThread,SLOT(deleteLater()));
- //thread的信号和server的信号相连
- //connect(serverThread,SIGNAL(createOne(int,QString,QString,QImage)),this,SIGNAL(createOne(int,QString,QString,QImage)));
- serverThread->start();
- }
然后就是界面类中有一个对应的createOne(...)slot。 我已经把signal和slot只定义了,但是 没有使用,但是还是出现这个错误。 其实代码大体上就是普通的,socket类,thread类,server类,界面类,thread的run()中,定义socket,然后 执行。 请大家帮忙,Qt多线程这个错误到底怎么结局?? 谢谢大家!!
|