| 
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_OBJECTpublic:    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_OBJECTpublic:    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_OBJECTpublic:    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多线程这个错误到底怎么结局?? 谢谢大家!!
 |