📄 chatform.cpp
字号:
/****************************************************************************** Form implementation generated from reading ui file 'chatform.ui'**** Created by: The User Interface Compiler ($Id: qt/main.cpp 3.3.8 edited Jan 11 14:47 $)**** WARNING! All changes made in this file will be lost!****************************************************************************/#include "chatform.h"#include <qvariant.h>#include <qlabel.h>#include <qpushbutton.h>#include <qtextedit.h>#include <qcombobox.h>#include <qlayout.h>#include <qtooltip.h>#include <qwhatsthis.h>#include <qimage.h>#include <qpixmap.h>#define REMOTE_PORT 6789#define LOCAL_PORT 9875typedef struct user{ char id[15]; char ip[16];}Friend;Friend friends[4];int num=-1;/* * Constructs a chatForm as a child of 'parent', with the * name 'name' and widget flags set to 'f'. * * The dialog will by default be modeless, unless you set 'modal' to * TRUE to construct a modal dialog. */chatForm::chatForm( Socket &s,QWidget* parent, const char* name, bool modal, WFlags fl ) : QDialog( parent, name, modal, fl ),sock(s){ if ( !name ) setName( "chatForm" ); tlable = new QLabel( this, "tlable" ); tlable->setGeometry( QRect( 20, 230, 60, 31 ) ); sendBtn = new QPushButton( this, "sendBtn" ); sendBtn->setGeometry( QRect( 230, 371, 60, 30 ) ); closeBtn = new QPushButton( this, "closeBtn" ); closeBtn->setGeometry( QRect( 330, 370, 61, 31 ) ); chatTxt = new QTextEdit( this, "chatTxt" ); chatTxt->setGeometry( QRect( 10, 10, 391, 210 ) ); chatTxt->setVScrollBarMode( QTextEdit::AlwaysOn ); chatTxt->setHScrollBarMode( QTextEdit::AlwaysOff ); editTxt = new QTextEdit( this, "editTxt" ); editTxt->setGeometry( QRect( 10, 270, 391, 90 ) ); editTxt->setHScrollBarMode( QTextEdit::AlwaysOff ); userlist = new QComboBox( FALSE, this, "userlist" ); userlist->setGeometry( QRect( 80, 230, 131, 31 ) ); languageChange(); resize( QSize(418, 402).expandedTo(minimumSizeHint()) ); clearWState( WState_Polished ); isChat=false; isToQuit=false; isQuited=false; // signals and slots connections //connect( closeBtn, SIGNAL( clicked() ), this, SLOT( close() ) ); connect( closeBtn, SIGNAL( clicked() ), this, SLOT( ToClose() ) ); connect( closeBtn, SIGNAL( clicked() ), chatTxt, SLOT( clear() ) ); connect( this, SIGNAL( IsQuit() ), this, SLOT( close() ) ); connect( sendBtn, SIGNAL( clicked() ), this, SLOT( ChatTo())); connect(this,SIGNAL(toGetUserList()),this,SLOT(GetUserList())); connect(this,SIGNAL(toChat()),this,SLOT(Chat())); connect( sendBtn, SIGNAL( clicked() ), editTxt, SLOT( clear() ) ); connect( sendBtn, SIGNAL( clicked() ), editTxt, SLOT( setFocus() ) ); }/* * Destroys the object and frees any allocated resources */chatForm::~chatForm(){ // no need to delete child widgets, Qt does it all for us}/* * Sets the strings of the subwidgets using the current * language. */void chatForm::languageChange(){ tlable->setText( tr( "Send To->" ) ); sendBtn->setText( tr( "Send" ) ); closeBtn->setText( tr( "Close" ) ); userlist->clear();}bool chatForm::Show(){ show(); emit toGetUserList(); return true; }void chatForm::GetUserList(){ char msg[15]; strcpy(msg,sock.GetMsg()); //msg[strlen(msg)]='\0'; cout<<msg<<endl; if(strncmp(msg,"one",3)) { while(strncmp(msg,"end",3)) { userlist->insertItem(msg); num++; strcpy(friends[num].id,msg); strcpy(msg,sock.GetMsg()); strcpy(friends[num].ip,msg); cout<<msg<<endl; strcpy(msg,sock.GetMsg()); } } this->start();}void chatForm::run(){ sleep(1); int ret; sd=socket(AF_INET,SOCK_DGRAM,0); if(sd<0) _exit(1); fcntl(sd,F_SETFL,O_NONBLOCK); myaddr.sin_family=AF_INET; myaddr.sin_addr.s_addr=htonl(INADDR_ANY); myaddr.sin_port=htons(LOCAL_PORT); ret=bind(sd,(struct sockaddr*) &myaddr,sizeof(myaddr)); if(ret<0) { cout<<"Cann't bind port!"<<endl; _exit(1); } Chat();}void chatForm::UpdateUserList(){ char msg[15]; strcpy(msg,sock.GetMsg()); userlist->insertItem(msg); num++; strcpy(friends[num].id,msg); strcpy(msg,sock.GetMsg()); strcpy(friends[num].ip,msg);}void chatForm::Chat(){ fd_set rfd,wfd,efd; int ret; int sockfd=sock.GetSockfd(); int maxfd=(sd>sockfd? sd: sockfd); struct sockaddr_in remoteaddr; char msg[256]; struct timeval tv; tv.tv_sec=2; tv.tv_usec=400000; while(!isToQuit) { FD_ZERO(&rfd); FD_ZERO(&wfd); FD_ZERO(&efd); FD_SET(sockfd,&rfd); //FD_SET(sockfd,&efd); FD_SET(sd,&rfd); //FD_SET(sd,&efd); if((ret=select(maxfd+1,&rfd,&wfd,&efd,&tv))<0) return; if(FD_ISSET(sockfd,&rfd)) { UpdateUserList(); } if(FD_ISSET(sd,&rfd)) { cout<<"Get Msg"<<endl; int len=sizeof(remoteaddr); int n=recvfrom(sd,msg,256,0,(struct sockaddr*)&remoteaddr,(socklen_t *)&len); msg[strlen(msg)]='\0'; for(int i=0;i<=num;i++) { if(strcmp(friends[i].ip,inet_ntoa(remoteaddr.sin_addr))) continue; chatTxt->append(strcat(strcat(friends[i].id,":\n"),msg)); break; } cout<<"chating...."<<endl; } sleep(1); } sock.CloseSocket(); this->wait();}void chatForm::ChatTo(){ int n=userlist->currentItem (); int rc,i; struct sockaddr_in remoteaddr; struct hostent *h; h=gethostbyname(friends[n].ip); if(h==NULL) QMessageBox::information( this, "IP", "Cann't link to the addr!\n"); cout<<"Chat with"<<inet_ntoa(*(struct in_addr*)h->h_addr_list[0])<<endl; remoteaddr.sin_family=h->h_addrtype; memcpy((char*)&remoteaddr.sin_addr.s_addr,h->h_addr_list[0],h->h_length); remoteaddr.sin_port=htons(REMOTE_PORT); rc=sendto(sd,editTxt->text(),strlen(editTxt->text())+1,0,(struct sockaddr*) &remoteaddr,sizeof(remoteaddr)); if(rc>=0) chatTxt->append(userlist->currentText()+":\n"+editTxt->text());}void chatForm::ToClose(){ isToQuit=true; emit IsQuit(); isQuited=true;}bool chatForm::IsQuited(){ return isToQuit;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -