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重新编辑 ]