• 5993阅读
  • 2回复

[提问]QT4写的通信程序无法传送中文 [复制链接]

上一主题 下一主题
离线pirlo
 
只看楼主 倒序阅读 楼主  发表于: 2011-05-13
— 本帖被 XChinux 从 Qt基础编程 移动到本区(2013-04-01) —
QT4写的通信程序无法传送中文,下面是客户端代码
#include "tcpclient.h"
#include <QtGui/QApplication>
#include <Qt/qtextcodec.h>
int main( int argc, char **argv )
{
QTextCodec::setCodecForTr(QTextCodec::codecForName("GB2312")) ;
QApplication a( argc, argv );
QTranslator translator(0);
translator.load("tcpclient_zh",".");
a.installTranslator(&translator);

TcpClient *tcpclient = new TcpClient();
tcpclient->show();
return a.exec();
}



tcpclient.cpp




#include "tcpclient.h"
TcpClient::TcpClient( QWidget *parent, Qt::WindowFlags f )
: QDialog( parent, f )
{
QFont font("ZYSong18030",12);
setFont(font);

setWindowTitle(tr("TCP Client"));
QVBoxLayout *vbMain = new QVBoxLayout( this );

ListWidgetContent = new QListWidget( this);
vbMain->addWidget( ListWidgetContent );

QHBoxLayout *hb1 = new QHBoxLayout( );

LineEditSend = new QLineEdit(this);
hb1->addWidget( LineEditSend );
PushButtonSend = new QPushButton( this);
PushButtonSend->setText( tr( "发送" ) );
hb1->addWidget( PushButtonSend );
vbMain->addLayout( hb1 );
QHBoxLayout *hb2 = new QHBoxLayout( );
LabelUser = new QLabel( this );
LabelUser->setText(tr("用户姓名:"));
hb2->addWidget( LabelUser );

LineEditUser = new QLineEdit(this);
hb2->addWidget( LineEditUser );
QHBoxLayout *hb3 = new QHBoxLayout( );
LabelServerIP = new QLabel( this );
LabelServerIP->setText(tr("服务器地址:"));
hb3->addWidget( LabelServerIP );

LineEditServerIP = new QLineEdit(this);
hb3->addWidget( LineEditServerIP );

QHBoxLayout *hb4 = new QHBoxLayout( );

LabelPort = new QLabel( this );
LabelPort->setText(tr("端口号:"));
hb4->addWidget( LabelPort );

LineEditPort = new QLineEdit(this);
hb4->addWidget( LineEditPort );

vbMain->addLayout(hb2);
vbMain->addLayout(hb3);
vbMain->addLayout(hb4);

PushButtonEnter = new QPushButton( this);
PushButtonEnter->setText( tr( "进入" ) );
vbMain->addWidget( PushButtonEnter );
connect(PushButtonEnter,SIGNAL(clicked()),this,SLOT(slotEnter()));
connect(PushButtonSend,SIGNAL(clicked()),this,SLOT(slotSend()));
serverIP = new QHostAddress();
port = 8010;
LineEditPort->setText(QString::number(port));

status=false;

PushButtonSend->setEnabled( false );
}
TcpClient::~TcpClient()
{
}

void TcpClient::slotEnter()
{
if(!status)
{
QString ip=LineEditServerIP->text();
if(!serverIP->setAddress(ip))
{
QMessageBox::information(this,tr("error"),tr("server ip address error!"));
return;
}
if(LineEditUser->text()=="")
{
QMessageBox::information(this,tr("error"),tr("用户名错误!"));
return ;
}
userName=LineEditUser->text();

tcpSocket = new QTcpSocket(this);
connect(tcpSocket,SIGNAL(connected()),this,SLOT(slotConnected()));
connect(tcpSocket,SIGNAL(disconnected()),this,SLOT(slotDisconnected()));
connect(tcpSocket, SIGNAL(readyRead()),this, SLOT(dataReceived()));

tcpSocket->connectToHost ( *serverIP, port);

status=true;
}
else
{
int length = 0;

QString msg=userName+tr(":离开聊天室");
if((length=tcpSocket->write(msg.toLatin1(),msg.length()))!=msg.length())
{
return ;
}
tcpSocket->disconnectFromHost();

status=false;
}

}
void TcpClient::slotConnected()
{
int length = 0;
PushButtonSend->setEnabled( true );
PushButtonEnter->setText(tr("Leave"));

QString msg=userName+tr(":进入聊天室");
if((length=tcpSocket->write(msg.toLatin1(),msg.length()))!=msg.length())
{
return ;
}
}
void TcpClient::slotDisconnected()
{
PushButtonSend->setEnabled( false );
PushButtonEnter->setText(tr("Enter"));
}
void TcpClient::slotSend()
{
if(LineEditSend->text()=="")
{
return ;
}

QString msg=userName+":"+LineEditSend->text();

tcpSocket->write(msg.toLatin1(),msg.length());
LineEditSend->clear();
}
void TcpClient::dataReceived()
{
while (tcpSocket->bytesAvailable()>0)
{
QByteArray datagram;
datagram.resize(tcpSocket->bytesAvailable());
QHostAddress sender;

tcpSocket->read(datagram.data(), datagram.size());
QString msg=datagram.data();

ListWidgetContent->addItem (msg.left(datagram.size()));
}
}


tcpclient.h


#ifndef TCPCLIENT_H
#define TCPCLIENT_H
#include <QtGui>
#include <QtNetwork/QtNetwork>
class TcpClient : public QDialog
{
Q_OBJECT
public:
TcpClient( QWidget *parent=0, Qt::WindowFlags f=0 );
~TcpClient();
public:
QListWidget *ListWidgetContent;
QLineEdit* LineEditSend;
QPushButton* PushButtonSend;
QLabel* LabelUser;
QLineEdit* LineEditUser;
QLabel* LabelServerIP;
QLineEdit* LineEditServerIP;
QLabel* LabelPort;
QLineEdit* LineEditPort;
QPushButton* PushButtonEnter;

QString userName;
int port;
QHostAddress *serverIP;
QTcpSocket *tcpSocket;

bool status;
public slots:
void slotEnter();
void slotConnected();
void slotDisconnected();
void slotSend();
void dataReceived();
};

#endif


发送的中文字符就会无法显示,谁能帮我解决一下。我是在XP下编译

[ 此帖被pirlo在2011-05-13 19:19重新编辑 ]
离线dbzhang800

只看该作者 1楼 发表于: 2011-05-13
先搞清楚这样的语句
QString msg=datagram.data();
到底是做什么的(或者做了什么)再说吧。

可以参考:
http://hi.baidu.com/cyclone/blog/item/9d7293130e5a498d6538dbf1.html
离线reynoldxu

只看该作者 2楼 发表于: 2011-05-14
快速回复
限100 字节
 
上一个 下一个