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