以前写的一篇日志,不小心删了,竟然没得恢复。万恶的CSDN,重排版。
第一个写的软件。基本上还是很粗糙,而且代码也大多不是自己写的,不过也着实让我过了一把瘾。接下来简单地讲讲整个过程和学到的东西吧。
首先是软件的框架,自己主观地YY了很久,因为之前没有相关的经验,所以好多东西都一厢情愿地想当然了,以至于到真正动手的时候才恨不得一掌劈死自己。
(以下此段是自我YY,可跳过)我想像中的框架应该是首先有一个自定义类,暂且管它叫freeTalk类(实际上我也是这么命名的,汗),它主要负责完成局域网内在线用户列表的获取更新等。另外有一个类叫chat,用于用户间的即时通讯,也就是发发文字信息。还有一个类用于文件传输,它老人家叫transmission,传责完成文件的传输。
然后我就天真地开始工作了,首先是啃Qt的书,《C++ GUI Qt4编程》这本书还不错,虽然我到目前为止只看了几章。为了比较了解网络方面的协议什么的,还看了一些《UNIX网络编程 卷1》和计算机网络(结果发现没啥作用)。
先是在XP下安装Qt4,之前只有fedora16下面装过,都是用yum直接搞定的。。。这真是一个漫长的过程,被虐死了好几次。最后总结到的方法是:
1、下载mingw.rar,qt-win-opensource-4.8.4-mingw.exe和qt-creator-windows-opensource-2.7.1.exe,不要问我从哪里下的,因为我也忘了,还有这个是用Qt Creator集成开发环境进行开发的环境搭建,其他的像VS 2008、eclipse什么的请参考别的;
2、解压mingw.rar到D盘(当然也可以到别的盘,自己喜欢),安装qt-win-opensource-4.8.4-mingw.exe,过程中指定mingw文件夹,安装qt-creator-windows-opensource-2.7.1.exe;
3、打开Qt Creator,找到工具->选项,配置如下图所示:
4、配置环境变量(不知道是不是必要),我的电脑 》》属性 》》高级 》》环境变量 》》系统变量 》》Path,编辑,增加D:\Qt\bin\;D:\mingw\bin\(相对于安装目录而言),另外有一点值得注意的是,这货在windows下好像不能支持中文路径,所以项目不要创建在中文路径下,不然会出错。
然后可以开始了,创建项目,添加文件等等东西就不说了。总的来说实际做出来的东西分4个类,一个主窗口freeTalk类,一个聊天窗口chat类,一个tcpClient类,一个tcpServer类,像我YY的结果,不过文件传输被拆成了两半。实际的效果图如下所示:
整个过程中我觉得比较有意思的几个地方是:
1、要怎么实现按下Enter按键发送信息呢?一开始我觉得只要把sendButton的设置autoDefault属性即可,不过没成功,我想了一下可能的原因是焦点设在了textEdit上,没有求证过,原谅我这个初学者吧,后来还找到一个办法,就是用textChange信号来捕捉‘\n’换行符,然后直接调用on_sendButton_clicked()槽(原来槽还可以直接调用),不过这种方法缺点是会连‘\n’一起在内容被发送显示。所以最后找到了一个方案,如下:
boolchat::eventFilter(QObject*target,QEvent*event)
{
if(target==inputEdit)
{
if(event->type()==QEvent::KeyPress)
{
QKeyEvent*k=static_cast<QKeyEvent*>(event);
if(k->key()==Qt::Key_Return)
{
on_sendButton_clicked();
returntrue;
}
}
}
returnQWidget::eventFilter(target,event);
}
用一个事件过滤器,来捕获键盘输入事件,圆满解决。
2、对于要使用到的图片什么的,要先载入资源文件中,背景图片可以jpg格式的,作为一些控件的图标需要是png格式的。还有应用程序的图标是ico格式的,设置应用程序图标的步骤如下:
首先准备个ICO图标。例如:myappico.ico;用记事本新建个文件,里面就写一行:IDI_ICON1 ICON DISCARDABLE "myappico.ico"
保存改名为 myapp.rc并把它和你的图标myappico.ico一起复制到你的QT工程项目的目录。用记事本打开你的QT工程文件(如 "myapp.pro" ),在里面最后新添一行:RC_FILE = myapp.rc
3、每次创建聊天窗口之后,假如用close()关闭,因为chat是作为freeTalk的子窗口,所以实际上该部分内存还没有释放的,窗口只是隐藏了起来,只有等父窗口退出后才会释放。以下是从Qt Creator帮助中看到的一段:First it sends the widget a QCloseEvent.The widget is hidden if it accepts the close event. If it ignores the event,nothing happens. 当然也有可能是我误解了,毕竟我只是个菜鸟。所以为了保险起见,我每次都特地捕获这个事件,然后显式释放掉内存;
4、比起在构造函数中设置背景图片,在Qt Designer里用修改样式表来得更好一些,因为就填充来说,假如用了圆角控件的话,前者可能会出现填充不完整的现象,不过这只是个人的使用经验而已;
5、关于字体的事一直没弄明白,总是显示乱码,最后用一句:
QTextCodec::setCodecForTr(QTextCodec::codecForName("utf-8"));
就好了,windows不是说好的用GB2312的吗,节操呢?
6、关于发布,静态编译各说各话,都不知道该相信谁了,最后没辄,弄个动态编译,于是就拖家带口200多个M的dll文件一起吧,相对于静态编译的麻烦来说我还是不介意的。值得说一下的是VS2008有个工具叫depends的软件还挺好用的,可以用来检测依赖关系,看看到底需要哪些动态链接库,再包含到工程目录下就行了。
大概就这么多吧,其他有一些遇到的问题都忘了,毕竟是三个星期前做的东西,下次要及时点做个总结才行。