获取消息数量 int Getmessagenum(); 获取系统消息数量 int Getsysnum(); 获取系统消息
message Getsysmessage(string recvername); 获取当前时间
char* currenttime(char* curtime, const char* format); 添加日志
void writelog(string s); 用户在线 int Loginser(string name); 离线用户 int Logoutser(string name);
23
4.4 客户端图形界面详细设计
即时通信软件的客户端是使用图形用户界面来实现的,程序运行后激活主窗体,在主窗体上点击设置为敏感状态的按钮就会产生相应的事件,该事件将会触发一个消息驱动所指定的函数来处理这个操作。
本软件使用QT图形界面来实现,其具有以下优点:
面向对象:Qt 的良好封装机制使得 Qt 的模块化程度非常高,可重用性较好,对于用户开发来说是非常 方便的。Qt 提供了一种称为signals/slots 的安全类型来替代 callback,这使得各个元件之间的协同工作变得十分简单;
丰富的API:Qt包括多达 250个以上的 C++ 类,还提供基于模板的 collections, serialization, file, I/O device, directory management, date/time 类。
登陆界面的设计是整个客户端的切入点,客户端的整个设计都是在图形界面下完成的。
图形用户界面或图形用户接口(Graphical User Interface,GUI)是指采用图形方式显示的计算机操作环境用户接口。与早期计算机使用的命令行界面相比,图形界面对于用户来说更为简便易用。GUI的广泛应用是当今计算机发展的重大成就之一,它极大地方便了非专业用户的使用人们从此不再需要死记硬背大量的命令,取而代之的是可用通过窗口、菜单、按键等方式来方便地进行操作。而嵌入式GUI具有下面几个方面的基本要求:轻型、占用资源少、高性能、高可靠性、便于移植、可配置等特点。
图形界面稳定实用是前提,在稳定的前提下要力求做好美观,简洁,客户端通过创建图形界面,并通过代理调用服务器中的接口,再运用QT的机制,通过点击按钮等方式获取相应响应,从而实现相应操作。
24
4.4.1 连接窗体
1、连接窗体:用以实现客户端和服务器的连接。
在连接窗体中,有两个Button(按钮(下同))和两个LineEdit。 IP对应的LineEdit响应SaveIp函数,用以保存Ip地址。 其实现如下:
void MainWindow::SaveIp() {
QString qip;
qip.append(ui->text1->text()); serip= qip.toStdString(); }
Port对应的LineEdit响应SavePort函数,用以保存Port号。 其实现如下:
void MainWindow::SavePort() {
QString qip;
qip.append(ui->text2->text()); serport= qip.toStdString(); }
?OK?按钮响应响应Loginuser函数,目的是登陆服务器。 其实现如下:
funcppPrx MainWindow::getfuncpp() {
Ice::CommunicatorPtr ic; try {
ic = Ice::initialize();
Ice::PropertiesPtr props = ic->getProperties();
25
string configfile = CONFIG_FILE; props->load(configfile); string str=\
if (serip==\\
cout< Ice::ObjectPrx base = ic->stringToProxy(str); funcppPrx cbrx = funcppPrx::checked Cast(base); return cbrx; } catch (const Ice::Exception & ex) { car << ex << endl; } catch (const char * mug) { car << mug << endl; } if (ic) ic->destroy(); } 同时,若连接服务器成功,还应弹出新窗口。 其实现如下: void MainWindow::Loginuser() { MainWindow::close(); if (serip.size()==0) { QMessageBox::about(NULL, \default\ if (serport.size()==0) {QMessageBox::about(NULL, \20000\ loginusr.usrip=serip; loginusr.usrport=serport; icefun=getfuncpp(); loginusr.loginicefun=icefun; 26

