<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>GuoJing&#039;s Blog &#124; 献给未来的回忆 &#187; QT</title>
	<atom:link href="http://www.jguoer.com/blog/index.php/archives/category/qt/feed" rel="self" type="application/rss+xml" />
	<link>http://www.jguoer.com/blog</link>
	<description>献给未来的回忆</description>
	<lastBuildDate>Thu, 02 Feb 2012 16:00:40 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Qt &#8211; 编写窗口</title>
		<link>http://www.jguoer.com/blog/index.php/archives/191</link>
		<comments>http://www.jguoer.com/blog/index.php/archives/191#comments</comments>
		<pubDate>Sun, 03 Jan 2010 05:45:00 +0000</pubDate>
		<dc:creator>诡异的西红柿</dc:creator>
				<category><![CDATA[QT]]></category>
		<category><![CDATA[开发]]></category>
		<category><![CDATA[编写窗口]]></category>

		<guid isPermaLink="false">/post/2010/01/03/Qt-Wrote-A-Window.aspx</guid>
		<description><![CDATA[<p>在Qt中我们可以很容易的用C++做UI，还可以制作窗口，但是我们还需要自己为相应的窗口编写类和对象，例如我有一个很简单的需求，就是打开菜单栏然后弹出一个新窗口，在VC里可能比较麻烦，但是在Qt里面还是很容易的，我们只需要几个步骤就能够写一个新窗口，而UI可以直接使用<a href="http://www.jguoer.com/post/2009/07/31/Qt-Design-With-QCSS.aspx">CSS的思想方式</a>去做设计。</p>
<p>首先我们可以用设计器设计一个窗体如下。我们可以新建一个名称为author的ui文件，这样我们就能够使用设计器设计窗体了。</p>
<p style="text-align: center;"><img alt="" src="/blog/wp-content/uploads/2010/1/pic1.png" /></p>
<p>我们设计完成后，就需要编写类来实现这个窗口的实例，首先我们是打开菜单栏来打开的，操作如下（MainWindow的设计我就不写了）。</p>
<p style="text-align: center;"><img src="/blog/wp-content/uploads/2010/1/pic2.png" alt="" /></p>
<p>当我们点击了Author的时候，会打开我们的作者窗体，我们可以在MainWindow下写上如下代码。</p>
<div class="code">
<div><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> MainWindow::OpenAuthorWindow() <br />
{ <br />
&#160;&#160;&#160;&#160;AuthorWindow </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">authorWindow </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> AuthorWindow(); <br />
&#160;&#160;&#160;&#160;authorWindow</span><span style="color: rgb(0, 0, 0);">-&#62;</span><span style="color: rgb(0, 0, 0);">show(); <br />
}</span></div>
</div>
<p>上面的代码就是打开AuthorWindow，逻辑很简单，就不多说了。我们现在就写一个实例类的代码。</p>
<p>创建authorwindow.h头文件并编写如下代码，为何这样写我已经写在注释里了。</p>
<div class="code">
<div><span style="color: rgb(0, 0, 0);">#ifndef AUTHORWINDOW_H <br />
</span><span style="color: rgb(0, 0, 255);">#define</span><span style="color: rgb(0, 0, 0);"> AUTHORWINDOW_H</span><span style="color: rgb(0, 0, 0);"> <br />
</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">窗体继承自QDialog</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">#include </span><span style="color: rgb(0, 0, 0);">&#60;</span><span style="color: rgb(0, 0, 0);">QDialog</span><span style="color: rgb(0, 0, 0);">&#62;</span><span style="color: rgb(0, 0, 0);"> <br />
</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">使用在Ui类中的Dialog类 <br />
</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">具体可以看生成的ui_author.h</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 255);">namespace</span><span style="color: rgb(0, 0, 0);"> Ui <br />
{ <br />
&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> Dialog; <br />
} <br />
</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">写构造函数和析构函数</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> AuthorWindow:</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> QDialog <br />
{ <br />
</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">: <br />
&#160;&#160;&#160;&#160;AuthorWindow(QWidget </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">parent</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(128, 0, 128);">0</span><span style="color: rgb(0, 0, 0);">); <br />
&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 0, 0);">~</span><span style="color: rgb(0, 0, 0);">AuthorWindow(); <br />
</span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);">: <br />
&#160;&#160;&#160; </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">私有的窗体对象 <br />
&#160;&#160;&#160; </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">我们在代码中会通过该对象操作窗体元素</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">&#160;&#160;&#160;&#160;Ui::Dialog </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">ui; <br />
}; <br />
<br />
</span><span style="color: rgb(0, 0, 255);">#endif</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> AUTHORWINDOW_H</span></div>
</div>
<p>写完了头文件之后，我们就需要写实例的文件。实例类文件不是很难，但是要注意构造函数的写法。&#160;</p>
<div class="code">
<div><span style="color: rgb(0, 0, 0);">#include </span><span style="color: rgb(128, 0, 0);">&#34;</span><span style="color: rgb(128, 0, 0);">authorwindow.h</span><span style="color: rgb(128, 0, 0);">&#34;</span><span style="color: rgb(0, 0, 0);"> <br />
#include </span><span style="color: rgb(128, 0, 0);">&#34;</span><span style="color: rgb(128, 0, 0);">ui_author.h</span><span style="color: rgb(128, 0, 0);">&#34;</span><span style="color: rgb(0, 0, 0);"> <br />
</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">构造函数</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">AuthorWindow::AuthorWindow(QWidget </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">parent) : <br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;QDialog(parent), <br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;ui(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Ui::Dialog) <br />
{ <br />
</span><span style="color: rgb(0, 128, 0);">&#160;&#160;&#160; //</span><span style="color: rgb(0, 128, 0);">初始化UI</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">&#160;&#160;&#160;&#160;ui</span><span style="color: rgb(0, 0, 0);">-&#62;</span><span style="color: rgb(0, 0, 0);">setupUi(</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">); <br />
} <br />
<br />
AuthorWindow::</span><span style="color: rgb(0, 0, 0);">~</span><span style="color: rgb(0, 0, 0);">AuthorWindow() <br />
{ <br />
&#160;&#160;&#160;&#160;delete ui; <br />
}</span></div>
</div>
<p>上面的代码很简单，这样我们就给我们的窗体编写了一个实例的类，这里有几点是要注意的。</p>
<ol>
    <li>在编写头文件的时候，要写一个命名空间为UI的命名空间，其中的类名字要和设计器生成的代码的类名相同。</li>
    <li>窗体的实例类需要一个内部的ui的私有变量，或者叫任何名字都行，但是需要一个操作内部的UI的对象。</li>
    <li>2中的ui对象必须是1中的命名空间的Wrapper类的实例。</li>
</ol>
<p>上面的这三点还需要自己去看代码，否则刚刚上手还是会比较难理解。</p>
<p><a href="/blog/wp-content/uploads/2010/1/HelloChan.zip">HelloChan.zip (274.67 kb)</a></p>]]></description>
			<content:encoded><![CDATA[<p>在Qt中我们可以很容易的用C++做UI，还可以制作窗口，但是我们还需要自己为相应的窗口编写类和对象，例如我有一个很简单的需求，就是打开菜单栏然后弹出一个新窗口，在VC里可能比较麻烦，但是在Qt里面还是很容易的，我们只需要几个步骤就能够写一个新窗口，而UI可以直接使用<a href="http://www.jguoer.com/post/2009/07/31/Qt-Design-With-QCSS.aspx">CSS的思想方式</a>去做设计。</p>
<p>首先我们可以用设计器设计一个窗体如下。我们可以新建一个名称为author的ui文件，这样我们就能够使用设计器设计窗体了。</p>
<p style="text-align: center;"><img alt="" src="/blog/wp-content/uploads/2010/1/pic1.png" /></p>
<p>我们设计完成后，就需要编写类来实现这个窗口的实例，首先我们是打开菜单栏来打开的，操作如下（MainWindow的设计我就不写了）。</p>
<p style="text-align: center;"><img src="/blog/wp-content/uploads/2010/1/pic2.png" alt="" /></p>
<p>当我们点击了Author的时候，会打开我们的作者窗体，我们可以在MainWindow下写上如下代码。</p>
<div class="code">
<div><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> MainWindow::OpenAuthorWindow() <br />
{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;AuthorWindow </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">authorWindow </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> AuthorWindow(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;authorWindow</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">show(); <br />
}</span></div>
</div>
<p>上面的代码就是打开AuthorWindow，逻辑很简单，就不多说了。我们现在就写一个实例类的代码。</p>
<p>创建authorwindow.h头文件并编写如下代码，为何这样写我已经写在注释里了。</p>
<div class="code">
<div><span style="color: rgb(0, 0, 0);">#ifndef AUTHORWINDOW_H <br />
</span><span style="color: rgb(0, 0, 255);">#define</span><span style="color: rgb(0, 0, 0);"> AUTHORWINDOW_H</span><span style="color: rgb(0, 0, 0);"> <br />
</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">窗体继承自QDialog</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">#include </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">QDialog</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"> <br />
</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">使用在Ui类中的Dialog类 <br />
</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">具体可以看生成的ui_author.h</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 255);">namespace</span><span style="color: rgb(0, 0, 0);"> Ui <br />
{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> Dialog; <br />
} <br />
</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">写构造函数和析构函数</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> AuthorWindow:</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> QDialog <br />
{ <br />
</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">: <br />
&nbsp;&nbsp;&nbsp;&nbsp;AuthorWindow(QWidget </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">parent</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(128, 0, 128);">0</span><span style="color: rgb(0, 0, 0);">); <br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0);">~</span><span style="color: rgb(0, 0, 0);">AuthorWindow(); <br />
</span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);">: <br />
&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">私有的窗体对象 <br />
&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">我们在代码中会通过该对象操作窗体元素</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;Ui::Dialog </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">ui; <br />
}; </p>
<p></span><span style="color: rgb(0, 0, 255);">#endif</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> AUTHORWINDOW_H</span></div>
</div>
<p>写完了头文件之后，我们就需要写实例的文件。实例类文件不是很难，但是要注意构造函数的写法。&nbsp;</p>
<div class="code">
<div><span style="color: rgb(0, 0, 0);">#include </span><span style="color: rgb(128, 0, 0);">&quot;</span><span style="color: rgb(128, 0, 0);">authorwindow.h</span><span style="color: rgb(128, 0, 0);">&quot;</span><span style="color: rgb(0, 0, 0);"> <br />
#include </span><span style="color: rgb(128, 0, 0);">&quot;</span><span style="color: rgb(128, 0, 0);">ui_author.h</span><span style="color: rgb(128, 0, 0);">&quot;</span><span style="color: rgb(0, 0, 0);"> <br />
</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">构造函数</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">AuthorWindow::AuthorWindow(QWidget </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">parent) : <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QDialog(parent), <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ui(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Ui::Dialog) <br />
{ <br />
</span><span style="color: rgb(0, 128, 0);">&nbsp;&nbsp;&nbsp; //</span><span style="color: rgb(0, 128, 0);">初始化UI</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;ui</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">setupUi(</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">); <br />
} </p>
<p>AuthorWindow::</span><span style="color: rgb(0, 0, 0);">~</span><span style="color: rgb(0, 0, 0);">AuthorWindow() <br />
{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;delete ui; <br />
}</span></div>
</div>
<p>上面的代码很简单，这样我们就给我们的窗体编写了一个实例的类，这里有几点是要注意的。</p>
<ol>
<li>在编写头文件的时候，要写一个命名空间为UI的命名空间，其中的类名字要和设计器生成的代码的类名相同。</li>
<li>窗体的实例类需要一个内部的ui的私有变量，或者叫任何名字都行，但是需要一个操作内部的UI的对象。</li>
<li>2中的ui对象必须是1中的命名空间的Wrapper类的实例。</li>
</ol>
<p>上面的这三点还需要自己去看代码，否则刚刚上手还是会比较难理解。</p>
<p><a href="/blog/wp-content/uploads/2010/1/HelloChan.zip">HelloChan.zip (274.67 kb)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.jguoer.com/blog/index.php/archives/191/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>马克一下Ubuntu下Netbeans,Qt环境配置</title>
		<link>http://www.jguoer.com/blog/index.php/archives/308</link>
		<comments>http://www.jguoer.com/blog/index.php/archives/308#comments</comments>
		<pubDate>Tue, 04 Aug 2009 10:43:00 +0000</pubDate>
		<dc:creator>诡异的西红柿</dc:creator>
				<category><![CDATA[QT]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[开发]]></category>
		<category><![CDATA[配置]]></category>

		<guid isPermaLink="false">/post/2009/08/04/Ubuntu-Netbeans-Qt-Install.aspx</guid>
		<description><![CDATA[<p>今天弄了一天Ubuntu下面的开发环境，首先是做Firefox开发，肯定少不了Netbeans，所以就在网上下载了一个Netbeans，Netbeans是很好下载，可惜不好配置，也没什么错误提示，安装Netbeans的时候，首先要安装JDK，<a href="http://java.sun.com/javase/downloads/index.jsp">JDK可以在这里下载</a>，下载完了之后我们到这个目录下面执行一下命令行。</p>
<div class="code">
<div><span style="color: rgb(0, 0, 0);">sudo chmod </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">x jdk-</span><span style="color: rgb(0, 0, 0);">6</span><span style="color: rgb(0, 0, 0);">-linux-i586</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);">bin <br />
sudo </span><span style="color: rgb(0, 0, 0);">./</span><span style="color: rgb(0, 0, 0);">jdk-</span><span style="color: rgb(0, 0, 0);">6</span><span style="color: rgb(0, 0, 0);">-linux-i586</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);">bin </span></div>
</div>
<p>上面的第一句是给这个文件执行的权限，下面就是执行这个文件了，在安装好了JDK之后我们双击Netbeans就可以安装了，当然也可以直接在命令行里面安装。当然，在这之前不要忘记配置环境变量了。我们可以修改一下profile文件。 </p>
<div class="code">
<div><span style="color: rgb(0, 0, 0);">sudo gedit </span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">etc</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">profile <br />
</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">然后在文件里面添加，这里不是代码</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">export JAVA_HOME</span><span style="color: rgb(0, 0, 0);">=/</span><span style="color: rgb(0, 0, 0);">opt</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">jdk1.</span><span style="color: rgb(128, 0, 128);">6.0</span><span style="color: rgb(0, 0, 0);"> <br />
export JRE_HOME</span><span style="color: rgb(0, 0, 0);">=/</span><span style="color: rgb(0, 0, 0);">opt</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">jdk1.</span><span style="color: rgb(128, 0, 128);">6.0</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">jre <br />
export CLASSPATH</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">.:$JAVA_HOME</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">lib:$JRE_HOME</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">lib:$CLASSPATH <br />
export PATH</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">$JAVA_HOME</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">bin:$JRE_HOME</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">bin:$PATH</span></div>
</div>
<p>这里修改一下自己的JRE的路径就可以了，最好是安装到自己的profile里面，然后注消再登录一下，应该就可以再成功安装Netbeans。 </p>
<p>另外要说一下关于Qt的，Qt着实让我郁闷了半天，其实Qt的大部分的错误都是连接库的问题，当首先把代码从Windows拖到Ubuntu里面的时候，打开了项目文件还不能编译，这里就要安装g++和libfreetype6以及libpangol。</p>
<div class="code">
<div><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">安装相应的库</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">apt</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 255);">get</span><span style="color: rgb(0, 0, 0);"> install build</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">essential <br />
apt</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 255);">get</span><span style="color: rgb(0, 0, 0);"> install g</span><span style="color: rgb(0, 0, 0);">++</span><span style="color: rgb(0, 0, 0);"> <br />
sudo apt</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 255);">get</span><span style="color: rgb(0, 0, 0);"> install libpango1.</span>0-<span style="color: rgb(0, 0, 0);">dev <br />
</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">前面两个安装可以编译通过 <br />
</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">如果最后一个不安装的话不能用make <br />
</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">就会出现cannot find XXX错误</span></div>
</div>
<p>执行了上面的3个命令，基本上就可以在Ubuntu下面开发Qt应用程序了。&#160;</p>
<p>这里值得注意一下的是，虽然Qt的代码能够不重写的在Windows和Linux下使用，但是还是要编译的，所以还需要将代码哪过来重新编译即可。</p>
<p>今天弄了很长时间，网上说的都不是很详细，很清楚，所以自己Mark一下。</p>]]></description>
			<content:encoded><![CDATA[<p>今天弄了一天Ubuntu下面的开发环境，首先是做Firefox开发，肯定少不了Netbeans，所以就在网上下载了一个Netbeans，Netbeans是很好下载，可惜不好配置，也没什么错误提示，安装Netbeans的时候，首先要安装JDK，<a href="http://java.sun.com/javase/downloads/index.jsp">JDK可以在这里下载</a>，下载完了之后我们到这个目录下面执行一下命令行。</p>
<div class="code">
<div><span style="color: rgb(0, 0, 0);">sudo chmod </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">x jdk-</span><span style="color: rgb(0, 0, 0);">6</span><span style="color: rgb(0, 0, 0);">-linux-i586</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);">bin <br />
sudo </span><span style="color: rgb(0, 0, 0);">./</span><span style="color: rgb(0, 0, 0);">jdk-</span><span style="color: rgb(0, 0, 0);">6</span><span style="color: rgb(0, 0, 0);">-linux-i586</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);">bin </span></div>
</div>
<p>上面的第一句是给这个文件执行的权限，下面就是执行这个文件了，在安装好了JDK之后我们双击Netbeans就可以安装了，当然也可以直接在命令行里面安装。当然，在这之前不要忘记配置环境变量了。我们可以修改一下profile文件。 </p>
<div class="code">
<div><span style="color: rgb(0, 0, 0);">sudo gedit </span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">etc</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">profile <br />
</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">然后在文件里面添加，这里不是代码</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">export JAVA_HOME</span><span style="color: rgb(0, 0, 0);">=/</span><span style="color: rgb(0, 0, 0);">opt</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">jdk1.</span><span style="color: rgb(128, 0, 128);">6.0</span><span style="color: rgb(0, 0, 0);"> <br />
export JRE_HOME</span><span style="color: rgb(0, 0, 0);">=/</span><span style="color: rgb(0, 0, 0);">opt</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">jdk1.</span><span style="color: rgb(128, 0, 128);">6.0</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">jre <br />
export CLASSPATH</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">.:$JAVA_HOME</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">lib:$JRE_HOME</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">lib:$CLASSPATH <br />
export PATH</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">$JAVA_HOME</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">bin:$JRE_HOME</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">bin:$PATH</span></div>
</div>
<p>这里修改一下自己的JRE的路径就可以了，最好是安装到自己的profile里面，然后注消再登录一下，应该就可以再成功安装Netbeans。 </p>
<p>另外要说一下关于Qt的，Qt着实让我郁闷了半天，其实Qt的大部分的错误都是连接库的问题，当首先把代码从Windows拖到Ubuntu里面的时候，打开了项目文件还不能编译，这里就要安装g++和libfreetype6以及libpangol。</p>
<div class="code">
<div><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">安装相应的库</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">apt</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 255);">get</span><span style="color: rgb(0, 0, 0);"> install build</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">essential <br />
apt</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 255);">get</span><span style="color: rgb(0, 0, 0);"> install g</span><span style="color: rgb(0, 0, 0);">++</span><span style="color: rgb(0, 0, 0);"> <br />
sudo apt</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 255);">get</span><span style="color: rgb(0, 0, 0);"> install libpango1.</span>0-<span style="color: rgb(0, 0, 0);">dev <br />
</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">前面两个安装可以编译通过 <br />
</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">如果最后一个不安装的话不能用make <br />
</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">就会出现cannot find XXX错误</span></div>
</div>
<p>执行了上面的3个命令，基本上就可以在Ubuntu下面开发Qt应用程序了。&nbsp;</p>
<p>这里值得注意一下的是，虽然Qt的代码能够不重写的在Windows和Linux下使用，但是还是要编译的，所以还需要将代码哪过来重新编译即可。</p>
<p>今天弄了很长时间，网上说的都不是很详细，很清楚，所以自己Mark一下。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jguoer.com/blog/index.php/archives/308/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Qt &#8211; 用CSS的思想写界面？</title>
		<link>http://www.jguoer.com/blog/index.php/archives/311</link>
		<comments>http://www.jguoer.com/blog/index.php/archives/311#comments</comments>
		<pubDate>Thu, 30 Jul 2009 16:43:00 +0000</pubDate>
		<dc:creator>诡异的西红柿</dc:creator>
				<category><![CDATA[QT]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[开发]]></category>

		<guid isPermaLink="false">/post/2009/07/31/Qt-Design-With-QCSS.aspx</guid>
		<description><![CDATA[<p><img align="right" src="/blog/wp-content/uploads/2009/7/logo.png" style="border: 2px solid rgb(204, 204, 204); margin: 5px; padding: 2px;" alt="" />我相信很多人都很头疼C++的界面布局，曾经有一个&#8220;高人&#8221;和我说过现在谁用C++做界面啊，但是C++的高效确实是可以看见的，如果你做了很多的C#的应用程序，我相信肯定会发现C#的应用程序做界面是相当好做的，特别是有了破解版的<a href="http://www.jguoer.com/post/Using-Ribbon-UI-To-Improve-Winform-UI-Design.aspx">RibbonUI</a>之后（Office2007风格），C#的界面就更好做了。很可惜的是，我个人认为C#去做UI的时候会有点头疼，因为对我来说拖影和有点卡卡的感觉是绝对不允许的，而C#的GDI+的性能也一般，所以我觉得有时候高性能的UI，还是可以尝试其他的语言来做，比如脚本语言，比如C++。</p>
<p>最近无聊学习看Qt，Qt的界面制作是非常简单的，2年前看Qt的时候，没有发现做界面有那么大的优势，现在看来，还是有不错的优势的。下面是用C++做的界面，很简单，很容易，但是有一定的指导意义。</p>
<p style="text-align: center;"><img src="/blog/wp-content/uploads/2009/7/qtdigudesk.png" alt="" /></p>
<p><strong>注意：这里我只是拿嘀咕作为界面，并不是嘀咕的应用程序，所以千万不要和嘀咕相比了。</strong></p>
<p>我们在设计这个窗体的时候，可以使用3种方法，这三种可以归纳一下如下：</p>
<p>1.直接在设计器里面绘制窗体，但是要有点技巧。</p>
<p>2.在代码里面手动绘制窗体，同样需要技巧。</p>
<p>3.使用绘图的方式去绘制窗体，复杂，难定位。</p>
<p>其实第一种方法和第二种方法没什么太大区别，就首先说第一，第二种方法吧。在设计器里面去设计的时候，会比较容易，但是技巧就在于，我们必须要使用一个label控件作为背景，然后label控件的大小和窗体的大小一致，这样就假装有了一个背景层。至于为什么不好在背景直接设计颜色和图片，因为背景的颜色和图片会影响所在层内的控件的颜色，比如北京为黑色，那么文本框就有可能会为灰色，这是让人很郁闷的一件事，所以我们要用label作为一个背景层。</p>
<p>不过这里值得一提的是，我们在使用背景的时候，要在项目中添加一个资源文件的项目，即文件名为qrc为后缀的文件。</p>
<p style="text-align: center;"><img alt="" src="/blog/wp-content/uploads/2009/7/resource.png" /></p>
<p>添加了资源文件之后，我们就可以在资源文件中添加我们需要的资源，例如下图。</p>
<p style="text-align: center;"><img src="/blog/wp-content/uploads/2009/7/addresource.png" alt="" /></p>
<p>我们可以创建一个Prefix，可以当作是一个根路径一样的东西。然后可以在响应的Prefix里面去添加文件，例如上图中我就有一个image的Prefix，里面有一个images/bg.png。这里就是我们资源文件的路径了，我们可以通过下面的代码访问。</p>
<div class="code">
<div><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">访问路径&#34;:/image/images/bg.png);&#34;</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">paintLabel</span><span style="color: rgb(0, 0, 0);">-&#62;</span><span style="color: rgb(0, 0, 0);">setStyleSheet(</span><span style="color: rgb(128, 0, 0);">&#34;</span><span style="color: rgb(128, 0, 0);">background-image: url(:/image/images/bg.png);</span><span style="color: rgb(128, 0, 0);">&#34;</span><span style="color: rgb(0, 0, 0);">);</span></div>
</div>
<p style="text-align: left;">这样就添加了背景图片并通过代码去设置了。在设计器中，你也可以直接在设计器里面修改stylesheet属性去修改背景。不过，可以从上面的代码看出来，我们给Qt应用程序做界面是多么容易的一件事情，就像CSS和HTML一样，没错，确实可以像CSS的思考方式去做界面了。我们可以在设计器中修改stylesheet属性，就可以看到下面的窗口。</p>
<p style="text-align: center;"><img alt="" src="/blog/wp-content/uploads/2009/7/qtcss.png" /></p>
<p>我们可以添加资源，添加渐变和添加颜色，并添加字体，都可以，我们可以直接选取上面的颜色，渐变效果，渐变颜色和字体来更改响应的窗体中的字体，这样就非常简单的就能够制作出相应的窗体了，例如如果你想做一种深黑色的非常漂亮的窗体的话，直接修改stylesheet（样式表）就能够修改窗体的效果了，就非常容易。从代码来说，stylesheet也可以直接修改，接受QString参数，也就是字符串了，直接把stylesheet写进去就可以了。</p>
<p>这里说一下用绘制的方法写背景，我用绘制的方式绘制过图片，不过有点复杂，在代码上不会特别复杂，因为Qt直接有绘图的功能，如果你还想更丰富一点，还可以用OpenGL，不过那是后话了。但是绘图方面有很多要考虑的地方，例如坐标等等，如果只需要简单的UI设计，使用样式表就能够很快的达到我们的效果和目的了。但如果还要有更炫的效果，绘制的方法虽然麻烦，但也是优点多多的。</p>]]></description>
			<content:encoded><![CDATA[<p><img align="right" src="/blog/wp-content/uploads/2009/7/logo.png" style="border: 2px solid rgb(204, 204, 204); margin: 5px; padding: 2px;" alt="" />我相信很多人都很头疼C++的界面布局，曾经有一个&ldquo;高人&rdquo;和我说过现在谁用C++做界面啊，但是C++的高效确实是可以看见的，如果你做了很多的C#的应用程序，我相信肯定会发现C#的应用程序做界面是相当好做的，特别是有了破解版的<a href="http://www.jguoer.com/post/Using-Ribbon-UI-To-Improve-Winform-UI-Design.aspx">RibbonUI</a>之后（Office2007风格），C#的界面就更好做了。很可惜的是，我个人认为C#去做UI的时候会有点头疼，因为对我来说拖影和有点卡卡的感觉是绝对不允许的，而C#的GDI+的性能也一般，所以我觉得有时候高性能的UI，还是可以尝试其他的语言来做，比如脚本语言，比如C++。</p>
<p>最近无聊学习看Qt，Qt的界面制作是非常简单的，2年前看Qt的时候，没有发现做界面有那么大的优势，现在看来，还是有不错的优势的。下面是用C++做的界面，很简单，很容易，但是有一定的指导意义。</p>
<p style="text-align: center;"><img src="/blog/wp-content/uploads/2009/7/qtdigudesk.png" alt="" /></p>
<p><strong>注意：这里我只是拿嘀咕作为界面，并不是嘀咕的应用程序，所以千万不要和嘀咕相比了。</strong></p>
<p>我们在设计这个窗体的时候，可以使用3种方法，这三种可以归纳一下如下：</p>
<p>1.直接在设计器里面绘制窗体，但是要有点技巧。</p>
<p>2.在代码里面手动绘制窗体，同样需要技巧。</p>
<p>3.使用绘图的方式去绘制窗体，复杂，难定位。</p>
<p>其实第一种方法和第二种方法没什么太大区别，就首先说第一，第二种方法吧。在设计器里面去设计的时候，会比较容易，但是技巧就在于，我们必须要使用一个label控件作为背景，然后label控件的大小和窗体的大小一致，这样就假装有了一个背景层。至于为什么不好在背景直接设计颜色和图片，因为背景的颜色和图片会影响所在层内的控件的颜色，比如北京为黑色，那么文本框就有可能会为灰色，这是让人很郁闷的一件事，所以我们要用label作为一个背景层。</p>
<p>不过这里值得一提的是，我们在使用背景的时候，要在项目中添加一个资源文件的项目，即文件名为qrc为后缀的文件。</p>
<p style="text-align: center;"><img alt="" src="/blog/wp-content/uploads/2009/7/resource.png" /></p>
<p>添加了资源文件之后，我们就可以在资源文件中添加我们需要的资源，例如下图。</p>
<p style="text-align: center;"><img src="/blog/wp-content/uploads/2009/7/addresource.png" alt="" /></p>
<p>我们可以创建一个Prefix，可以当作是一个根路径一样的东西。然后可以在响应的Prefix里面去添加文件，例如上图中我就有一个image的Prefix，里面有一个images/bg.png。这里就是我们资源文件的路径了，我们可以通过下面的代码访问。</p>
<div class="code">
<div><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">访问路径&quot;:/image/images/bg.png);&quot;</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">paintLabel</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">setStyleSheet(</span><span style="color: rgb(128, 0, 0);">&quot;</span><span style="color: rgb(128, 0, 0);">background-image: url(:/image/images/bg.png);</span><span style="color: rgb(128, 0, 0);">&quot;</span><span style="color: rgb(0, 0, 0);">);</span></div>
</div>
<p style="text-align: left;">这样就添加了背景图片并通过代码去设置了。在设计器中，你也可以直接在设计器里面修改stylesheet属性去修改背景。不过，可以从上面的代码看出来，我们给Qt应用程序做界面是多么容易的一件事情，就像CSS和HTML一样，没错，确实可以像CSS的思考方式去做界面了。我们可以在设计器中修改stylesheet属性，就可以看到下面的窗口。</p>
<p style="text-align: center;"><img alt="" src="/blog/wp-content/uploads/2009/7/qtcss.png" /></p>
<p>我们可以添加资源，添加渐变和添加颜色，并添加字体，都可以，我们可以直接选取上面的颜色，渐变效果，渐变颜色和字体来更改响应的窗体中的字体，这样就非常简单的就能够制作出相应的窗体了，例如如果你想做一种深黑色的非常漂亮的窗体的话，直接修改stylesheet（样式表）就能够修改窗体的效果了，就非常容易。从代码来说，stylesheet也可以直接修改，接受QString参数，也就是字符串了，直接把stylesheet写进去就可以了。</p>
<p>这里说一下用绘制的方法写背景，我用绘制的方式绘制过图片，不过有点复杂，在代码上不会特别复杂，因为Qt直接有绘图的功能，如果你还想更丰富一点，还可以用OpenGL，不过那是后话了。但是绘图方面有很多要考虑的地方，例如坐标等等，如果只需要简单的UI设计，使用样式表就能够很快的达到我们的效果和目的了。但如果还要有更炫的效果，绘制的方法虽然麻烦，但也是优点多多的。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jguoer.com/blog/index.php/archives/311/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Qt &#8211; 我也玩代码高亮</title>
		<link>http://www.jguoer.com/blog/index.php/archives/312</link>
		<comments>http://www.jguoer.com/blog/index.php/archives/312#comments</comments>
		<pubDate>Sun, 26 Jul 2009 13:20:00 +0000</pubDate>
		<dc:creator>诡异的西红柿</dc:creator>
				<category><![CDATA[QT]]></category>
		<category><![CDATA[代码高亮]]></category>
		<category><![CDATA[开发]]></category>

		<guid isPermaLink="false">/post/2009/07/26/Qt-Highlighter.aspx</guid>
		<description><![CDATA[<p><img align="right" src="/blog/wp-content/uploads/2009/7/logo.png" style="border: 2px solid rgb(204, 204, 204); margin: 5px; padding: 2px;" alt="" />原来一直想写一个类似Notepad++的东西，做代码高亮，其实也没什么好做的，因为已经有了很好的Notepad++，我也不像重复发明轮子，但是最近做Firefox插件开发做的挺多的，用Netbeans用的也很多，但是Netbeans一直有点不爽就是编译等等不太方便，有时候还会有profile的错误，导致不能编译，还要删除profile才行，这确实让人很郁闷。而刚好最近玩一下Qt，所以就看一下能不能做一个，首先得弄一下编译器的代码高亮，所以看了一下Qt的例子，还是有一个很不错的类去做的，这个类就是<a href="http://doc.qtsoftware.com/4.5/qsyntaxhighlighter.html">QSyntaxHighlighter</a>。</p>
<p>首先，还是上图，这个程序其实很简单，不难理解。这下面是实际效果图（代码高亮部分）。</p>
<p style="text-align: center;"><img src="/blog/wp-content/uploads/2009/7/qtcode.png" alt="" /></p>
<p>首先，我们要写一个highlighter类，写类的时候我们先写个头文件叫highlighter.h，来定义我们的高亮的类的结构。</p>
<div class="code">
<div><span style="color: rgb(0, 0, 0);">#ifndef HIGHLIGHTER_H <br />
</span><span style="color: rgb(0, 0, 255);">#define</span><span style="color: rgb(0, 0, 0);"> HIGHLIGHTER_H</span><span style="color: rgb(0, 0, 0);"> <br />
<br />
#include </span><span style="color: rgb(0, 0, 0);">&#60;</span><span style="color: rgb(0, 0, 0);">QSyntaxHighlighter</span><span style="color: rgb(0, 0, 0);">&#62;</span><span style="color: rgb(0, 0, 0);"> <br />
<br />
#include </span><span style="color: rgb(0, 0, 0);">&#60;</span><span style="color: rgb(0, 0, 0);">QHash</span><span style="color: rgb(0, 0, 0);">&#62;</span><span style="color: rgb(0, 0, 0);"> <br />
#include </span><span style="color: rgb(0, 0, 0);">&#60;</span><span style="color: rgb(0, 0, 0);">QTextCharFormat</span><span style="color: rgb(0, 0, 0);">&#62;</span><span style="color: rgb(0, 0, 0);"> <br />
<br />
QT_BEGIN_NAMESPACE <br />
</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> QTextDocument; <br />
QT_END_NAMESPACE <br />
<br />
</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> Highlighter : </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> QSyntaxHighlighter <br />
{ <br />
&#160;&#160;&#160;&#160;Q_OBJECT <br />
<br />
</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">构造函数</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">: <br />
&#160;&#160;&#160;&#160;Highlighter(QTextDocument </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">parent </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 128);">0</span><span style="color: rgb(0, 0, 0);">); <br />
<br />
</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">这里一定要继承这个方法，否则不能编译通过</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 255);">protected</span><span style="color: rgb(0, 0, 0);">: <br />
&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> highlightBlock(</span><span style="color: rgb(0, 0, 255);">const</span><span style="color: rgb(0, 0, 0);"> QString </span><span style="color: rgb(0, 0, 0);">&#38;</span><span style="color: rgb(0, 0, 0);">text); <br />
<br />
</span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);">: <br />
&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">定义一个规则的结构体</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 0, 255);">struct</span><span style="color: rgb(0, 0, 0);"> HighlightingRule <br />
&#160;&#160;&#160;&#160;{ <br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;QRegExp pattern; <br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;QTextCharFormat format; <br />
&#160;&#160;&#160;&#160;}; <br />
<br />
&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">放一个Vector，相当于List了</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">&#160;&#160;&#160;&#160;QVector</span><span style="color: rgb(0, 0, 0);">&#60;</span><span style="color: rgb(0, 0, 0);">HighlightingRule</span><span style="color: rgb(0, 0, 0);">&#62;</span><span style="color: rgb(0, 0, 0);"> highlightingRules; <br />
<br />
&#160;&#160;&#160;&#160;QRegExp commentStartExpression; <br />
&#160;&#160;&#160;&#160;QRegExp commentEndExpression; <br />
<br />
&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">Qt里面关键字高亮的东西</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">&#160;&#160;&#160;&#160;QTextCharFormat keywordFormat; <br />
&#160;&#160;&#160;&#160;QTextCharFormat classFormat; <br />
&#160;&#160;&#160;&#160;QTextCharFormat singleLineCommentFormat; <br />
&#160;&#160;&#160;&#160;QTextCharFormat multiLineCommentFormat; <br />
&#160;&#160;&#160;&#160;QTextCharFormat commentFormat; <br />
&#160;&#160;&#160;&#160;QTextCharFormat functionFormat; <br />
&#160;&#160;&#160;&#160;QTextCharFormat stringFormat; <br />
};</span></div>
</div>
<p>我们写完了头文件之后我们就要逐渐实现我们结构里面的方法了，这里最重要的就是初始化方法和highlighterBlock方法了，我们可以编写代码如下。&#160;</p>
<div class="code">
<div><span style="color: rgb(0, 0, 0);">#include </span><span style="color: rgb(128, 0, 0);">&#34;</span><span style="color: rgb(128, 0, 0);">highlighter.h</span><span style="color: rgb(128, 0, 0);">&#34;</span><span style="color: rgb(0, 0, 0);"> <br />
<br />
Highlighter::Highlighter(QTextDocument </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">parent) : QSyntaxHighlighter(parent) <br />
{ <br />
&#160;&#160;&#160;&#160;HighlightingRule rule; <br />
<br />
&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">设置关键字的颜色</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">&#160;&#160;&#160;&#160;keywordFormat.setForeground(Qt::darkBlue); <br />
&#160;&#160;&#160;&#160;keywordFormat.setFontWeight(QFont::Bold); <br />
<br />
&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">创建关键字的参数</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">&#160;&#160;&#160;&#160;QStringList keywordPatterns; <br />
&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">插入关键字</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">&#160;&#160;&#160;&#160;keywordPatterns </span><span style="color: rgb(0, 0, 0);">&#60;&#60;</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 0);">&#34;</span><span style="color: rgb(128, 0, 0);">\\bchar\\b</span><span style="color: rgb(128, 0, 0);">&#34;</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">&#60;&#60;</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 0);">&#34;</span><span style="color: rgb(128, 0, 0);">\\bclass\\b</span><span style="color: rgb(128, 0, 0);">&#34;</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">&#60;&#60;</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 0);">&#34;</span><span style="color: rgb(128, 0, 0);">\\bconst\\b</span><span style="color: rgb(128, 0, 0);">&#34;</span><span style="color: rgb(0, 0, 0);">;</span><span style="color: rgb(0, 0, 0);"><br />
<br />
&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">遍历关键字然后添加到rule里面去</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 0, 255);">foreach</span><span style="color: rgb(0, 0, 0);"> (</span><span style="color: rgb(0, 0, 255);">const</span><span style="color: rgb(0, 0, 0);"> QString </span><span style="color: rgb(0, 0, 0);">&#38;</span><span style="color: rgb(0, 0, 0);">pattern, keywordPatterns) <br />
&#160;&#160;&#160;&#160;{ <br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;rule.pattern </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> QRegExp(pattern); <br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;rule.format </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> keywordFormat; <br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;highlightingRules.append(rule); <br />
&#160;&#160;&#160;&#160;} <br />
<br />
&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">同样我们还可以设置字符串的高亮样式</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">&#160;&#160;&#160;&#160;stringFormat.setForeground(Qt::darkMagenta); <br />
&#160;&#160;&#160;&#160;rule.pattern </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> QRegExp(</span><span style="color: rgb(128, 0, 0);">&#34;</span><span style="color: rgb(128, 0, 0);">\&#34;.*\&#34;</span><span style="color: rgb(128, 0, 0);">&#34;</span><span style="color: rgb(0, 0, 0);">); <br />
&#160;&#160;&#160;&#160;rule.format </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> stringFormat; <br />
&#160;&#160;&#160;&#160;highlightingRules.append(rule); <br />
<br />
&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">这里非常重要，是多行注释里面需要的</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">&#160;&#160;&#160;&#160;commentStartExpression </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> QRegExp(</span><span style="color: rgb(128, 0, 0);">&#34;</span><span style="color: rgb(128, 0, 0);">/\\*</span><span style="color: rgb(128, 0, 0);">&#34;</span><span style="color: rgb(0, 0, 0);">); <br />
&#160;&#160;&#160;&#160;commentEndExpression </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> QRegExp(</span><span style="color: rgb(128, 0, 0);">&#34;</span><span style="color: rgb(128, 0, 0);">\\*/</span><span style="color: rgb(128, 0, 0);">&#34;</span><span style="color: rgb(0, 0, 0);">); <br />
}</span></div>
</div>
<p>上面的代码我们就初始化了一个highlighter对象，用于高亮我们的代码模块，我们可以按照我们自己的意愿添加任何关键字，并且我们还可以设置很多高亮格式，只要通过正则表达式去匹配，就能够设置我们的高亮格式了，例如上面我设置了字符串的高亮样式（匹配&#34;.*&#34;），然后将字符串设置为紫色高亮样式。</p>
<p>我们实现了高亮样式之后，还需要事件highlightBlock方法进行我们的高亮的查询和匹配，代码如下所示。</p>
<div class="code">
<div><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> Highlighter::highlightBlock(</span><span style="color: rgb(0, 0, 255);">const</span><span style="color: rgb(0, 0, 0);"> QString </span><span style="color: rgb(0, 0, 0);">&#38;</span><span style="color: rgb(0, 0, 0);">text) <br />
{ <br />
&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">遍历rule，并在文本中替换文本样式</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 0, 255);">foreach</span><span style="color: rgb(0, 0, 0);"> (</span><span style="color: rgb(0, 0, 255);">const</span><span style="color: rgb(0, 0, 0);"> HighlightingRule </span><span style="color: rgb(0, 0, 0);">&#38;</span><span style="color: rgb(0, 0, 0);">rule, highlightingRules) <br />
&#160;&#160;&#160;&#160;{ <br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;QRegExp expression(rule.pattern); <br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> index </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> expression.indexIn(text); <br />
<br />
&#160;&#160;&#160;&#160;&#160;&#160; </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">如果还有索引</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 0, 255);">while</span><span style="color: rgb(0, 0, 0);"> (index </span><span style="color: rgb(0, 0, 0);">&#62;=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 128);">0</span><span style="color: rgb(0, 0, 0);">) <br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{ <br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> length </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> expression.matchedLength(); <br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">设置高亮格式</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;setFormat(index, length, rule.format); <br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;index </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> expression.indexIn(text, index </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> length); <br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;} <br />
&#160;&#160;&#160;&#160;} <br />
&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">上面的代码按道理这样就应该结束的 <br />
&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">但是多行的注释显示并没有实现，这里就需要下面的方法 <br />
&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">设置当前的Block状态</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">&#160;&#160;&#160;&#160;setCurrentBlockState(</span><span style="color: rgb(128, 0, 128);">0</span><span style="color: rgb(0, 0, 0);">); <br />
&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> startIndex </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 128);">0</span><span style="color: rgb(0, 0, 0);">; <br />
<br />
&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">和前面的逻辑一样，但是是多行进行扫描设置</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> (previousBlockState() </span><span style="color: rgb(0, 0, 0);">!=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 128);">1</span><span style="color: rgb(0, 0, 0);">) <br />
&#160;&#160;&#160;&#160;{ <br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;startIndex </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> commentStartExpression.indexIn(text); <br />
&#160;&#160;&#160;&#160;} <br />
<br />
&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 0, 255);">while</span><span style="color: rgb(0, 0, 0);"> (startIndex </span><span style="color: rgb(0, 0, 0);">&#62;=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 128);">0</span><span style="color: rgb(0, 0, 0);">) <br />
&#160;&#160;&#160;&#160;{ <br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> endIndex </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> commentEndExpression.indexIn(text, startIndex); <br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> commentLength; <br />
<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> (endIndex </span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(128, 0, 128);">1</span><span style="color: rgb(0, 0, 0);">) <br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{ <br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;setCurrentBlockState(</span><span style="color: rgb(128, 0, 128);">1</span><span style="color: rgb(0, 0, 0);">); <br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;commentLength </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> text.length() </span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);"> startIndex; <br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;} <br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 0, 255);">else</span><span style="color: rgb(0, 0, 0);"> <br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{ <br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;commentLength </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> endIndex </span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);"> startIndex <br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> commentEndExpression.matchedLength(); <br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;} <br />
<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;setFormat(startIndex, commentLength, multiLineCommentFormat); <br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;startIndex </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> commentStartExpression.indexIn(text, startIndex </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> commentLength); <br />
&#160;&#160;&#160;&#160;} <br />
} <br />
</span></div>
</div>
<p>通过上面的代码我们就完成了一个highlighter，不过highlighter还不够成熟，如果你需要设置更多的关键字，就要自己添加关键字，如果要设置数字颜色，单引号的引用的颜色，就可以自己添加相应的规则再添加到rules里面去了。&#160;</p>
<div class="code">
<div><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> MainWindow::SetColor() <br />
{ <br />
&#160;&#160;&#160;&#160;highlighter </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Highlighter(ui</span><span style="color: rgb(0, 0, 0);">-&#62;</span><span style="color: rgb(0, 0, 0);">textEdit</span><span style="color: rgb(0, 0, 0);">-&#62;</span><span style="color: rgb(0, 0, 0);">document()); <br />
<br />
&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">设置字体</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">&#160;&#160;&#160;&#160;QFont font; <br />
&#160;&#160;&#160;&#160;font.setFamily(</span><span style="color: rgb(128, 0, 0);">&#34;</span><span style="color: rgb(128, 0, 0);">Arial</span><span style="color: rgb(128, 0, 0);">&#34;</span><span style="color: rgb(0, 0, 0);">); <br />
&#160;&#160;&#160;&#160;font.setFixedPitch(</span><span style="color: rgb(0, 0, 255);">true</span><span style="color: rgb(0, 0, 0);">); <br />
&#160;&#160;&#160;&#160;font.setPixelSize(</span><span style="color: rgb(128, 0, 128);">12</span><span style="color: rgb(0, 0, 0);">); <br />
<br />
&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">设置textEdit控件的字体</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">&#160;&#160;&#160;&#160;ui</span><span style="color: rgb(0, 0, 0);">-&#62;</span><span style="color: rgb(0, 0, 0);">textEdit</span><span style="color: rgb(0, 0, 0);">-&#62;</span><span style="color: rgb(0, 0, 0);">setFont(font); <br />
&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">设置文本，这里我传递空文本</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">&#160;&#160;&#160;&#160;ui</span><span style="color: rgb(0, 0, 0);">-&#62;</span><span style="color: rgb(0, 0, 0);">textEdit</span><span style="color: rgb(0, 0, 0);">-&#62;</span><span style="color: rgb(0, 0, 0);">setPlainText(</span><span style="color: rgb(128, 0, 0);">&#34;&#34;</span><span style="color: rgb(0, 0, 0);">); <br />
} <br />
</span></div>
</div>
<p>在主窗体中我们可以重新创建一个SetColor方法即可，如何创建我就不累述了，这里我们在主窗体的构造函数中调用这个方法即可，其中我设置了一些字体，让开发窗体看上去更好看一点，如果你想要其他的字体，也可以更改QFont对象来更改为其他字体。</p>]]></description>
			<content:encoded><![CDATA[<p><img align="right" src="/blog/wp-content/uploads/2009/7/logo.png" style="border: 2px solid rgb(204, 204, 204); margin: 5px; padding: 2px;" alt="" />原来一直想写一个类似Notepad++的东西，做代码高亮，其实也没什么好做的，因为已经有了很好的Notepad++，我也不像重复发明轮子，但是最近做Firefox插件开发做的挺多的，用Netbeans用的也很多，但是Netbeans一直有点不爽就是编译等等不太方便，有时候还会有profile的错误，导致不能编译，还要删除profile才行，这确实让人很郁闷。而刚好最近玩一下Qt，所以就看一下能不能做一个，首先得弄一下编译器的代码高亮，所以看了一下Qt的例子，还是有一个很不错的类去做的，这个类就是<a href="http://doc.qtsoftware.com/4.5/qsyntaxhighlighter.html">QSyntaxHighlighter</a>。</p>
<p>首先，还是上图，这个程序其实很简单，不难理解。这下面是实际效果图（代码高亮部分）。</p>
<p style="text-align: center;"><img src="/blog/wp-content/uploads/2009/7/qtcode.png" alt="" /></p>
<p>首先，我们要写一个highlighter类，写类的时候我们先写个头文件叫highlighter.h，来定义我们的高亮的类的结构。</p>
<div class="code">
<div><span style="color: rgb(0, 0, 0);">#ifndef HIGHLIGHTER_H <br />
</span><span style="color: rgb(0, 0, 255);">#define</span><span style="color: rgb(0, 0, 0);"> HIGHLIGHTER_H</span><span style="color: rgb(0, 0, 0);"> </p>
<p>#include </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">QSyntaxHighlighter</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"> </p>
<p>#include </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">QHash</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"> <br />
#include </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">QTextCharFormat</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"> </p>
<p>QT_BEGIN_NAMESPACE <br />
</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> QTextDocument; <br />
QT_END_NAMESPACE </p>
<p></span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> Highlighter : </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> QSyntaxHighlighter <br />
{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;Q_OBJECT </p>
<p></span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">构造函数</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">: <br />
&nbsp;&nbsp;&nbsp;&nbsp;Highlighter(QTextDocument </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">parent </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 128);">0</span><span style="color: rgb(0, 0, 0);">); </p>
<p></span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">这里一定要继承这个方法，否则不能编译通过</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 255);">protected</span><span style="color: rgb(0, 0, 0);">: <br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> highlightBlock(</span><span style="color: rgb(0, 0, 255);">const</span><span style="color: rgb(0, 0, 0);"> QString </span><span style="color: rgb(0, 0, 0);">&amp;</span><span style="color: rgb(0, 0, 0);">text); </p>
<p></span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);">: <br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">定义一个规则的结构体</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">struct</span><span style="color: rgb(0, 0, 0);"> HighlightingRule <br />
&nbsp;&nbsp;&nbsp;&nbsp;{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QRegExp pattern; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QTextCharFormat format; <br />
&nbsp;&nbsp;&nbsp;&nbsp;}; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">放一个Vector，相当于List了</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;QVector</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">HighlightingRule</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"> highlightingRules; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;QRegExp commentStartExpression; <br />
&nbsp;&nbsp;&nbsp;&nbsp;QRegExp commentEndExpression; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">Qt里面关键字高亮的东西</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;QTextCharFormat keywordFormat; <br />
&nbsp;&nbsp;&nbsp;&nbsp;QTextCharFormat classFormat; <br />
&nbsp;&nbsp;&nbsp;&nbsp;QTextCharFormat singleLineCommentFormat; <br />
&nbsp;&nbsp;&nbsp;&nbsp;QTextCharFormat multiLineCommentFormat; <br />
&nbsp;&nbsp;&nbsp;&nbsp;QTextCharFormat commentFormat; <br />
&nbsp;&nbsp;&nbsp;&nbsp;QTextCharFormat functionFormat; <br />
&nbsp;&nbsp;&nbsp;&nbsp;QTextCharFormat stringFormat; <br />
};</span></div>
</div>
<p>我们写完了头文件之后我们就要逐渐实现我们结构里面的方法了，这里最重要的就是初始化方法和highlighterBlock方法了，我们可以编写代码如下。&nbsp;</p>
<div class="code">
<div><span style="color: rgb(0, 0, 0);">#include </span><span style="color: rgb(128, 0, 0);">&quot;</span><span style="color: rgb(128, 0, 0);">highlighter.h</span><span style="color: rgb(128, 0, 0);">&quot;</span><span style="color: rgb(0, 0, 0);"> </p>
<p>Highlighter::Highlighter(QTextDocument </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">parent) : QSyntaxHighlighter(parent) <br />
{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;HighlightingRule rule; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">设置关键字的颜色</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;keywordFormat.setForeground(Qt::darkBlue); <br />
&nbsp;&nbsp;&nbsp;&nbsp;keywordFormat.setFontWeight(QFont::Bold); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">创建关键字的参数</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;QStringList keywordPatterns; <br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">插入关键字</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;keywordPatterns </span><span style="color: rgb(0, 0, 0);">&lt;&lt;</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 0);">&quot;</span><span style="color: rgb(128, 0, 0);">\\bchar\\b</span><span style="color: rgb(128, 0, 0);">&quot;</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">&lt;&lt;</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 0);">&quot;</span><span style="color: rgb(128, 0, 0);">\\bclass\\b</span><span style="color: rgb(128, 0, 0);">&quot;</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">&lt;&lt;</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 0);">&quot;</span><span style="color: rgb(128, 0, 0);">\\bconst\\b</span><span style="color: rgb(128, 0, 0);">&quot;</span><span style="color: rgb(0, 0, 0);">;</span><span style="color: rgb(0, 0, 0);"></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">遍历关键字然后添加到rule里面去</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">foreach</span><span style="color: rgb(0, 0, 0);"> (</span><span style="color: rgb(0, 0, 255);">const</span><span style="color: rgb(0, 0, 0);"> QString </span><span style="color: rgb(0, 0, 0);">&amp;</span><span style="color: rgb(0, 0, 0);">pattern, keywordPatterns) <br />
&nbsp;&nbsp;&nbsp;&nbsp;{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rule.pattern </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> QRegExp(pattern); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rule.format </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> keywordFormat; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;highlightingRules.append(rule); <br />
&nbsp;&nbsp;&nbsp;&nbsp;} </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">同样我们还可以设置字符串的高亮样式</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;stringFormat.setForeground(Qt::darkMagenta); <br />
&nbsp;&nbsp;&nbsp;&nbsp;rule.pattern </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> QRegExp(</span><span style="color: rgb(128, 0, 0);">&quot;</span><span style="color: rgb(128, 0, 0);">\&quot;.*\&quot;</span><span style="color: rgb(128, 0, 0);">&quot;</span><span style="color: rgb(0, 0, 0);">); <br />
&nbsp;&nbsp;&nbsp;&nbsp;rule.format </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> stringFormat; <br />
&nbsp;&nbsp;&nbsp;&nbsp;highlightingRules.append(rule); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">这里非常重要，是多行注释里面需要的</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;commentStartExpression </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> QRegExp(</span><span style="color: rgb(128, 0, 0);">&quot;</span><span style="color: rgb(128, 0, 0);">/\\*</span><span style="color: rgb(128, 0, 0);">&quot;</span><span style="color: rgb(0, 0, 0);">); <br />
&nbsp;&nbsp;&nbsp;&nbsp;commentEndExpression </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> QRegExp(</span><span style="color: rgb(128, 0, 0);">&quot;</span><span style="color: rgb(128, 0, 0);">\\*/</span><span style="color: rgb(128, 0, 0);">&quot;</span><span style="color: rgb(0, 0, 0);">); <br />
}</span></div>
</div>
<p>上面的代码我们就初始化了一个highlighter对象，用于高亮我们的代码模块，我们可以按照我们自己的意愿添加任何关键字，并且我们还可以设置很多高亮格式，只要通过正则表达式去匹配，就能够设置我们的高亮格式了，例如上面我设置了字符串的高亮样式（匹配&quot;.*&quot;），然后将字符串设置为紫色高亮样式。</p>
<p>我们实现了高亮样式之后，还需要事件highlightBlock方法进行我们的高亮的查询和匹配，代码如下所示。</p>
<div class="code">
<div><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> Highlighter::highlightBlock(</span><span style="color: rgb(0, 0, 255);">const</span><span style="color: rgb(0, 0, 0);"> QString </span><span style="color: rgb(0, 0, 0);">&amp;</span><span style="color: rgb(0, 0, 0);">text) <br />
{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">遍历rule，并在文本中替换文本样式</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">foreach</span><span style="color: rgb(0, 0, 0);"> (</span><span style="color: rgb(0, 0, 255);">const</span><span style="color: rgb(0, 0, 0);"> HighlightingRule </span><span style="color: rgb(0, 0, 0);">&amp;</span><span style="color: rgb(0, 0, 0);">rule, highlightingRules) <br />
&nbsp;&nbsp;&nbsp;&nbsp;{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QRegExp expression(rule.pattern); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> index </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> expression.indexIn(text); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">如果还有索引</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">while</span><span style="color: rgb(0, 0, 0);"> (index </span><span style="color: rgb(0, 0, 0);">&gt;=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 128);">0</span><span style="color: rgb(0, 0, 0);">) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> length </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> expression.matchedLength(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">设置高亮格式</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setFormat(index, length, rule.format); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;index </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> expression.indexIn(text, index </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> length); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />
&nbsp;&nbsp;&nbsp;&nbsp;} <br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">上面的代码按道理这样就应该结束的 <br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">但是多行的注释显示并没有实现，这里就需要下面的方法 <br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">设置当前的Block状态</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;setCurrentBlockState(</span><span style="color: rgb(128, 0, 128);">0</span><span style="color: rgb(0, 0, 0);">); <br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> startIndex </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 128);">0</span><span style="color: rgb(0, 0, 0);">; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">和前面的逻辑一样，但是是多行进行扫描设置</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> (previousBlockState() </span><span style="color: rgb(0, 0, 0);">!=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 128);">1</span><span style="color: rgb(0, 0, 0);">) <br />
&nbsp;&nbsp;&nbsp;&nbsp;{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;startIndex </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> commentStartExpression.indexIn(text); <br />
&nbsp;&nbsp;&nbsp;&nbsp;} </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">while</span><span style="color: rgb(0, 0, 0);"> (startIndex </span><span style="color: rgb(0, 0, 0);">&gt;=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 128);">0</span><span style="color: rgb(0, 0, 0);">) <br />
&nbsp;&nbsp;&nbsp;&nbsp;{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> endIndex </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> commentEndExpression.indexIn(text, startIndex); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> commentLength; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> (endIndex </span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(128, 0, 128);">1</span><span style="color: rgb(0, 0, 0);">) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setCurrentBlockState(</span><span style="color: rgb(128, 0, 128);">1</span><span style="color: rgb(0, 0, 0);">); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;commentLength </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> text.length() </span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);"> startIndex; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">else</span><span style="color: rgb(0, 0, 0);"> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;commentLength </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> endIndex </span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);"> startIndex <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;</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> commentEndExpression.matchedLength(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setFormat(startIndex, commentLength, multiLineCommentFormat); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;startIndex </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> commentStartExpression.indexIn(text, startIndex </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> commentLength); <br />
&nbsp;&nbsp;&nbsp;&nbsp;} <br />
} <br />
</span></div>
</div>
<p>通过上面的代码我们就完成了一个highlighter，不过highlighter还不够成熟，如果你需要设置更多的关键字，就要自己添加关键字，如果要设置数字颜色，单引号的引用的颜色，就可以自己添加相应的规则再添加到rules里面去了。&nbsp;</p>
<div class="code">
<div><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> MainWindow::SetColor() <br />
{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;highlighter </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Highlighter(ui</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">textEdit</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">document()); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">设置字体</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;QFont font; <br />
&nbsp;&nbsp;&nbsp;&nbsp;font.setFamily(</span><span style="color: rgb(128, 0, 0);">&quot;</span><span style="color: rgb(128, 0, 0);">Arial</span><span style="color: rgb(128, 0, 0);">&quot;</span><span style="color: rgb(0, 0, 0);">); <br />
&nbsp;&nbsp;&nbsp;&nbsp;font.setFixedPitch(</span><span style="color: rgb(0, 0, 255);">true</span><span style="color: rgb(0, 0, 0);">); <br />
&nbsp;&nbsp;&nbsp;&nbsp;font.setPixelSize(</span><span style="color: rgb(128, 0, 128);">12</span><span style="color: rgb(0, 0, 0);">); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">设置textEdit控件的字体</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;ui</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">textEdit</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">setFont(font); <br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">设置文本，这里我传递空文本</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;ui</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">textEdit</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">setPlainText(</span><span style="color: rgb(128, 0, 0);">&quot;&quot;</span><span style="color: rgb(0, 0, 0);">); <br />
} <br />
</span></div>
</div>
<p>在主窗体中我们可以重新创建一个SetColor方法即可，如何创建我就不累述了，这里我们在主窗体的构造函数中调用这个方法即可，其中我设置了一些字体，让开发窗体看上去更好看一点，如果你想要其他的字体，也可以更改QFont对象来更改为其他字体。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jguoer.com/blog/index.php/archives/312/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Qt &#8211; 事件响应</title>
		<link>http://www.jguoer.com/blog/index.php/archives/314</link>
		<comments>http://www.jguoer.com/blog/index.php/archives/314#comments</comments>
		<pubDate>Sun, 26 Jul 2009 08:29:00 +0000</pubDate>
		<dc:creator>诡异的西红柿</dc:creator>
				<category><![CDATA[QT]]></category>
		<category><![CDATA[事件响应]]></category>
		<category><![CDATA[开发]]></category>

		<guid isPermaLink="false">/post/2009/07/26/Qt-EventHandler.aspx</guid>
		<description><![CDATA[<p><img align="right" alt="" style="border: 2px solid rgb(204, 204, 204); margin: 5px; padding: 2px;" src="/blog/wp-content/uploads/2009/7/logo.png" />Qt里面的事件响应不那么复杂，也就不需要用大量的笔墨去描述Qt的事件了，Qt的事件比较简单，但是也远非没有C#简单，C#一个+=，-=就注册事件和注销事件，但是在Qt就要复杂一点，不过相比VC++来说，那要简单多了。</p>
<p>在了解Qt的事件的时候，我们要了解SIGNAL和SLOT。其实SIGNAL和SLOT在Qt里面和在Windows里面的事件和消息是一样的，SIGNAL和SLOT被称作信号和槽，我知道一开始会难以理解一点，因为我们长期都是在通过事件响应消息的思考方式来思考问题，其实SIGNAL和SLOT和事件和消息在概念上也没有太大的区别，我们只需要当作是一个事件链接即可。</p>
<p>我们可以从设计器中添加事件，比如下面的图。</p>
<p style="text-align: center;"><img alt="" src="/blog/wp-content/uploads/2009/7/signal.png" style="border: 1px solid rgb(204, 204, 204); padding: 2px;" /></p>
<p>我们可以在设计器中很轻便的添加信号和槽，不过可惜的是，我们在设计器中添加的事件和槽并不能自定义，例如上图我们中间发送者是pushButton，信号是clicked（点击），然后接受者是mainToolBar，我们接受者响应的一些事件，只能在列表里面选择，这根本无法满足我们的要求，所以我们就要在文件中自己编写响应的信号槽。</p>
<div class="code">
<div><span style="color: rgb(0, 0, 0);">MainWindow::MainWindow(QWidget </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">parent) <br />
&#160;&#160;&#160;&#160;: QMainWindow(parent), ui(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Ui::MainWindow) <br />
{ <br />
&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">初始化ui</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">&#160;&#160;&#160;&#160;ui</span><span style="color: rgb(0, 0, 0);">-&#62;</span><span style="color: rgb(0, 0, 0);">setupUi(</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">)； <br />
&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">创建信号槽</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">&#160;&#160;&#160;&#160;QObject::connect(ui</span><span style="color: rgb(0, 0, 0);">-&#62;</span><span style="color: rgb(0, 0, 0);">pushButton, SIGNAL(clicked()), </span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">, SLOT(Dosomething())); <br />
}</span></div>
</div>
<p>上面的代码即我们在主窗体初始化的时候编写的，这个时候我们在主窗体中编写了相应的信号槽，上面的意思就是pushButton按下后，响应Dosomething事件。参数是发送者的对象，响应的方法，接受者的对象和响应的方法。这里值得注意的就是，并不是所有的方法都能够添加到信号槽中并响应，这里还需要声明一个方法为SLOT。&#160;</p>
<p>在头文件中，我们需这样声明。&#160;</p>
<div class="code">
<div><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> slots: <br />
&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> Dosomething();</span></div>
</div>
<p>申明SLOT事件之后，我们才能够在信号槽中添加响应的事件响应了，然后你再在cpp文件里面写这个方法就可以了。</p>
<div class="code">
<div><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> MainWindow::Dosomething() <br />
{ <br />
&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">在这里编写代码即可</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">}</span></div>
</div>
<p>这样就搞定了一个事件响应了，Qt里面的事件响应相比之下还是非常容易的。对于ui里面编写的事件响应，会生成到响应的ui_classname头文件中，不过无论在ui的代码中还是在主窗体的代码中，都没有太大的区别。</p>]]></description>
			<content:encoded><![CDATA[<p><img align="right" alt="" style="border: 2px solid rgb(204, 204, 204); margin: 5px; padding: 2px;" src="/blog/wp-content/uploads/2009/7/logo.png" />Qt里面的事件响应不那么复杂，也就不需要用大量的笔墨去描述Qt的事件了，Qt的事件比较简单，但是也远非没有C#简单，C#一个+=，-=就注册事件和注销事件，但是在Qt就要复杂一点，不过相比VC++来说，那要简单多了。</p>
<p>在了解Qt的事件的时候，我们要了解SIGNAL和SLOT。其实SIGNAL和SLOT在Qt里面和在Windows里面的事件和消息是一样的，SIGNAL和SLOT被称作信号和槽，我知道一开始会难以理解一点，因为我们长期都是在通过事件响应消息的思考方式来思考问题，其实SIGNAL和SLOT和事件和消息在概念上也没有太大的区别，我们只需要当作是一个事件链接即可。</p>
<p>我们可以从设计器中添加事件，比如下面的图。</p>
<p style="text-align: center;"><img alt="" src="/blog/wp-content/uploads/2009/7/signal.png" style="border: 1px solid rgb(204, 204, 204); padding: 2px;" /></p>
<p>我们可以在设计器中很轻便的添加信号和槽，不过可惜的是，我们在设计器中添加的事件和槽并不能自定义，例如上图我们中间发送者是pushButton，信号是clicked（点击），然后接受者是mainToolBar，我们接受者响应的一些事件，只能在列表里面选择，这根本无法满足我们的要求，所以我们就要在文件中自己编写响应的信号槽。</p>
<div class="code">
<div><span style="color: rgb(0, 0, 0);">MainWindow::MainWindow(QWidget </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">parent) <br />
&nbsp;&nbsp;&nbsp;&nbsp;: QMainWindow(parent), ui(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Ui::MainWindow) <br />
{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">初始化ui</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;ui</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">setupUi(</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">)； <br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">创建信号槽</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;QObject::connect(ui</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">pushButton, SIGNAL(clicked()), </span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">, SLOT(Dosomething())); <br />
}</span></div>
</div>
<p>上面的代码即我们在主窗体初始化的时候编写的，这个时候我们在主窗体中编写了相应的信号槽，上面的意思就是pushButton按下后，响应Dosomething事件。参数是发送者的对象，响应的方法，接受者的对象和响应的方法。这里值得注意的就是，并不是所有的方法都能够添加到信号槽中并响应，这里还需要声明一个方法为SLOT。&nbsp;</p>
<p>在头文件中，我们需这样声明。&nbsp;</p>
<div class="code">
<div><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> slots: <br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> Dosomething();</span></div>
</div>
<p>申明SLOT事件之后，我们才能够在信号槽中添加响应的事件响应了，然后你再在cpp文件里面写这个方法就可以了。</p>
<div class="code">
<div><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> MainWindow::Dosomething() <br />
{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">在这里编写代码即可</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">}</span></div>
</div>
<p>这样就搞定了一个事件响应了，Qt里面的事件响应相比之下还是非常容易的。对于ui里面编写的事件响应，会生成到响应的ui_classname头文件中，不过无论在ui的代码中还是在主窗体的代码中，都没有太大的区别。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jguoer.com/blog/index.php/archives/314/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Qt &#8211; Qt代码结构</title>
		<link>http://www.jguoer.com/blog/index.php/archives/315</link>
		<comments>http://www.jguoer.com/blog/index.php/archives/315#comments</comments>
		<pubDate>Sat, 25 Jul 2009 03:14:00 +0000</pubDate>
		<dc:creator>诡异的西红柿</dc:creator>
				<category><![CDATA[QT]]></category>
		<category><![CDATA[代码结构]]></category>
		<category><![CDATA[开发]]></category>

		<guid isPermaLink="false">/post/2009/07/25/Qt-Structur.aspx</guid>
		<description><![CDATA[<p><img align="right" src="/blog/wp-content/uploads/2009/7/logo.png" style="border: 2px solid rgb(204, 204, 204); margin: 5px; padding: 2px;" alt="" />在编程开发中，特别是一开始了解一个语言和一个框架的时候，如果我们解决了语言，IDE以及经典的&#8220;Hello World&#8221;程序之后，我们就需要更加深入的了解这个框架以及这个框架给我们提供的便利了，所以这里我们要开始慢慢的了解Qt的结构以及其事件的响应过程。</p>
<p>我们可以看到在Qt Creator中，如果我们创建一个Gui的应用程序，那么Qt Creator会给我们创建若干个文件，我们可以看到我们的主窗体是mainwindow.cpp，其中当然少不了mainwindow.h这个头文件了，我们看看这个头文件的代码。</p>
<div class="code">
<div><span style="color: rgb(0, 0, 0);">#ifndef MAINWINDOW_H <br />
</span><span style="color: rgb(0, 0, 255);">#define</span><span style="color: rgb(0, 0, 0);"> MAINWINDOW_H</span><span style="color: rgb(0, 0, 0);"> <br />
<br />
#include </span><span style="color: rgb(0, 0, 0);">&#60;</span><span style="color: rgb(0, 0, 0);">QtGui</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">QMainWindow</span><span style="color: rgb(0, 0, 0);">&#62;</span><span style="color: rgb(0, 0, 0);"> <br />
<br />
</span><span style="color: rgb(0, 0, 255);">namespace</span><span style="color: rgb(0, 0, 0);"> Ui <br />
{ <br />
&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> MainWindow; <br />
} <br />
<br />
</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> MainWindow : </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> QMainWindow <br />
{ <br />
&#160;&#160;&#160;&#160;Q_OBJECT <br />
<br />
</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">: <br />
&#160;&#160;&#160;&#160;MainWindow(QWidget </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">parent </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 128);">0</span><span style="color: rgb(0, 0, 0);">); <br />
&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 0, 0);">~</span><span style="color: rgb(0, 0, 0);">MainWindow(); <br />
</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> slots: <br />
&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> Dosomething(); <br />
<br />
</span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);">: <br />
&#160;&#160;&#160;&#160;Ui::MainWindow </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">ui; <br />
}; <br />
<br />
</span><span style="color: rgb(0, 0, 255);">#endif</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> MAINWINDOW_H</span></div>
</div>
<p>代码很简单，我们就不详细说了，在这里，我们可以看到头文件中有一个public slots这个修饰符，我们可以留在后面再说。然后我们看看cpp文件。</p>
<div class="code">
<div><span style="color: rgb(0, 0, 0);">#include </span><span style="color: rgb(128, 0, 0);">&#34;</span><span style="color: rgb(128, 0, 0);">mainwindow.h</span><span style="color: rgb(128, 0, 0);">&#34;</span><span style="color: rgb(0, 0, 0);"> <br />
</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">这个头文件在项目中看上去没有</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">#include </span><span style="color: rgb(128, 0, 0);">&#34;</span><span style="color: rgb(128, 0, 0);">ui_mainwindow.h</span><span style="color: rgb(128, 0, 0);">&#34;</span><span style="color: rgb(0, 0, 0);"> <br />
<br />
MainWindow::MainWindow(QWidget </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">parent) <br />
&#160;&#160;&#160;&#160;: QMainWindow(parent), ui(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Ui::MainWindow) <br />
{ <br />
&#160;&#160;&#160;&#160;ui</span><span style="color: rgb(0, 0, 0);">-&#62;</span><span style="color: rgb(0, 0, 0);">setupUi(</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">); <br />
&#160;&#160;&#160;&#160;QObject::connect(ui</span><span style="color: rgb(0, 0, 0);">-&#62;</span><span style="color: rgb(0, 0, 0);">pushButton, SIGNAL(clicked()), </span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">, SLOT(Dosomething())); <br />
} <br />
<br />
MainWindow::</span><span style="color: rgb(0, 0, 0);">~</span><span style="color: rgb(0, 0, 0);">MainWindow() <br />
{ <br />
&#160;&#160;&#160;&#160;delete ui; <br />
} <br />
<br />
</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> MainWindow::Dosomething() <br />
{ <br />
&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 0, 255);">const</span><span style="color: rgb(0, 0, 0);"> QString str </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(128, 0, 0);">&#34;</span><span style="color: rgb(128, 0, 0);">test</span><span style="color: rgb(128, 0, 0);">&#34;</span><span style="color: rgb(0, 0, 0);">; <br />
&#160;&#160;&#160;&#160;ui</span><span style="color: rgb(0, 0, 0);">-&#62;</span><span style="color: rgb(0, 0, 0);">textEdit</span><span style="color: rgb(0, 0, 0);">-&#62;</span><span style="color: rgb(0, 0, 0);">setText(str); <br />
&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">this-&#62;~MainWindow();</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">} <br />
</span></div>
</div>
<p>cpp文件也就是我们窗体的主要代码了，这里的代码也很简单，并不复杂，唯一要说的就是头文件了，我们可以看到这里有一个头文件ui_mainwindow.h，而这个头文件在项目中并看不到（通常我们看到的是.ui文件，这个是我们在设计器里面设计生成的xml文件），而我们打开项目所在的文件夹里面，我们是可以看到有ui_mainwindow.h的，因为在编译的时候，编译器为我们重新编译了.ui文件并生成了相应的窗体代码，我们可以看一下窗体代码。&#160;</p>
<div class="code">
<div><span style="color: rgb(0, 0, 0);">#ifndef UI_MAINWINDOW_H <br />
</span><span style="color: rgb(0, 0, 255);">#define</span><span style="color: rgb(0, 0, 0);"> UI_MAINWINDOW_H</span><span style="color: rgb(0, 0, 0);"> <br />
<br />
#include </span><span style="color: rgb(0, 0, 0);">&#60;</span><span style="color: rgb(0, 0, 0);">QtCore</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">QVariant</span><span style="color: rgb(0, 0, 0);">&#62;</span><span style="color: rgb(0, 0, 0);"> <br />
#include </span><span style="color: rgb(0, 0, 0);">&#60;</span><span style="color: rgb(0, 0, 0);">QtGui</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">QAction</span><span style="color: rgb(0, 0, 0);">&#62;</span><span style="color: rgb(0, 0, 0);"> <br />
#include </span><span style="color: rgb(0, 0, 0);">&#60;</span><span style="color: rgb(0, 0, 0);">QtGui</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">QApplication</span><span style="color: rgb(0, 0, 0);">&#62;</span><span style="color: rgb(0, 0, 0);"> <br />
#include </span><span style="color: rgb(0, 0, 0);">&#60;</span><span style="color: rgb(0, 0, 0);">QtGui</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">QButtonGroup</span><span style="color: rgb(0, 0, 0);">&#62;</span><span style="color: rgb(0, 0, 0);"> <br />
#include </span><span style="color: rgb(0, 0, 0);">&#60;</span><span style="color: rgb(0, 0, 0);">QtGui</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">QHeaderView</span><span style="color: rgb(0, 0, 0);">&#62;</span><span style="color: rgb(0, 0, 0);"> <br />
#include </span><span style="color: rgb(0, 0, 0);">&#60;</span><span style="color: rgb(0, 0, 0);">QtGui</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">QLabel</span><span style="color: rgb(0, 0, 0);">&#62;</span><span style="color: rgb(0, 0, 0);"> <br />
#include </span><span style="color: rgb(0, 0, 0);">&#60;</span><span style="color: rgb(0, 0, 0);">QtGui</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">QMainWindow</span><span style="color: rgb(0, 0, 0);">&#62;</span><span style="color: rgb(0, 0, 0);"> <br />
#include </span><span style="color: rgb(0, 0, 0);">&#60;</span><span style="color: rgb(0, 0, 0);">QtGui</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">QMenu</span><span style="color: rgb(0, 0, 0);">&#62;</span><span style="color: rgb(0, 0, 0);"> <br />
#include </span><span style="color: rgb(0, 0, 0);">&#60;</span><span style="color: rgb(0, 0, 0);">QtGui</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">QMenuBar</span><span style="color: rgb(0, 0, 0);">&#62;</span><span style="color: rgb(0, 0, 0);"> <br />
#include </span><span style="color: rgb(0, 0, 0);">&#60;</span><span style="color: rgb(0, 0, 0);">QtGui</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">QPushButton</span><span style="color: rgb(0, 0, 0);">&#62;</span><span style="color: rgb(0, 0, 0);"> <br />
#include </span><span style="color: rgb(0, 0, 0);">&#60;</span><span style="color: rgb(0, 0, 0);">QtGui</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">QStatusBar</span><span style="color: rgb(0, 0, 0);">&#62;</span><span style="color: rgb(0, 0, 0);"> <br />
#include </span><span style="color: rgb(0, 0, 0);">&#60;</span><span style="color: rgb(0, 0, 0);">QtGui</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">QTextEdit</span><span style="color: rgb(0, 0, 0);">&#62;</span><span style="color: rgb(0, 0, 0);"> <br />
#include </span><span style="color: rgb(0, 0, 0);">&#60;</span><span style="color: rgb(0, 0, 0);">QtGui</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">QToolBar</span><span style="color: rgb(0, 0, 0);">&#62;</span><span style="color: rgb(0, 0, 0);"> <br />
#include </span><span style="color: rgb(0, 0, 0);">&#60;</span><span style="color: rgb(0, 0, 0);">QtGui</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">QWidget</span><span style="color: rgb(0, 0, 0);">&#62;</span><span style="color: rgb(0, 0, 0);"> <br />
<br />
QT_BEGIN_NAMESPACE <br />
<br />
</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> Ui_MainWindow <br />
{ <br />
</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">: <br />
&#160;&#160;&#160;&#160;QAction </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">action; <br />
&#160;&#160;&#160;&#160;QAction </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">action_2; <br />
&#160;&#160;&#160;&#160;QWidget </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">centralWidget; <br />
&#160;&#160;&#160;&#160;QPushButton </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">pushButton; <br />
&#160;&#160;&#160;&#160;QTextEdit </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">textEdit; <br />
&#160;&#160;&#160;&#160;QLabel </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">label; <br />
&#160;&#160;&#160;&#160;QMenuBar </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">menuBar; <br />
&#160;&#160;&#160;&#160;QMenu </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">menu; <br />
&#160;&#160;&#160;&#160;QToolBar </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">mainToolBar; <br />
&#160;&#160;&#160;&#160;QStatusBar </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">statusBar; <br />
<br />
&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> setupUi(QMainWindow </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">MainWindow) <br />
&#160;&#160;&#160;&#160;{ <br />
&#160;&#160;&#160;&#160;&#160;&#160; </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">初始化UI的方法</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">&#160;&#160;&#160;&#160;} </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> setupUi</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);"> <br />
&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> retranslateUi(QMainWindow </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">MainWindow) <br />
&#160;&#160;&#160;&#160;{ <br />
&#160;&#160;&#160;&#160;&#160;&#160; </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">重置UI的方法</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">&#160;&#160;&#160;&#160;} </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> retranslateUi</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);"> <br />
}; <br />
<br />
</span><span style="color: rgb(0, 0, 255);">namespace</span><span style="color: rgb(0, 0, 0);"> Ui { <br />
&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> MainWindow: </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> Ui_MainWindow {}; <br />
} </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> namespace Ui</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);"> <br />
QT_END_NAMESPACE <br />
<br />
</span><span style="color: rgb(0, 0, 255);">#endif</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> UI_MAINWINDOW_H</span><span style="color: rgb(0, 0, 0);"> <br />
</span></div>
</div>
<p>在ui文件中，控件都是以public描述存在的，而我们的主窗体，是要从这个ui的头文件中继承过来，我们可以看到我们的cpp文件中，继承了来自ui里面的类，所以我们的主要编写代码的地方，其实是一个子类，如果我们将这几个文件结构描述成一个图片的话，具体可以描述成下面这样。</p>
<p style="text-align: center;"><img src="/blog/wp-content/uploads/2009/7/qtstruct.png" alt="" /></p>
<p>从上图中我们可以看到，Qt设计器是用来生成XML的UI描述的，然后我们通过uic编译把UI文件编译成头文件。在这一部分，很像我们在C#里面编写的窗体的designer文件，这里生成的头文件负责声明控件的位置，事件的响应等等，和designer非常相似。而主窗体头文件和主窗体主要是C++开发的一贯作风，其实可以看做是一个部分，因为其实际上是从头文件中写方法的。</p>
<p>这样我们就能够比较清楚的了解Qt的代码结构，在后面的开发过程中，我们就可以使用其他的方式去编译Qt项目，当然IDE方式是非常不错的开发方式，但是有时候我们用命令行，能够加深我们的开发过程（例如静态编译和动态编译，如果你不用命令行永远也用不到和不知道这个地方）。</p>
<p>这里我就说一下Qt的代码结构，在后一篇文章我再来说说Qt是怎么响应事件的。</p>]]></description>
			<content:encoded><![CDATA[<p><img align="right" src="/blog/wp-content/uploads/2009/7/logo.png" style="border: 2px solid rgb(204, 204, 204); margin: 5px; padding: 2px;" alt="" />在编程开发中，特别是一开始了解一个语言和一个框架的时候，如果我们解决了语言，IDE以及经典的&ldquo;Hello World&rdquo;程序之后，我们就需要更加深入的了解这个框架以及这个框架给我们提供的便利了，所以这里我们要开始慢慢的了解Qt的结构以及其事件的响应过程。</p>
<p>我们可以看到在Qt Creator中，如果我们创建一个Gui的应用程序，那么Qt Creator会给我们创建若干个文件，我们可以看到我们的主窗体是mainwindow.cpp，其中当然少不了mainwindow.h这个头文件了，我们看看这个头文件的代码。</p>
<div class="code">
<div><span style="color: rgb(0, 0, 0);">#ifndef MAINWINDOW_H <br />
</span><span style="color: rgb(0, 0, 255);">#define</span><span style="color: rgb(0, 0, 0);"> MAINWINDOW_H</span><span style="color: rgb(0, 0, 0);"> </p>
<p>#include </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">QtGui</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">QMainWindow</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"> </p>
<p></span><span style="color: rgb(0, 0, 255);">namespace</span><span style="color: rgb(0, 0, 0);"> Ui <br />
{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> MainWindow; <br />
} </p>
<p></span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> MainWindow : </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> QMainWindow <br />
{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;Q_OBJECT </p>
<p></span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">: <br />
&nbsp;&nbsp;&nbsp;&nbsp;MainWindow(QWidget </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">parent </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 128);">0</span><span style="color: rgb(0, 0, 0);">); <br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0);">~</span><span style="color: rgb(0, 0, 0);">MainWindow(); <br />
</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> slots: <br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> Dosomething(); </p>
<p></span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);">: <br />
&nbsp;&nbsp;&nbsp;&nbsp;Ui::MainWindow </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">ui; <br />
}; </p>
<p></span><span style="color: rgb(0, 0, 255);">#endif</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> MAINWINDOW_H</span></div>
</div>
<p>代码很简单，我们就不详细说了，在这里，我们可以看到头文件中有一个public slots这个修饰符，我们可以留在后面再说。然后我们看看cpp文件。</p>
<div class="code">
<div><span style="color: rgb(0, 0, 0);">#include </span><span style="color: rgb(128, 0, 0);">&quot;</span><span style="color: rgb(128, 0, 0);">mainwindow.h</span><span style="color: rgb(128, 0, 0);">&quot;</span><span style="color: rgb(0, 0, 0);"> <br />
</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">这个头文件在项目中看上去没有</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">#include </span><span style="color: rgb(128, 0, 0);">&quot;</span><span style="color: rgb(128, 0, 0);">ui_mainwindow.h</span><span style="color: rgb(128, 0, 0);">&quot;</span><span style="color: rgb(0, 0, 0);"> </p>
<p>MainWindow::MainWindow(QWidget </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">parent) <br />
&nbsp;&nbsp;&nbsp;&nbsp;: QMainWindow(parent), ui(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Ui::MainWindow) <br />
{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;ui</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">setupUi(</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">); <br />
&nbsp;&nbsp;&nbsp;&nbsp;QObject::connect(ui</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">pushButton, SIGNAL(clicked()), </span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">, SLOT(Dosomething())); <br />
} </p>
<p>MainWindow::</span><span style="color: rgb(0, 0, 0);">~</span><span style="color: rgb(0, 0, 0);">MainWindow() <br />
{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;delete ui; <br />
} </p>
<p></span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> MainWindow::Dosomething() <br />
{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">const</span><span style="color: rgb(0, 0, 0);"> QString str </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(128, 0, 0);">&quot;</span><span style="color: rgb(128, 0, 0);">test</span><span style="color: rgb(128, 0, 0);">&quot;</span><span style="color: rgb(0, 0, 0);">; <br />
&nbsp;&nbsp;&nbsp;&nbsp;ui</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">textEdit</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">setText(str); <br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">this-&gt;~MainWindow();</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">} <br />
</span></div>
</div>
<p>cpp文件也就是我们窗体的主要代码了，这里的代码也很简单，并不复杂，唯一要说的就是头文件了，我们可以看到这里有一个头文件ui_mainwindow.h，而这个头文件在项目中并看不到（通常我们看到的是.ui文件，这个是我们在设计器里面设计生成的xml文件），而我们打开项目所在的文件夹里面，我们是可以看到有ui_mainwindow.h的，因为在编译的时候，编译器为我们重新编译了.ui文件并生成了相应的窗体代码，我们可以看一下窗体代码。&nbsp;</p>
<div class="code">
<div><span style="color: rgb(0, 0, 0);">#ifndef UI_MAINWINDOW_H <br />
</span><span style="color: rgb(0, 0, 255);">#define</span><span style="color: rgb(0, 0, 0);"> UI_MAINWINDOW_H</span><span style="color: rgb(0, 0, 0);"> </p>
<p>#include </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">QtCore</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">QVariant</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"> <br />
#include </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">QtGui</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">QAction</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"> <br />
#include </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">QtGui</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">QApplication</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"> <br />
#include </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">QtGui</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">QButtonGroup</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"> <br />
#include </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">QtGui</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">QHeaderView</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"> <br />
#include </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">QtGui</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">QLabel</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"> <br />
#include </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">QtGui</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">QMainWindow</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"> <br />
#include </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">QtGui</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">QMenu</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"> <br />
#include </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">QtGui</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">QMenuBar</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"> <br />
#include </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">QtGui</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">QPushButton</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"> <br />
#include </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">QtGui</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">QStatusBar</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"> <br />
#include </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">QtGui</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">QTextEdit</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"> <br />
#include </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">QtGui</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">QToolBar</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"> <br />
#include </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">QtGui</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">QWidget</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"> </p>
<p>QT_BEGIN_NAMESPACE </p>
<p></span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> Ui_MainWindow <br />
{ <br />
</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">: <br />
&nbsp;&nbsp;&nbsp;&nbsp;QAction </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">action; <br />
&nbsp;&nbsp;&nbsp;&nbsp;QAction </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">action_2; <br />
&nbsp;&nbsp;&nbsp;&nbsp;QWidget </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">centralWidget; <br />
&nbsp;&nbsp;&nbsp;&nbsp;QPushButton </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">pushButton; <br />
&nbsp;&nbsp;&nbsp;&nbsp;QTextEdit </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">textEdit; <br />
&nbsp;&nbsp;&nbsp;&nbsp;QLabel </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">label; <br />
&nbsp;&nbsp;&nbsp;&nbsp;QMenuBar </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">menuBar; <br />
&nbsp;&nbsp;&nbsp;&nbsp;QMenu </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">menu; <br />
&nbsp;&nbsp;&nbsp;&nbsp;QToolBar </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">mainToolBar; <br />
&nbsp;&nbsp;&nbsp;&nbsp;QStatusBar </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">statusBar; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> setupUi(QMainWindow </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">MainWindow) <br />
&nbsp;&nbsp;&nbsp;&nbsp;{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">初始化UI的方法</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;} </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> setupUi</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);"> <br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> retranslateUi(QMainWindow </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">MainWindow) <br />
&nbsp;&nbsp;&nbsp;&nbsp;{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">重置UI的方法</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;} </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> retranslateUi</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);"> <br />
}; </p>
<p></span><span style="color: rgb(0, 0, 255);">namespace</span><span style="color: rgb(0, 0, 0);"> Ui { <br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> MainWindow: </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> Ui_MainWindow {}; <br />
} </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> namespace Ui</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);"> <br />
QT_END_NAMESPACE </p>
<p></span><span style="color: rgb(0, 0, 255);">#endif</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> UI_MAINWINDOW_H</span><span style="color: rgb(0, 0, 0);"> <br />
</span></div>
</div>
<p>在ui文件中，控件都是以public描述存在的，而我们的主窗体，是要从这个ui的头文件中继承过来，我们可以看到我们的cpp文件中，继承了来自ui里面的类，所以我们的主要编写代码的地方，其实是一个子类，如果我们将这几个文件结构描述成一个图片的话，具体可以描述成下面这样。</p>
<p style="text-align: center;"><img src="/blog/wp-content/uploads/2009/7/qtstruct.png" alt="" /></p>
<p>从上图中我们可以看到，Qt设计器是用来生成XML的UI描述的，然后我们通过uic编译把UI文件编译成头文件。在这一部分，很像我们在C#里面编写的窗体的designer文件，这里生成的头文件负责声明控件的位置，事件的响应等等，和designer非常相似。而主窗体头文件和主窗体主要是C++开发的一贯作风，其实可以看做是一个部分，因为其实际上是从头文件中写方法的。</p>
<p>这样我们就能够比较清楚的了解Qt的代码结构，在后面的开发过程中，我们就可以使用其他的方式去编译Qt项目，当然IDE方式是非常不错的开发方式，但是有时候我们用命令行，能够加深我们的开发过程（例如静态编译和动态编译，如果你不用命令行永远也用不到和不知道这个地方）。</p>
<p>这里我就说一下Qt的代码结构，在后一篇文章我再来说说Qt是怎么响应事件的。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jguoer.com/blog/index.php/archives/315/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Qt &#8211; 开发简单的UI程序</title>
		<link>http://www.jguoer.com/blog/index.php/archives/317</link>
		<comments>http://www.jguoer.com/blog/index.php/archives/317#comments</comments>
		<pubDate>Fri, 24 Jul 2009 17:11:00 +0000</pubDate>
		<dc:creator>诡异的西红柿</dc:creator>
				<category><![CDATA[QT]]></category>
		<category><![CDATA[开发]]></category>

		<guid isPermaLink="false">/post/2009/07/25/Qt-A-Easy-Program-With-UI.aspx</guid>
		<description><![CDATA[<p><img align="right" alt="" style="border: 2px solid rgb(204, 204, 204); margin: 5px; padding: 2px;" src="/blog/wp-content/uploads/2009/7/logo.png" />今天在家弄了一下Qt，感觉Qt4要比Qt3方便了很多，但是性能的地方我不知道是不是会有所下降，这个我倒没全面的测试，倒是我觉得Qt在UI程序开发上面更加容易了，Qt的编译器和设计器都比老早的版本要好很多，体验也很不错，对于开发人员来说真的是非常方便了。说到这里，我倒觉得Qt在这方面要比MFC好不少，因为MFC无论是命名还是设计UI都挺麻烦的。。</p>
<p>Qt开发程序变简单了，我们可以用Qt Creatot开发Qt程序，其实用VS2008也是可以开发Qt程序的，我在公司编译了Qt编译了一下午，还会出现一些小问题，再加上没有智能提示，我就没有用VS了，而Qt Creatot还是挺不错的，比早期的编译器要好很多，所以我选择了Qt Creatot，当然如果你习惯了用VS做开发，VS也是一个不错的选择。</p>
<p>首先用Qt Creatot创建一个新项目。</p>
<p style="text-align: center;"><img style="border: 1px solid rgb(204, 204, 204); padding: 2px;" alt="" src="/blog/wp-content/uploads/2009/7/qt1.png" /></p>
<p>这里我们可以看到可以用Qt框架去做很多程序，不过普遍来说就是一个Winform程序和命令行程序了，这里我们选带有Gui的窗体程序做开发。在选择了之后，会有一些提供的类库选择，如果没有特别的功能，我们就默认就行了。</p>
<p style="text-align: center;"><img style="border: 1px solid rgb(204, 204, 204); padding: 2px;" src="/blog/wp-content/uploads/2009/7/qt2.png" alt="" /></p>
<p>我们可以看到Qt为我们创建了一些文件，其中pro文件指定了编译器需要用到的库文件及其路径。然后剩下的就是cpp文件了。除了cpp和h文件以外，还有ui文件，ui文件就是用来我们去制作ui的，我们双击ui文件，可以看到ui设计器。</p>
<p style="text-align: center;"><img style="border: 1px solid rgb(204, 204, 204); padding: 2px;" alt="" src="/blog/wp-content/uploads/2009/7/qt3.png" /></p>
<p>可以看到做C++已经比较容易了，然后我们再绘制一些窗体所需要的元素，就可以了。（这里我们可以看到这个窗体是用XML描述的，也就是说窗体的一些东西都是用XML定义的，具备不错的扩展性）。然后我们可以直接运行，就能够运行我们的一个UI程序了。</p>
<p style="text-align: center;"><img style="border: 1px solid rgb(204, 204, 204); padding: 2px;" src="/blog/wp-content/uploads/2009/7/qt4.png" alt="" /></p>
<p>这样，一个C++制作的UI的应用程序就OK了，我们就可以直接运行exe来运行这个窗体文件了。Qt在制作窗体文件的时候极大的方便了我们进行开发，在MFC里面，我们经常需要获取设备上下文来设置我们所需要的实例的属性，这样麻烦也不可读，在Qt里面，很多都是以类似C#的命名方式去命名的，所以就简单很多了。</p>]]></description>
			<content:encoded><![CDATA[<p><img align="right" alt="" style="border: 2px solid rgb(204, 204, 204); margin: 5px; padding: 2px;" src="/blog/wp-content/uploads/2009/7/logo.png" />今天在家弄了一下Qt，感觉Qt4要比Qt3方便了很多，但是性能的地方我不知道是不是会有所下降，这个我倒没全面的测试，倒是我觉得Qt在UI程序开发上面更加容易了，Qt的编译器和设计器都比老早的版本要好很多，体验也很不错，对于开发人员来说真的是非常方便了。说到这里，我倒觉得Qt在这方面要比MFC好不少，因为MFC无论是命名还是设计UI都挺麻烦的。。</p>
<p>Qt开发程序变简单了，我们可以用Qt Creatot开发Qt程序，其实用VS2008也是可以开发Qt程序的，我在公司编译了Qt编译了一下午，还会出现一些小问题，再加上没有智能提示，我就没有用VS了，而Qt Creatot还是挺不错的，比早期的编译器要好很多，所以我选择了Qt Creatot，当然如果你习惯了用VS做开发，VS也是一个不错的选择。</p>
<p>首先用Qt Creatot创建一个新项目。</p>
<p style="text-align: center;"><img style="border: 1px solid rgb(204, 204, 204); padding: 2px;" alt="" src="/blog/wp-content/uploads/2009/7/qt1.png" /></p>
<p>这里我们可以看到可以用Qt框架去做很多程序，不过普遍来说就是一个Winform程序和命令行程序了，这里我们选带有Gui的窗体程序做开发。在选择了之后，会有一些提供的类库选择，如果没有特别的功能，我们就默认就行了。</p>
<p style="text-align: center;"><img style="border: 1px solid rgb(204, 204, 204); padding: 2px;" src="/blog/wp-content/uploads/2009/7/qt2.png" alt="" /></p>
<p>我们可以看到Qt为我们创建了一些文件，其中pro文件指定了编译器需要用到的库文件及其路径。然后剩下的就是cpp文件了。除了cpp和h文件以外，还有ui文件，ui文件就是用来我们去制作ui的，我们双击ui文件，可以看到ui设计器。</p>
<p style="text-align: center;"><img style="border: 1px solid rgb(204, 204, 204); padding: 2px;" alt="" src="/blog/wp-content/uploads/2009/7/qt3.png" /></p>
<p>可以看到做C++已经比较容易了，然后我们再绘制一些窗体所需要的元素，就可以了。（这里我们可以看到这个窗体是用XML描述的，也就是说窗体的一些东西都是用XML定义的，具备不错的扩展性）。然后我们可以直接运行，就能够运行我们的一个UI程序了。</p>
<p style="text-align: center;"><img style="border: 1px solid rgb(204, 204, 204); padding: 2px;" src="/blog/wp-content/uploads/2009/7/qt4.png" alt="" /></p>
<p>这样，一个C++制作的UI的应用程序就OK了，我们就可以直接运行exe来运行这个窗体文件了。Qt在制作窗体文件的时候极大的方便了我们进行开发，在MFC里面，我们经常需要获取设备上下文来设置我们所需要的实例的属性，这样麻烦也不可读，在Qt里面，很多都是以类似C#的命名方式去命名的，所以就简单很多了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jguoer.com/blog/index.php/archives/317/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Qt &#8211; C++ Development Framework</title>
		<link>http://www.jguoer.com/blog/index.php/archives/319</link>
		<comments>http://www.jguoer.com/blog/index.php/archives/319#comments</comments>
		<pubDate>Thu, 23 Jul 2009 14:29:00 +0000</pubDate>
		<dc:creator>诡异的西红柿</dc:creator>
				<category><![CDATA[C Plus Plus]]></category>
		<category><![CDATA[QT]]></category>
		<category><![CDATA[开发]]></category>

		<guid isPermaLink="false">/post/2009/07/23/Qt-45-Framework.aspx</guid>
		<description><![CDATA[<p><img align="right" src="/blog/wp-content/uploads/2009/7/logo.png" style="border: 2px solid rgb(204, 204, 204); margin: 5px; padding: 2px;" alt="" />今天有空下了Qt最新版本，因为编译要用很长时间，我就挂着让它自己编译，但是到后来才发现用VS编译还不如自带的IDE，虽然功能很少，但也五脏俱全，调试什么的都还不错，Qt是C++的开发框架，可以支持Windows，Linux等平台，也可以开发WinCE，我记得我是两年前用的这个框架，当时这个框架的文章并不是很完全，而且SDK也并不是那么好，所以就没有继续使用了。最近想用C++做点东西，所以就用Qt这个框架。</p>
<p>总体来说Qt这个框架还是很不错的，编写代码的时候非常简单，写起来和C#差不多的，例如读写文件，我们用C++其实是很麻烦的，但是用Qt的话就简单多了，可以看看下面的代码。</p>
<div class="code">
<div><span style="color: rgb(0, 0, 0);">#include </span><span style="color: rgb(0, 0, 0);">&#60;</span><span style="color: rgb(0, 0, 0);">QtCore</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">QCoreApplication</span><span style="color: rgb(0, 0, 0);">&#62;</span><span style="color: rgb(0, 0, 0);"> <br />
#include </span><span style="color: rgb(0, 0, 0);">&#60;</span><span style="color: rgb(0, 0, 0);">QDebug</span><span style="color: rgb(0, 0, 0);">&#62;</span><span style="color: rgb(0, 0, 0);"> <br />
#include </span><span style="color: rgb(0, 0, 0);">&#60;</span><span style="color: rgb(0, 0, 0);">QString</span><span style="color: rgb(0, 0, 0);">&#62;</span><span style="color: rgb(0, 0, 0);"> <br />
#include </span><span style="color: rgb(0, 0, 0);">&#60;</span><span style="color: rgb(0, 0, 0);">QFile</span><span style="color: rgb(0, 0, 0);">&#62;</span><span style="color: rgb(0, 0, 0);"> <br />
<br />
</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> main(</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> argc, </span><span style="color: rgb(0, 0, 255);">char</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">argv[]) <br />
{ <br />
&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">窗体的初始化</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">&#160;&#160;&#160;&#160;QCoreApplication a(argc, argv); <br />
&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">Qt框架提供的类，类名和文件名一样</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">&#160;&#160;&#160;&#160;QString str </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 0);">&#34;</span><span style="color: rgb(128, 0, 0);">this is a test</span><span style="color: rgb(128, 0, 0);">&#34;</span><span style="color: rgb(0, 0, 0);">; <br />
&#160;&#160;&#160;&#160;QFile file(</span><span style="color: rgb(128, 0, 0);">&#34;</span><span style="color: rgb(128, 0, 0);">E:\\eula.1028.txt</span><span style="color: rgb(128, 0, 0);">&#34;</span><span style="color: rgb(0, 0, 0);">); <br />
<br />
&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">(file.open(QIODevice::ReadOnly</span><span style="color: rgb(0, 0, 0);">&#124;</span><span style="color: rgb(0, 0, 0);">QIODevice::Text)) <br />
&#160;&#160;&#160;&#160;{ <br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;QTextStream stream(</span><span style="color: rgb(0, 0, 0);">&#38;</span><span style="color: rgb(0, 0, 0);">file); <br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 0, 255);">while</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(0, 0, 0);">!</span><span style="color: rgb(0, 0, 0);">stream.atEnd()) <br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{ <br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;QString tempStr </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> stream.readLine(); <br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;qDebug() </span><span style="color: rgb(0, 0, 0);">&#60;&#60;</span><span style="color: rgb(0, 0, 0);"> tempStr; <br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;} <br />
&#160;&#160;&#160;&#160;} <br />
<br />
&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> a.exec(); <br />
} <br />
</span></div>
</div>
<p>我们可以看到代码和C#很像，而且文档也很齐全，直接到<a href="http://doc.qtsoftware.com/4.5/classes.html">这里</a>就可以看到所有的类，并且可以很快的查询，在数据类型上面，也比C++要多很多，所以开发人员不用再忙着数据类型的转换以及考虑过多的内存泄露等问题了。</p>
<p>不过用C++还是要注意在不用该对象的时候，析构一下这个对象，免得对象多了内存泄露啥的就很头疼了。</p>
<p style="text-align: center;"><img src="/blog/wp-content/uploads/2009/7/qt.png" style="border: 1px solid rgb(204, 204, 204); padding: 2px;" alt="" /></p>
<p>另外，Qt还支持很多框架，所以喜欢做游戏，数据库开发，脚本开发，网页开发，单元测试的也可以使用Qt框架。总体来说Qt还是不错，做可移植性的桌面应用还是很不错的。</p>
<p>只是很可惜的是，Qt的<strong>性能并不是那么好</strong>，就是这段代码，在C#中，用ReadLine方法读1G的文件只要17秒，还是我的破机器上面，但是用Qt做却要3分钟，性能差了不是一点点啊，都是ReadLine，怎么差别这么大呢。本来还想用Qt在比赛中投机取巧的。。哎。。看来是不行了。。所以我还是觉得，微软在基础研究和学习上面还是做的很不错的，当然，google也很不错，开源社区在这方面还是有一点距离的。</p>]]></description>
			<content:encoded><![CDATA[<p><img align="right" src="/blog/wp-content/uploads/2009/7/logo.png" style="border: 2px solid rgb(204, 204, 204); margin: 5px; padding: 2px;" alt="" />今天有空下了Qt最新版本，因为编译要用很长时间，我就挂着让它自己编译，但是到后来才发现用VS编译还不如自带的IDE，虽然功能很少，但也五脏俱全，调试什么的都还不错，Qt是C++的开发框架，可以支持Windows，Linux等平台，也可以开发WinCE，我记得我是两年前用的这个框架，当时这个框架的文章并不是很完全，而且SDK也并不是那么好，所以就没有继续使用了。最近想用C++做点东西，所以就用Qt这个框架。</p>
<p>总体来说Qt这个框架还是很不错的，编写代码的时候非常简单，写起来和C#差不多的，例如读写文件，我们用C++其实是很麻烦的，但是用Qt的话就简单多了，可以看看下面的代码。</p>
<div class="code">
<div><span style="color: rgb(0, 0, 0);">#include </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">QtCore</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">QCoreApplication</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"> <br />
#include </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">QDebug</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"> <br />
#include </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">QString</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"> <br />
#include </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">QFile</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"> </p>
<p></span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> main(</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> argc, </span><span style="color: rgb(0, 0, 255);">char</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">argv[]) <br />
{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">窗体的初始化</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;QCoreApplication a(argc, argv); <br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">Qt框架提供的类，类名和文件名一样</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;QString str </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 0);">&quot;</span><span style="color: rgb(128, 0, 0);">this is a test</span><span style="color: rgb(128, 0, 0);">&quot;</span><span style="color: rgb(0, 0, 0);">; <br />
&nbsp;&nbsp;&nbsp;&nbsp;QFile file(</span><span style="color: rgb(128, 0, 0);">&quot;</span><span style="color: rgb(128, 0, 0);">E:\\eula.1028.txt</span><span style="color: rgb(128, 0, 0);">&quot;</span><span style="color: rgb(0, 0, 0);">); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">(file.open(QIODevice::ReadOnly</span><span style="color: rgb(0, 0, 0);">|</span><span style="color: rgb(0, 0, 0);">QIODevice::Text)) <br />
&nbsp;&nbsp;&nbsp;&nbsp;{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QTextStream stream(</span><span style="color: rgb(0, 0, 0);">&amp;</span><span style="color: rgb(0, 0, 0);">file); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">while</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(0, 0, 0);">!</span><span style="color: rgb(0, 0, 0);">stream.atEnd()) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QString tempStr </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> stream.readLine(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;qDebug() </span><span style="color: rgb(0, 0, 0);">&lt;&lt;</span><span style="color: rgb(0, 0, 0);"> tempStr; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />
&nbsp;&nbsp;&nbsp;&nbsp;} </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> a.exec(); <br />
} <br />
</span></div>
</div>
<p>我们可以看到代码和C#很像，而且文档也很齐全，直接到<a href="http://doc.qtsoftware.com/4.5/classes.html">这里</a>就可以看到所有的类，并且可以很快的查询，在数据类型上面，也比C++要多很多，所以开发人员不用再忙着数据类型的转换以及考虑过多的内存泄露等问题了。</p>
<p>不过用C++还是要注意在不用该对象的时候，析构一下这个对象，免得对象多了内存泄露啥的就很头疼了。</p>
<p style="text-align: center;"><img src="/blog/wp-content/uploads/2009/7/qt.png" style="border: 1px solid rgb(204, 204, 204); padding: 2px;" alt="" /></p>
<p>另外，Qt还支持很多框架，所以喜欢做游戏，数据库开发，脚本开发，网页开发，单元测试的也可以使用Qt框架。总体来说Qt还是不错，做可移植性的桌面应用还是很不错的。</p>
<p>只是很可惜的是，Qt的<strong>性能并不是那么好</strong>，就是这段代码，在C#中，用ReadLine方法读1G的文件只要17秒，还是我的破机器上面，但是用Qt做却要3分钟，性能差了不是一点点啊，都是ReadLine，怎么差别这么大呢。本来还想用Qt在比赛中投机取巧的。。哎。。看来是不行了。。所以我还是觉得，微软在基础研究和学习上面还是做的很不错的，当然，google也很不错，开源社区在这方面还是有一点距离的。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jguoer.com/blog/index.php/archives/319/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

