﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-&lt;a href="http://cppblog.com/jianc/"&gt;jianc's blog&lt;/a&gt;-随笔分类-Qt</title><link>http://www.cppblog.com/jianc/category/19742.html</link><description>&lt;script type="text/javascript"&gt;
    function OnClient(){
        var tmp = 1;
        var tmp2 = 2;
        var sum = tmp + tmp2;

        alert(sum);
    }
&lt;/script&gt;</description><language>zh-cn</language><lastBuildDate>Fri, 14 Dec 2012 01:28:43 GMT</lastBuildDate><pubDate>Fri, 14 Dec 2012 01:28:43 GMT</pubDate><ttl>60</ttl><item><title>Qt 搭建c/s框架总结</title><link>http://www.cppblog.com/jianc/archive/2012/08/08/186661.html</link><dc:creator>jianc</dc:creator><author>jianc</author><pubDate>Wed, 08 Aug 2012 08:07:00 GMT</pubDate><guid>http://www.cppblog.com/jianc/archive/2012/08/08/186661.html</guid><wfw:comment>http://www.cppblog.com/jianc/comments/186661.html</wfw:comment><comments>http://www.cppblog.com/jianc/archive/2012/08/08/186661.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jianc/comments/commentRss/186661.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jianc/services/trackbacks/186661.html</trackback:ping><description><![CDATA[<div>Qt 搭建c/s框架总结<br /><br />一 服务端<br />使用QTcpServer类<br />QTcpServer *tcpServer = new QTcpServer(this);<br />开启监听<br />tcpServer-&gt;listen(QHostAddress::LocalHost, port);&nbsp;&nbsp; &nbsp;//port为端口号<br />如果监听失败, 请查看tcpServer-&gt;errorString();<br />可以连接tcpServer对象的newConnection信号, 这样一有客户端连接上来, 就可以调用我们的连接槽进行处理<br />connect(tcpServer, SIGNAL(newConnection), this, SLOT(slotNewClientConnect()));<br /><br />当断开监听时, 可以先判断单前是否在监听<br />tcpServer-&gt;isListening(), 若果是, 则调用tcpServer-&gt;close();关闭监听<br /><br />当客户端连接上来的时候, 可以调用tcpServer-&gt;nextPendingConnection();来允许客户端连接, 并返回客户端的socket对象<br />可以对连接上来的socket对象进行信号-槽关联, 这样就可以对这个客户端的socket对象进行更多的控制<br /><br /><br /><br />二 客户端<br />使用QTcpSocket对象连接到服务器<br />QTcpSocket *tcpSocket = new QTcpSocket(this);<br />tcpSocket-&gt;abort();&nbsp;&nbsp; &nbsp;//取消已有的连接<br />tcpSocket-&gt;connectToHost(服务器ip, 服务器端口);<br />可以关联tcpSocket的error信号, 这样连接失败时候就可以得到通知了<br />可以关联tcpSocket的readyRead()信号, 这样接收到数据时候也可以得到通知了<br />同样connected()信号提示已成功连接到服务端<br />disconnected()信号提示已经断开连接, 可以关联到该对象的deleteLater()槽上删除连接(服务端)<br /><br /><br />这样, 只要得到通讯的socket对象, 关联一下readyRead()信号就可以读取连接端发送过来的数据, 写的话直接调用write方法即可<br /><br /><br />写数据发送可以用QByteArray和QDataStream进行操作:<br />QDataStream对象可以对QByteArray对象进行读写操作<br />比如：<br />QByteArray block;<br />QDataStream out(&amp;block, QIODevice::WriteOnly);<br />out.setVersion(QDataStream::Qt_4_0);&nbsp;&nbsp; &nbsp;//要设置版本, 版本号要和接受端读取版本号一致<br />out &lt;&lt; (quint16)0; //写要发送数据的长度, 这里先用0写前面两个字节占位, 后面再补上来<br />out &lt;&lt; tr("发送的数据");<br />out.device()-&gt;seek(0);&nbsp;&nbsp; &nbsp;//又跳到缓冲区的开头, 准备些数据包的长度<br />out &lt;&lt; (quint16)(block.size() - sizeof(quint16));<br />然后使用连接套接字对象 conObj-&gt;write(QByteArray对象); 这样就把数据发送出去了, 如<br />conObj-&gt;write(block);<br /><br /><br />读取连接端发送过来的数据<br />同样用QDataStream来处理:<br />QDataStream in(连接端套接字对象);<br />in.setVersion(QDataStream::Qt_4_0);&nbsp;&nbsp; &nbsp;//要和发送端的版本号一致<br /><br />qint16 blockSize = 0; //初始化0<br /><br />if(0 == blockSize)<br />{<br />&nbsp;&nbsp;&nbsp; if(conSocket-&gt;bytesAvailable() &lt; (int)sizeof(quint16)) //如果已经接收到的数据小于2个字节, <br />&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //说明数据还没接收完，直接退出，等待数据接收完全<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; in &gt;&gt; bIockSize; //保存数据包大小(两个字节)<br />}<br />if(conSocket-&gt;bytesAvailable() &lt; blockSize)<br />{//接收到的数据不完全<br />&nbsp;&nbsp;&nbsp; return;<br />}<br />in &gt;&gt; message; //QString message; 把接收到的数据存放到message对象里面<br />这样就ok了<br /><br /><br />//取得本地ip地址信息<br />QString localHostName = QHostInfo::localHostName();<br />&nbsp;&nbsp;&nbsp; QHostInfo info = QHostInfo::fromName(localHostName);<br />&nbsp;&nbsp;&nbsp; qDebug() &lt;&lt; "localHostName:" &lt;&lt; localHostName &lt;&lt; endl<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;&lt; "IP Address:" &lt;&lt; info.addresses();<br /><br /><br /><br /><br /></div><img src ="http://www.cppblog.com/jianc/aggbug/186661.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jianc/" target="_blank">jianc</a> 2012-08-08 16:07 <a href="http://www.cppblog.com/jianc/archive/2012/08/08/186661.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Qt笔记</title><link>http://www.cppblog.com/jianc/archive/2012/08/04/186237.html</link><dc:creator>jianc</dc:creator><author>jianc</author><pubDate>Sat, 04 Aug 2012 02:30:00 GMT</pubDate><guid>http://www.cppblog.com/jianc/archive/2012/08/04/186237.html</guid><wfw:comment>http://www.cppblog.com/jianc/comments/186237.html</wfw:comment><comments>http://www.cppblog.com/jianc/archive/2012/08/04/186237.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jianc/comments/commentRss/186237.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jianc/services/trackbacks/186237.html</trackback:ping><description><![CDATA[由于工作需要, 开始学习Qt. 这里记下一些笔记, 方便以后查阅(随时更新).<br /><br />1.用Qt Creator创建一个基于GUI的应用程序, 选择基类有QWidget, QDialog, QMainWindow三种. 发现一个问题, 当选择用QWidget, QDialog时, 可以直接在派生类的构造函数里创建控件添加到布局管理器对象, 然后调用setLayout(布局管理器对象)就可以在界面显示创建好的控件了; 然而选用QMainWindow作为基类的时候, 这样操作却没有显示出控件来. 经过百度, 发现原来派生类还要创建一个QWidget对象, 把布局管理器放到这个QWidget对象上面, 然后把这个QWidget对象作为参数调用setCentralWidget就可以正常显示控件了.<br /><br />2.解决Qt中显示中文乱码的方法, 这里直接添加两个方法的调用:<br /><div><span style=" color:#800080;"></span><div><span style=" color:#800080;">QTextCodec</span><span style=" color:#000000;">::</span>setCodecForTr<span style=" color:#000000;">(</span><span style=" color:#800080;">QTextCodec</span><span style=" color:#000000;">::</span>codecForLocale<span style=" color:#000000;">());</span> <pre style="margin: 0px; text-indent: 0px;"><span style=" color:#800080;">QTextCodec</span><span style=" color:#000000;">::</span>setCodecForCStrings<span style=" color:#000000;">(</span><span style=" color:#800080;">QTextCodec</span><span style=" color:#000000;">::</span>codecForLocale<span style="color: #000000;">());<br /><br />3.窗口样式<br /><div><span style="color: #008000;">setWindowFlags(Qt::FramelessWindowHint); //去掉窗口边框标题</span></div><br />4.md5加密<br /><div>Qt中使用MD5加密<br />QCryptographicHash test(QCryptographicHash::MD5);<br />QByteArray data;<br />data.append(tr("test"));<br />test.addData(data);<br />QByteArray result = test.result();<br /><br />result.toBase64(); //密文用base64编码<br />result.toHex(); //用16进制显示数据<br /><br />5.使用多线程<br />继承QThread, 重写run虚方法, 如果使用线程事件循环, 在run里面使用QObject对象并用connect关联信号, 需要在构造函数里调用<div>moveToThread<span style=" color:#000000;">(</span><span style=" color:#808000;">this</span><span style=" color:#000000;">);否则slots槽还是在主调线程中被调用而不是在新创建的线程中执行的.<br /><br />6.<div>wchar_t* 转QString<br /><br />wchar_t* wptr = L"test";<br />QString ret = QString::fromWCharArray(wptr);<br />QString ret2 = QString((QChar*)wptr, wcslen(wptr));<br /><br />QString 转wchar_t*<br />wchar_t szBuf[1024];<br />QString str = tr("hello");<br />wcscpy_s(reinterpret_cast&lt;wchar_t*&gt;(szBuf),<br />    sizeof(szBuf) / sizeof(wchar_t),<br />    reinterpret_cast&lt;const wchar_t*&gt;(str.utf16()));<br /><br />7.<br /><div>QTreeView 设置列宽度固定<br />QTreeView()::header()-&gt;setResizeMode(QHeaderView::Fixed);<br /><br />8.对话框屏幕居中显示<br /><div><span style=" color:#800080;">quint32</span> <span style=" color:#000000;">scrwidth</span> <span style=" color:#000000;">=</span> <span style=" color:#800080;">QApplication</span><span style=" color:#000000;">::</span>desktop<span style=" color:#000000;">()-&gt;</span>width<span style=" color:#000000;">();</span> <pre style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> <span style=" color:#800080;">quint32</span> <span style=" color:#000000;">scrheight</span> <span style=" color:#000000;">=</span> <span style=" color:#800080;">QApplication</span><span style=" color:#000000;">::</span>desktop<span style=" color:#000000;">()-&gt;</span>height<span style=" color:#000000;">();</span></pre> <pre style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> <span style=" color:#800080;">quint32</span> <span style=" color:#000000;">width</span> <span style=" color:#000000;">=</span> <span style=" color:#808000;">this</span><span style=" color:#000000;">-&gt;</span>width<span style=" color:#000000;">();</span></pre> <pre style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> <span style=" color:#800080;">quint32</span> <span style=" color:#000000;">height</span> <span style=" color:#000000;">=</span> <span style=" color:#808000;">this</span><span style=" color:#000000;">-&gt;</span>height<span style=" color:#000000;">();</span></pre> <pre style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> <span style=" color:#808000;">this</span><span style=" color:#000000;">-&gt;</span>move<span style=" color:#000000;">((</span><span style=" color:#000000;">scrwidth</span> <span style=" color:#000000;">-</span> <span style=" color:#000000;">width</span><span style=" color:#000000;">)</span> <span style=" color:#000000;">/</span> <span style=" color:#000080;">2</span><span style=" color:#000000;">,</span> <span style=" color:#000000;">(</span><span style=" color:#000000;">scrheight</span> <span style=" color:#000000;">-</span> <span style=" color:#000000;">height</span><span style=" color:#000000;">)</span> <span style=" color:#000000;">/</span> <span style=" color:#000080;">2</span><span style=" color:#000000;">);<br /><br />9.发送信号的时候, 一些类型作为参数, 需要注册:<br /></span></pre><div><span style=" color:#800080;">Q_DECLARE_METATYPE(类名)</span></div><div>qRegisterMetaType<span style=" color:#000000;">&lt;类名</span><span style=" color:#000000;">&gt;(</span><span style=" color:#008000;">"类名"</span><span style=" color:#000000;">);</span></div>类名也可以是结构体等其他结构<br /><br /><pre style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">10.rcc资源文件<br />bin目录下有个rcc.exe工具, 可以吧qrc脚本编译成rcc资源2进制文件, 命令如下:<br />rcc -binary xxx.qrc -o xxx.rcc<br /><br />在程序中引用这个rcc资源文件:<br />QResource::registerResource("xxx.rcc");<br />卸载<br />QResource::unregisterResource("xxx.rcc")<br /><br /><br /></pre></div></div></div><br /></span></div></div><br /></span></pre></div><pre style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" color:#000000;"></span></pre></div><img src ="http://www.cppblog.com/jianc/aggbug/186237.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jianc/" target="_blank">jianc</a> 2012-08-04 10:30 <a href="http://www.cppblog.com/jianc/archive/2012/08/04/186237.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Qt gif动画</title><link>http://www.cppblog.com/jianc/archive/2012/07/31/185717.html</link><dc:creator>jianc</dc:creator><author>jianc</author><pubDate>Tue, 31 Jul 2012 01:27:00 GMT</pubDate><guid>http://www.cppblog.com/jianc/archive/2012/07/31/185717.html</guid><wfw:comment>http://www.cppblog.com/jianc/comments/185717.html</wfw:comment><comments>http://www.cppblog.com/jianc/archive/2012/07/31/185717.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jianc/comments/commentRss/185717.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jianc/services/trackbacks/185717.html</trackback:ping><description><![CDATA[<div>Qt可以用QLabel和QMovie显示gif动画<br /><br /><br />QMovie *obj = new QMovie("xxx.gif");<br />labObj-&gt;setMovie(obj);<br />obj-&gt;start();</div><img src ="http://www.cppblog.com/jianc/aggbug/185717.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jianc/" target="_blank">jianc</a> 2012-07-31 09:27 <a href="http://www.cppblog.com/jianc/archive/2012/07/31/185717.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>