﻿<?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>七维森林七维森林 |  &#187; Qt应用</title>
	<atom:link href="http://lizehong.freevar.com/?cat=55&#038;feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://lizehong.freevar.com</link>
	<description>技术爆炸、文明生存与个体价值</description>
	<lastBuildDate>Sat, 08 Dec 2012 14:07:20 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.4</generator>
		<item>
		<title>Qt中的消息通知和事件发送</title>
		<link>http://lizehong.freevar.com/?p=310</link>
		<comments>http://lizehong.freevar.com/?p=310#comments</comments>
		<pubDate>Sun, 22 Jul 2012 13:00:46 +0000</pubDate>
		<dc:creator>Lee</dc:creator>
				<category><![CDATA[Qt应用]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[QTE]]></category>

		<guid isPermaLink="false">http://lizehong.freevar.com/?p=310</guid>
		<description><![CDATA[Qt中的信号和槽机制、事件机制是其具有特色的两大机制。利用这两种机制可以轻松地实现需要的消息通知和事件通知。 1、信号和槽机制 充分使用Qt库中已经定义和实现好的对象的信号和槽函数，如按钮的clicked()/pressed()信号等，它们能满足很多的需求； 自定义缺乏的信号和槽 … <a href="http://lizehong.freevar.com/?p=310"> Continue reading <span class="meta-nav">&#8594; </span></a>]]></description>
			<content:encoded><![CDATA[<p>Qt中的信号和槽机制、事件机制是其具有特色的两大机制。利用这两种机制可以轻松地实现需要的消息通知和事件通知。</p>
<p>1、信号和槽机制</p>
<ul>
<li>充分使用Qt库中已经定义和实现好的对象的信号和槽函数，如按钮的clicked()/pressed()信号等，它们能满足很多的需求；</li>
<li>自定义缺乏的信号和槽函数，借助Qt的元对象系统和内省机制，在创建类时添加Q_OBJECT宏，使用signals:/slots:标记添加自定义的信号/槽函数，使用时通过emit发送信号，用connect()函数连接信号和槽。</li>
</ul>
<p>2、事件机制</p>
<ul>
<li>充分使用Qt库中已经定义好的标准事件对象，如鼠标事件QMouseEvent、键盘事件QKeyPressEvent等，自定义实现事件的处理函数，如keyPressEvent（QEvent*）；</li>
<li>自定义需要的事件类型和实现QObject::customEvent(QEvent*)函数，使用Qt的postEvent和sendEvent函数发送事件通知。</li>
</ul>
<p>(1)、自定义事件：</p>
<ul>
<li>方式一；通过QEvent::Type指定事件类型的值，然后new一个该类型的自定义事件，如：</li>
</ul>
<pre class="brush: cpp; gutter: true">const QEvent::Type MyEvent = (QEvent::Type)9393;
QApplication::postEvent(object, new QCustomEvent(MyEvent));</pre>
<p>QCustomEvent类是Qt3中的类，现在已经不推荐使用了。<br />
QEvent::Type是Qt中的枚举类型，Qt定义了一大堆的库事件类型常数值，当然也允许用户自定义自己的事件类型值，但是自定义的值应大于1000(QEvent::User)，且小于65535(QEvent::MaxUser).方便起见，可以使用int QEvent::registerEventType ( int hint = -1 ) [static]函数注册和保留一个自定义的事件类型值，这样可以避免不小心重复使用了同一个事件类型值，它保证每次得到一个未被使用的事件类型常数值，该函数是线程安全的，在Qt4.4中引入。</p>
<ul>
<li>方式二：通过继承QEvent创建新的事件类，如：
<pre class="brush: cpp; gutter: true">class CMyCustomEvent：public QEvent
{
	public:
		CMyCustomEvent(int data):m_iData(data),QEvent((QEvent::Type)9393){}
	private:
		int m_iData;
		...
};</pre>
</li>
</ul>
<p>(2)、发送事件：postEvent/sendEvent/notify</p>
<ul>
<li>postEvent函数：
<pre class="brush: cpp; gutter: true">void QCoreApplication::postEvent ( QObject * receiver, QEvent * event ) [static]//异步</pre>
</li>
</ul>
<p>将事件放入事件消息队列中，然后立即返回，函数只将事件放入队列的尾端，不保证事件立即得到处理。事件必须是分配在堆上的，即new出来的，因为在事件被发送出去后，事件队列就拥有了事件的，事件处理完后Qt会自动delete该事件，因此在把事件posted出去后再尝试使用它是不安全的。<br />
当程序控制到达主事件循环时，事件队列中的所有事件才用notify函数发送。事件的处理是按照其发送到队列中的顺序进行的，如果想要控制事件的优先级，可以考虑它的带优先级参数的重载函数。</p>
<pre class="brush: cpp; gutter: true">void QCoreApplication::postEvent ( QObject * receiver, QEvent * event, int priority ) [static]//Qt4.3引入</pre>
<p>这两个函数都是线程安全的。</p>
<ul>
<li>sendEvent函数：
<pre class="brush: cpp; gutter: true">bool QCoreApplication::sendEvent ( QObject * receiver, QEvent * event ) [static]//同步</pre>
</li>
</ul>
<p>用notify函数将事件直接派发给接收者和进行处理，返回事件处理者的返回值。事件会立即送至接受者，被发送后，Qt不会自动delete该事件，因此合适的做法是在栈上创建事件。</p>
<ul>
<li>sendPostedEvents：</li>
</ul>
<pre class="brush: cpp; gutter: true">void QCoreApplication::sendPostedEvents ( QObject * receiver, int event_type ) [static]</pre>
<p>将事件队列中用postEvent函数放入的对应接受者和事件类型的事件立即分发，但是来自窗口系统的事件不被分发，它们被processEvents()函数分发。<br />
如果接受者是null，则对应所有的接受者；如果event_type为0，则对应receiver的所有的事件。该函数必须和receiver在同一个线程内被调用。<br />
void QCoreApplication::sendPostedEvents () [static]<br />
分发事件队列中的所有事件，即清空事件队列。</p>
<ul>
<li>notify：
<pre class="brush: cpp; gutter: false">bool QCoreApplication::notify ( QObject * receiver, QEvent * event ) [virtual]</pre>
</li>
</ul>
<p>这是事件机制中最基本的函数，所有的事件发送最终都要调用这个函数。它把事件信号发送给接受者，并返回receiver-&gt;event(event)处理的返回值。</p>
<p>(3)、处理事件：void QObject::customEvent ( QEvent * event ) [virtual protected]<br />
通过重载实现customEvent函数，可以对自定义的事件进行灵活的处理，如：</p>
<pre class="brush: cpp; gutter: true">void MyWidget::customEvent(QEvent *event)
{
	if (event-&gt;type() == MyCustomEvent)
	{
	   QMessageBox msgBox;
	   msgBox.setText(&quot;The is mycustomevent example.&quot;);
	   msgBox.exec();
	}
	else if(...)
	{
		...
	}
	...
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://lizehong.freevar.com/?feed=rss2&#038;p=310</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>工作笔记（04/2012）</title>
		<link>http://lizehong.freevar.com/?p=304</link>
		<comments>http://lizehong.freevar.com/?p=304#comments</comments>
		<pubDate>Thu, 19 Jul 2012 14:05:13 +0000</pubDate>
		<dc:creator>Lee</dc:creator>
				<category><![CDATA[Qt应用]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[QTE]]></category>
		<category><![CDATA[工作]]></category>
		<category><![CDATA[笔记]]></category>

		<guid isPermaLink="false">http://lizehong.freevar.com/?p=304</guid>
		<description><![CDATA[1、通过使用widget的setfont函数可以设置界面所有文字的字体。 2、使用widget的setFocusPolicy函数来控制其焦点的获取，或者是禁止其使用Qt默认的焦点转移行为。 void setFocusPolicy(Qt::NoFocus); //禁止焦点的获取,也 … <a href="http://lizehong.freevar.com/?p=304"> Continue reading <span class="meta-nav">&#8594; </span></a>]]></description>
			<content:encoded><![CDATA[<p>1、通过使用widget的setfont函数可以设置界面所有文字的字体。</p>
<p>2、使用widget的setFocusPolicy函数来控制其焦点的获取，或者是禁止其使用Qt默认的焦点转移行为。</p>
<pre class="brush: cpp; gutter: false">void setFocusPolicy(Qt::NoFocus); //禁止焦点的获取,也将禁止默认的焦点行为
void setFocus(); //获取焦点，接收键盘事件等</pre>
<ul>
<li>拥有焦点（Focus）的widget才能接受键盘事件</li>
</ul>
<p>3、Qt应用中new出来的控件，一般Qt会在应用的主窗体关闭时（准确说应该是应用退出时）自动负责delete掉；<br />
也可以自己手动delete掉，或者通过设置相应的属性如：setAttribute(Qt::WA_DeleteOnClose);来实现。<br />
但是有一些注意事项：</p>
<ul>
<li>注意是否会对控件进行多次的delete操作；</li>
<li>手动delete时，必须先delete掉子对象，再delete父对象，否则会出现对子对象delete两次的操作错误；</li>
<li>通过new []的方法创建的控件组，必须手动使用delete []的方式进行释放，否则Qt自动delete时会出错。</li>
</ul>
<p>4、使用C库中的fread、fwrite函数进行文件的读写时，如果要使用fseek函数进行文件指针的移动，最好使用SEEK_SET作为参考位置</p>
<ul>
<li>对文件进行修改写操作时，文件偏移以SEEK_SET作为参考位置，尤其是会对一个文件在多个位置进行写操作时。</li>
<li>把文件的内容全部读出进行需要的修改，然后再把修改好的内容重新写回到文件中，以避免位置移动的偏差。</li>
</ul>
<p>5、去除QTE应用程序在开发板上显示时的鼠标指针：编译QTE的库时，加上选项 -no-feature-CURSOR -no-feature-QWS_CURSOR<br />
或者修改qconfig-xxx.h配置文件，增加宏</p>
<pre class="brush: cpp; gutter: false">#define QT_NO_CURSOR;
#define QT_NO_QWS_CURSOR;</pre>
<p>6、QTE应用中文显示问题的定位：</p>
<ul>
<li>中文不显示，但英文正常显示&#8212;&#8211;没有中文字体，下载字体，并设置正确的字体环境变量</li>
<li>中文乱码&#8212;-有中文字体，但是中文的编码不对</li>
</ul>
<p>7、在linux中使用configure安装应用程序时，如果需要多次或重新安装同一应用程序，在每次安装完后，使用make confclean后再执行configure配置。否则会对前一次的安装目录进行覆盖安装，而不是在configure中新的-prefix选项指定目录中安装</p>
<p>8、QTE库编译安装的选项配置，参考其自身的qconfig-minimal.h等五个配置文件以及qfeatures.txt特性文件编写项目的配置文件【推荐】，也可以直接在configure中通过 -no-feature-&lt;feature&gt; -feature-&lt;feature&gt; 选项进行特性的定制</p>
<p>9、可以通过编译QTE目录tools/下的相关工程来使用对应的工具：如qvfb/makeqpf工具等。</p>
<p>10、QTE configure中使用-fast -optimized-qmake选项之一时会导致-embedded x86的make失败，原因不确定。</p>
<p>11、linux下使用free/top命令监控系统的内存使用、性能状态</p>
<ul>
<li>VIRT=SWAP+RES 应用占有的地址空间，要求的虚拟内存</li>
<li>RES=CODE+DATA 应用程序真正使用的内存，常驻内存</li>
<li>SHR 共享内存大小</li>
</ul>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://lizehong.freevar.com/?feed=rss2&#038;p=304</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>工作笔记（03/2012）</title>
		<link>http://lizehong.freevar.com/?p=301</link>
		<comments>http://lizehong.freevar.com/?p=301#comments</comments>
		<pubDate>Thu, 19 Jul 2012 13:53:20 +0000</pubDate>
		<dc:creator>Lee</dc:creator>
				<category><![CDATA[Qt应用]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[QTE]]></category>
		<category><![CDATA[工作]]></category>
		<category><![CDATA[笔记]]></category>

		<guid isPermaLink="false">http://lizehong.freevar.com/?p=301</guid>
		<description><![CDATA[1、QTableView QTableWidget中翻页功能的实现 通过QTableView中的滑动条位置的获取与设置来实现： //通过其继承的函数获取当前滑动条 QScrollBar * QAbstractScrollArea::verticalScrollBar () con … <a href="http://lizehong.freevar.com/?p=301"> Continue reading <span class="meta-nav">&#8594; </span></a>]]></description>
			<content:encoded><![CDATA[<p>1、QTableView QTableWidget中翻页功能的实现<br />
通过QTableView中的滑动条位置的获取与设置来实现：</p>
<pre class="brush: cpp; gutter: false">//通过其继承的函数获取当前滑动条
QScrollBar * QAbstractScrollArea::verticalScrollBar () const；
//获取当前滑动条的位置
int QAbstractSlider::value () const；
//设置当前滑动条的位置
void QAbstractSlider::setSliderPosition ( int )；</pre>
<p>通过传入上一页或下一页的滑动条位置来实现翻页。<br />
上一页的位置 = 当前位置 &#8211; 一页显示的行数；<br />
下一页的位置 = 当前位置 + 一页显示的行数；<br />
注意确保位置的有效性：上一页的位置&gt;=0；下一页的位置&lt;=最大位置；<br />
滑动条能移动的最大位置获取：<br />
int QAbstractSlider::maximum () const；</p>
<p>2、QTableView QTableWidget中平均分布各列（行）或者使最后一列自适应宽度的实现</p>
<pre class="brush: cpp; gutter: false">//使行列头自适应界面宽度
QHeaderView * QTableView::horizontalHeader () const； //行标题
QHeaderView * QTableView::verticalHeader () const； //列标题
void QHeaderView::setStretchLastSection ( bool stretch );//最后一行（列）填充空白
void QHeaderView::setResizeMode ( ResizeMode mode = QHeaderView::Stretch )；//所有行（列）均分填充空白</pre>
<p>3、QListWidget中条目的删除实现</p>
<pre class="brush: cpp; gutter: false">//先移除该条目的父子关系
QListWidgetItem * QListWidget::takeItem ( int row )；//移除后不再由Qt管理该对象，必须进行手动delete
//然后手动delete该条目
delete pTmpListWidgetItem；//例子
使用下面的函数不能实现条目的删除效果：
void QListWidget::removeItemWidget ( QListWidgetItem * item )；//introduced in Qt 4.3.</pre>
<p>4、QWidget关闭时对用户进行关闭提示的实现<br />
通过重载closeEvent()事件处理函数来实现<br />
void QWidget::closeEvent ( QCloseEvent * event )； [virtual protected]<br />
示例：</p>
<pre class="brush: cpp; gutter: true">void CExecResultWidget::closeEvent(QCloseEvent *event)
{
	int ret = QMessageBox::question(this, tr(&quot;关闭窗口&quot;), 
		tr(&quot;是否确定关闭当前执行方案结果界面？&quot;), 
		QMessageBox::Yes |QMessageBox::No,QMessageBox::No);
	if(ret == QMessageBox::Yes)
	{
		event-&gt;accept();
	}
	else 
	{
		event-&gt;ignore();
	}
}</pre>
<p>5、登录对话框类GUI的实现机制<br />
使用QDialog的exec()函数与Accepted/Rejected属性实现</p>
<p>6、QWidget关闭内容，关闭程序时关闭所有打开窗口的实现</p>
<pre class="brush: cpp; gutter: false">//关闭相关的槽函数
//发送QCloseEvent，closeEvent()默认实现为隐藏QWidget，与setAttribute()的设置有关
bool QWidget::close (); [slot] 
//应用成功退出，等价于调用exit(0)
void QCoreApplication::quit (); [static slot]
//结束exec的事件循环，退出应用：0表示成功，否则失败
void QCoreApplication::exit ( int returnCode = 0 )； [static]</pre>
<p>关闭程序时关闭所有打开窗口的实现<br />
方法一：建立各窗口之间的父子关系，则关闭父窗口时，所有的子窗口将被关闭<br />
方法二：在main.cpp中连接信号void QApplication::lastWindowClosed ();[signal]到quit函数</p>
<pre class="brush: cpp; gutter: false">//1.首先设置主窗口的属性，也可以不设，因为默认所有的QWidget该属性为真
void QWidget::setAttribute(Qt::WA_QuitOnClose,true); 
//2.因为默认的关系，必须设置其它独立窗口的该属性为false，只能有一个窗口的该属性为真
void QWidget::setAttribute(Qt::WA_QuitOnClose,false); 
//3.在main.cpp中连接信号与槽
QApplication a(argc, argv);
a.connect(&amp;a, SIGNAL(lastWindowClosed()), &amp;a, SLOT(quit));</pre>
<p>就可实现当关闭主窗口时，所有的打开窗口都会因程序退出而被关闭。</p>
<p>7、父子QWidget的关系与独立窗口的父子QWidget实现</p>
<ul>
<li>存在父子关系的widgets，每个子widget都显示在父widget内.</li>
<li>当父widget析构时，所有的子widget自动析构</li>
<li>如果一个widget构造时没有父对象，那么被视为一个窗口，或者顶级widget.</li>
<li>当一个QDialog为一个widget的子widget时，可以显示为一个独立的窗口，但是一个QWidget为一个widget时则显示在父QWidget内.</li>
<li>一个QMainWindow窗口中不能再设置布局，只能设置中心QWidget，因此间接的布局方法是借用中心窗体</li>
</ul>
<pre class="brush: cpp; gutter: false">QWidget widget.setLayout(pMainLayout);
QMainWindow mainwindow.setCentralWidget(widget);</pre>
<p>&nbsp;</p>
<ul>
<li>一个QDialog中可以再设置布局</li>
</ul>
<p>8、Qt中使用信号与槽机制时的注意事项</p>
<ul>
<li>信号与槽的实现函数中，函数的参数要慎重的使用C++的引用，因为引用的数据可能已经被析构掉了.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://lizehong.freevar.com/?feed=rss2&#038;p=301</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>工作笔记（02/2012）</title>
		<link>http://lizehong.freevar.com/?p=297</link>
		<comments>http://lizehong.freevar.com/?p=297#comments</comments>
		<pubDate>Thu, 19 Jul 2012 13:28:04 +0000</pubDate>
		<dc:creator>Lee</dc:creator>
				<category><![CDATA[Qt应用]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[QTE]]></category>
		<category><![CDATA[工作]]></category>
		<category><![CDATA[笔记]]></category>

		<guid isPermaLink="false">http://lizehong.freevar.com/?p=297</guid>
		<description><![CDATA[1.设置widget背景图片 使用QPalette属性，相关的方法: setAutoFillBackground(true); palette.setBrush(...); setPalette(palette); setMask(pixmap.mask()); 2.去掉widg … <a href="http://lizehong.freevar.com/?p=297"> Continue reading <span class="meta-nav">&#8594; </span></a>]]></description>
			<content:encoded><![CDATA[<p>1.设置widget背景图片<br />
使用QPalette属性，相关的方法:</p>
<pre class="brush: cpp; gutter: true">setAutoFillBackground(true);
palette.setBrush(...);
setPalette(palette);
setMask(pixmap.mask());</pre>
<p>2.去掉widget的标题栏方法</p>
<pre class="brush: cpp; gutter: true">setWindowFlags（Qt::FramelessWindowHint);</pre>
<p>3.Qt接口实现本地文件的列表显示与删除拷贝实现</p>
<pre class="brush: cpp; gutter: true">QFileInfoList filelist = dir.entryInfoList(string, QDir::Files, QDir::Name); //获取文件列表
QFileInfoList QDir::entryInfoList ( const QStringList &amp; nameFilters, Filters filters = NoFilter, SortFlags sort = NoSort ) const
bool QDir::remove(const QString &amp;filename); //删除文件
bool QFile::copy ( const QString &amp; fileName, const QString &amp; newName ) [static] //拷贝文件</pre>
<p>4.列表视图中实现单元格的合并与表格线的隐藏</p>
<pre class="brush: cpp; gutter: true">QTableView::setSpan(int row, int column, int rowspan, int columnspan);
QTableView::setShowGrid(bool);</pre>
<p>5.QTableWidget方法</p>
<pre class="brush: cpp; gutter: true">void setSelectionBehavior ( QAbstractItemView::SelectRows)；//整行选中
void setSelectionMode ( QAbstractItemView::SingleSelection)；//单选
void setEditTriggers ( QAbstractItemView::NoEditTriggers )；//禁止编辑
tablewidget-&gt;verticalHeader()-&gt;setHiddern(true); //自动行名隐藏
void QTableWidgetItem::setFlags(Qt::ItemIsSelectable); //单元格变灰</pre>
<p>6.Qt应用的开发</p>
<pre class="brush: cpp; gutter: true">void setupUI(); //绘制显示界面
int initUI(); //加载界面显示的数据
void connects(); //所有的信号与槽的连接</pre>
<p>7.QThread线程的使用</p>
<ul>
<li>QThread::run()函数对线程的作用相当于main函数对于应用程序的作用，它是线程的入口，run()的开始和结束意味着线程的开始与结束。</li>
<li>QThread::start()函数负责启动线程</li>
<li>QWidget及其子派生类不能在次线程中创建或使用</li>
<li>QThread对象本身所在的线程和它管理的线程不是同一个线程</li>
<li>在QThread派生类中定义的槽是在主线程而不是次线程中执行的，除非使用moveToThread()函数指定；只有run函数内的代码才是在次线程中执行的代码</li>
<li>QThread应该被看做是OS线程的接口或控制点，而不应该包含需要在新线程中运行的代码</li>
</ul>
<p>推荐的使用方法：把线程的代码放到一个QObject的子类中，然后将该子类的对象moveToThread到新线程中。</p>
<p>8.Qt/Embedded Linux</p>
<ul>
<li>不使用X窗口系统，实现自己的窗口系统：QWS</li>
<li>要运行Qt/Embedd Linux程序，必须首先创建一个进程作为GUI服务器，负责为客户端分配屏幕区域，生成鼠标和键盘事件；任何程序都可以成为服务器，通过在命令行指定-qws参数，或者将QApplication::GuiServer作为QApplicaiton构造函数的第三个参数</li>
<li>各种各样的环境变量会影响到Qt/Embedd Linux程序，最重要的是QWS_MOUSE_PROTO 指定鼠标设备 QWS_KEYBOARD 指定键盘类型</li>
</ul>
<p>9.单例模式<br />
[定义]一个类只有一个实例，而且自行实例化并向整个系统提供这个实例<br />
[要点]</p>
<ul>
<li>只能有一个实例</li>
<li>必须自行创建这个实例</li>
<li>必须自行向整个系统提供这个实例</li>
</ul>
<p>[模板]</p>
<pre class="brush: cpp; gutter: true">class CSingleton:
{
public:
	static CSingleton *GetInstance()
	{
		if(m_pInstance == NULL)
		{
			m_pInstance = new CSingleton();
			return m_pInstance;
		}
	}
private:
	CSingleton(){};
	static CSingleton *m_pInstance;
}</pre>
<p>10.m_pSubWiget-&gt;move(mapToGlobal(QPoint(0,0))); //使界面位置一直保持不变<br />
//把当前的逻辑坐标(0,0)映射到屏幕物理坐标上</p>
<p>11.随机数的生成 &lt;cstdlib&gt;</p>
<pre class="brush: cpp; gutter: true">int srand(seed); //指定种子，默认seed=1
srand(time(0)); //每次运行指定不一样的seed，从而生成不一样的随机数
int rand(); //生成[seed, RANDOM_MAX]之间的随机数
rand()%(b-a) + a ；//生成[a,b)之间的随机数
rand() /double(RANDOM_MAX)；//生成0-1之间的伪随机浮点数</pre>
<p>11.电路学习</p>
<ul>
<li>《模拟电路基础》清华大学，林红</li>
<li>《模拟电路基础实验教程》 清华大学，刘志军</li>
</ul>
<p>12.使用focusNextChild()/focusPreviousChild()函数控制widget中焦点的转移</p>
<p>13.图形widget的绘制,示例：</p>
<pre class="brush: cpp; gutter: true">void CWaveCurveWidget::paintEvent(QPaintEvent *)
{
    QPainter paint(this);
    paint.setBrush(Qt::black);//设置绘制背景的笔的颜色
    paint.setViewport(0,0,this-&gt;width(),this-&gt;height());//设置视口，物理坐标
    paint.setWindow(QRect(0,-this-&gt;height()/2,this-&gt;width(),this-&gt;height()));//设置窗口，逻辑坐标
    paint.drawRect(0,-this-&gt;height()/2,this-&gt;width(),this-&gt;height());//绘制背景
    drawGrid(paint);
    drawCurves(paint);
}</pre>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://lizehong.freevar.com/?feed=rss2&#038;p=297</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>工作笔记（2011）</title>
		<link>http://lizehong.freevar.com/?p=295</link>
		<comments>http://lizehong.freevar.com/?p=295#comments</comments>
		<pubDate>Wed, 18 Jul 2012 14:56:23 +0000</pubDate>
		<dc:creator>Lee</dc:creator>
				<category><![CDATA[Qt应用]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[QTE]]></category>
		<category><![CDATA[工作]]></category>
		<category><![CDATA[笔记]]></category>

		<guid isPermaLink="false">http://lizehong.freevar.com/?p=295</guid>
		<description><![CDATA[1.触摸屏支持库tslib————开源项目，为触摸屏驱动和应用层之间提供适配层。 2.缺陷管理系统：BugFree (开源软件) BugZilla Mantis&#8230; 3.在Ubuntu系统上执行操作出现一些奇怪的问题时，检查该操作是否需要root权限的执行。 4.Qt的 … <a href="http://lizehong.freevar.com/?p=295"> Continue reading <span class="meta-nav">&#8594; </span></a>]]></description>
			<content:encoded><![CDATA[<p>1.触摸屏支持库tslib————开源项目，为触摸屏驱动和应用层之间提供适配层。</p>
<p>2.缺陷管理系统：BugFree (开源软件) BugZilla Mantis&#8230;</p>
<p>3.在Ubuntu系统上执行操作出现一些奇怪的问题时，检查该操作是否需要root权限的执行。</p>
<p>4.Qt的二维图形引擎是基于QPainter类的，通过重新实现paintEvent()函数可定制各种窗口部件。</p>
<p>5.渐变填充利用颜色插值使得两个颜色或更多颜色之间能够平滑过渡。常被用来创建三维效果。<br />
Qt支持三种渐变：线性渐变(QLinearGradient)、锥形渐变(QRadiaalGradient)、辐射渐变(QConicalGradient)</p>
<p>6.视口、窗口、世界矩阵决定了如何将QPainter的逻辑坐标映射到设备的物理绘图坐标<br />
视口：物理坐标系下指定的任意矩形 设置视口：QPainter::setViewPort();<br />
窗口：逻辑坐标系下的同一矩形 设置窗口：QPainter::setWindow();<br />
物理坐标系与逻辑坐标系是一致的，该机制对于编写独立于绘制设备大小和分辨率的绘制代码很有用。<br />
世界变换(QTransform)使用变换矩阵，允许移动、缩放、旋转或拉伸，或者使用QPainter的translate()/scale()/rotate()/shear()函数</p>
<p>7.QImage &#8211;Qt内置的绘图引擎，实现与平台无关的高质量绘图，强大特性：支持复合模式。</p>
<p>8.Qt基于项的图形视图体系：QGraphicsView/QGraphicsScene/QGraphicsItem体系</p>
<ul>
<li>体系的坐标系统：视口坐标、场景坐标、项坐标</li>
<li>场景坐标：逻辑坐标，用来布置场景中的项</li>
<li>项坐标：针对某一项，以(0,0)为中心，在场景中移动项时，项坐标保持不变</li>
</ul>
<p>9.Qt中窗口部件风格(QStyle)</p>
<ul>
<li>Plastique————KDE下Qt/X11应用程序的默认风格</li>
<li>cleanlooks————GNOME下应用程序的默认风格</li>
</ul>
<p>10.Qt信号与槽机制</p>
<ul>
<li>[1]一个信号可以连接多个槽，但各个槽的调用顺序是不确定的</li>
<li>[2]多个信号可以连接同一个槽</li>
<li>[3]一个信号可以连接到另一个信号</li>
<li>[4]信号与槽的参数必须有相同的类型与相同的顺序</li>
<li>[5]信号的参数如果多于槽，则被简单地忽略</li>
<li>[6]信号与槽不存在或者参数不匹配时，Qt只发出警告</li>
</ul>
<p>11.Qt的元对象系统机制提供两项技术：信号与槽机制、内省机制</p>
<ul>
<li>为了使moc能够正常运行，必须把类的定义与实现分开</li>
</ul>
<p>12.Qt的资源系统：在应用程序的可执行文件中嵌入二进制的数据或文本<br />
通过资源编译器rcc，可将资源转换为C++代码资源文件(xml文件) .qrc</p>
<p>13.Qt中的连接函数connect()绑定sender与receiver时，指针必须有明确的对象，否则程序异常终止。</p>
<p>14.Qt中的鼠标事件中想x()/y()函数返回的坐标是相对于接收事件的窗体的坐标。</p>
<p>15.Qt中获取设备显示屏的分辨率:QDesktopWidget类<br />
QApplication::desktop()-&gt;width(); QApplication::desktop()-&gt;height();</p>
<p>16.setWindowFlag(Qt::FramelessWindowHint); 设置窗体不含边框与标题栏<br />
setWindowOpacity()设置窗体的透明度<br />
实现程序启动画面：QSplashScreen类，在main()函数中实现</p>
<p>17.代码的可视化编辑与查看，可以通过Notepa++的插件“带颜色复制”，粘贴到word中一定程度的实现</p>
<p>18.应用程序进行编译的优化级别会影响程序的功能实现，小心地测试优化级别的正确性。</p>
<p>19.linux中列出当前目录下的子目录命令：</p>
<pre class="brush: bash; gutter: false">ls -F | grep /$
ls -l | grep &quot;^d&quot;</pre>
<p>20.离散傅里叶分析(DFT)是频谱分析的常用方法。</p>
<p>21.正则表达式：用来筛选文本的模式</p>
<ul>
<li>正则表达式引擎：解释正则表达式模式并使用这些模式匹配文本的基础软件</li>
<li>POSIX引擎: BRE ERE</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://lizehong.freevar.com/?feed=rss2&#038;p=295</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Qt/Embedded for Linux应用开发</title>
		<link>http://lizehong.freevar.com/?p=188</link>
		<comments>http://lizehong.freevar.com/?p=188#comments</comments>
		<pubDate>Wed, 18 Apr 2012 13:56:35 +0000</pubDate>
		<dc:creator>Lee</dc:creator>
				<category><![CDATA[Qt应用]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[QTE]]></category>

		<guid isPermaLink="false">http://lizehong.freevar.com/?p=188</guid>
		<description><![CDATA[一、开发环境的构建 1.下载Qt源代码，包括桌面版和嵌入式版 如4.7.4版：qt-everywhere-opensource-src-4.7.4.tar.gz qt-everywhere-opensource-src-4.7.4[embedded].tar.gz 解压缩到当前目 … <a href="http://lizehong.freevar.com/?p=188"> Continue reading <span class="meta-nav">&#8594; </span></a>]]></description>
			<content:encoded><![CDATA[<p>一、开发环境的构建<br />
1.下载Qt源代码，包括桌面版和嵌入式版<br />
如4.7.4版：qt-everywhere-opensource-src-4.7.4.tar.gz<br />
qt-everywhere-opensource-src-4.7.4[embedded].tar.gz<br />
解压缩到当前目录：</p>
<pre class="brush: bash; gutter: false">tar -xzvf qt-everywhere-opensource-src-4.7.4.tar.gz</pre>
<p>2.编译安装桌面版和嵌入式版<br />
桌面版一般为默认配置安装：</p>
<pre class="brush: bash; gutter: false">./configure ; sudo make; sudo make install;</pre>
<p>嵌入式版安装作为开发用，也一般可以为默认安装，但必须指定目标类型与主机类型<br />
(1) 首先需要指定目标类型，利用现有的或者修改、添加目标类型<br />
a.进入mkspecs/qws/文件夹中：cd mkspecs/qws<br />
b.找到你的目标类型文件夹并且拷贝一份：cp linux-arm-g++ linux-omapl138-g++ -a<br />
c.进入你的目标文件夹中以修改qmake.conf配置文件，主要是修改交叉编译器：</p>
<pre class="brush: bash; gutter: false">cd linux-omapl138-g++; gedit qmake.conf</pre>
<p>修改文件中的如下内容以符合你的交叉开发环境：<br />
<code># modifications to g++.conf<br />
QMAKE_CC = arm-none-linux-gnueabi-gcc<br />
QMAKE_CXX = arm-none-linux-gnueabi-g++<br />
QMAKE_LINK = arm-none-linux-gnueabi-g++<br />
QMAKE_LINK_SHLIB = arm-none-linux-gnueabi-<br />
# modifications to linux.conf<br />
QMAKE_AR = arm-none-linux-gnueabi-ar cqs<br />
QMAKE_OBJCOPY = arm-none-linux-gnueabi-objcopy<br />
QMAKE_STRIP = arm-none-linux-gnueabi-strip</code><br />
保存修改，完成目标配置文件的添加，回到qt主目录.<br />
(2)执行configure进行安装前的配置，它会自动执行qt的qmake，读取各工程依据配置选项生成makefile文件<br />
<code>(echo o ; echo yes ) | ./configure \<br />
-prefix /home/realtimedsp/703-project/tools/qte-4.7.4-703 \ (指定安装目录)<br />
-embedded arm -platform /qws/linux-x86-g++ -xplatform /qws/linux-omapl138-g++ \ （指定目标）<br />
-depths 16,24,32 (指定颜色深度)</code><br />
(3)配置结束后，就是编译安装了,注意安装位置的读写权限，否则会失败</p>
<pre class="brush: bash; gutter: false">make; make install</pre>
<p>二、应用设计及编码<br />
推荐使用Qt提供的QtCreator IDE进行编码开发，在Qt的官网上可以直接下载到二进制的bin文件，直接安装就好了</p>
<pre class="brush: bash; gutter: false">./qt-creator-linux-x86-opensource-2.4.1.bin</pre>
<p>因为它与Qt的库进行了完美的集成：从编码到调试，从项目管理到帮助文档，以及跨平台开发，可以极大地提高Qt<br />
应用开发的效率。</p>
<p>编码完成后先在主机上进行调试，保证可以正确地实现所有的功能后，再移植到目标平台上进行调试、测试，这一<br />
步在QtCreator上可以很轻松地完成。</p>
<p>三、QTE应用的开发板测试<br />
(1)首先需要在开发板上安装QTE的动态库，这样QTE应用才能正确地运行起来<br />
a.从之前安装的嵌入式QT版本文件夹中拷贝库目录：lib/ 目录到开发板使用的文件系统中，建议存放位置：<br />
/opt/QTE/<br />
b.配置环境变量，以使应用程序找到QTE的动态库文件：<br />
(可以把下面的配置写到profile文件中，也可以写成一个脚本)<br />
<code>export QTEDIR=/opt/QTE/<br />
export LD_LIBRARY_PATH=$QTEDIR/lib:$LD_LIBRARY_PATH<br />
export QWS_SIZE=640x480</code><br />
c.然后把交叉编译好的QTE应用下到开发板的文件系统上，并且通过超级终端之类的方式在开发板上运行应用</p>
<pre class="brush: bash; gutter: false">./EST703 -qws</pre>
<p>(必须加上-qws选项，以指定应用自身作为QTE的Server进行图形界面的绘制与管理)</p>
<p>四、QTE库的自定义配置（QTE库的裁减）<br />
通过指定应用使用了的特性，裁减掉不需要的特性来自定义QTE，从而降低QTE动态库的大小，降低资源的消耗。<br />
当应用的功能测试及调试已经基本完成以后，就可以开始进行应用的性能的测试与调试了。<br />
性能的测试与优化主要可以从两个方面入手：<br />
1.QTE的动态库的裁减优化<br />
2.应用自身的代码重构优化<br />
这里主要说明一下QTE库的裁减配置：<br />
(1).配置工作主要是在执行./configure这一步骤上，通过指定相应的选项与配置文件来生成自定义的makefile<br />
文件，之后的编译与安装步骤和前面一样：make；make install;<br />
(2).configure命令有很多的选项，大部分的选项可以从字面理解其作用与含义，可以通过./configure &#8211;help<br />
命令查看所有的选项及其说明。在不是完全熟悉的情况下，建议把其导出到文件以方便随时查看：</p>
<pre class="brush: bash; gutter: false">./configure --help &gt; qteconf_help.txt</pre>
<p>(3).配置工作主要是裁减掉不需要的特性，也就是指定 -no-* 形式的选项，这需要根据具体的项目应用进行具体<br />
的配置，当然必须对各选项的特性是什么了解清楚。（多查看选项帮助中的说明）<br />
(4).configure的选项配置示例（703A）：<br />
<code> (echo o ; echo yes ) | ./configure \<br />
-prefix /home/realtimedsp/703-project/tools/qte-4.7.4-703 \<br />
-embedded arm -platform /qws/linux-x86-g++ -xplatform /qws/linux-omapl138-g++ \<br />
-depths 16,24,32 \<br />
-no-largefile \<br />
-release \<br />
-fast \<br />
-no-dbus \<br />
-no-sql-sqlite \<br />
-qt-libpng \<br />
-qt-freetype \<br />
-little-endian -host-little-endian \<br />
-no-svg \<br />
-no-qt3support \<br />
-no-libtiff -no-libmng \<br />
-no-mmx -no-sse -no-sse2 -no-sse3 \<br />
-no-3dnow \<br />
-no-openssl \<br />
-no-phonon \<br />
-no-opengl \<br />
-no-cups \<br />
-no-qvfb \<br />
-no-gif \<br />
-no-webkit \<br />
-no-javascript-jit \<br />
-no-script \<br />
-no-xmlpatterns \<br />
-no-kbd-tty -no-kbd-linuxinput -no-kbd-qvfb -no-kbd-qnx \<br />
-no-mouse-tslib -no-mouse-pc -no-mouse-linuxtp -no-mouse-linuxinput \<br />
-no-mouse-tslib -no-mouse-qvfb -no-mouse-qnx \<br />
-no-xcursor -no-xfixes -no-xrandr -no-xrender \<br />
-nomake examples -nomake tools -nomake docs -nomake demos</code><br />
(5).配置选项是从一个比较大的粒度去裁减QTE库的功能特性，如果需要从一个更小更细的粒度去定制QTE库，那就<br />
需要编辑qconfig-xxx.h配置文件，通过定义各种特性宏(features)来裁减QTE库了。<br />
a.首先找到并进入相应的文件所在目录，主要是：qconfig-xxx.h类文件以及features.txt文件<br />
cd src/corelib/global/<br />
&gt;&gt;features.txt文件对可以进行配置的所有特性进行了一个简单的说明，在进行配置时，随时查看该文件是个良好的<br />
习惯，尤其要注意的是文件中每个特性的 Requires: 字段，它指定了该特性对其它特性的依赖关系，一旦你的配<br />
置没有满足这个依赖关系，那么你将可能无法编译成功QTE库，或者编译成功但是无法运行应用。<br />
&gt;&gt;Qt默认提供了5个qconfig-xxx.h的配置文件，从裁减特性多到少排序依次为：<br />
qconfig-minimal.h qconfig-small.h qconfig-medium.h qconfig-large.h qconfig-dist.h<br />
通过查看这些文件可以发现，其只是进行一个宏的定义，难度在于清楚哪些特性是需要的，哪些可以#define掉。<br />
b.新建一个工程自己的配置文件，如：qconfig-703.h，从上面五个配置文件中拷贝一下内容到该文件，如从<br />
qconfig-minimal.h拷贝，然后配置特性：<br />
&gt;&gt;取消对应的宏定义，如果应用需要该特性;<br />
&gt;&gt;增加对应的宏定义，如果应用不需要某个特性.<br />
如703A中显示不需要鼠标指针，所以需要如下的宏定义：<br />
<code>#ifndef QT_NO_QWS_ALPHA_CURSOR<br />
# define QT_NO_QWS_ALPHA_CURSOR<br />
#endif<br />
#ifndef QT_NO_QWS_CURSOR<br />
# define QT_NO_QWS_CURSOR<br />
#endif</code><br />
c.编辑好qconfig-703.h配置文件后，把它添加到./configure配置选项的后面,即在上面的选项最后添加:<br />
-qconfig 703<br />
然后就可以开始配置、编译与安装了.<br />
(6).安装成功后，就可以使用其进行应用的构建与开发板运行了。记得要用该版本的lib/替换掉开发板上<br />
之前的lib/。<br />
如果构建出错或者运行出错，那应该是配置出问题了，需要返回到上面的配置步骤进行检查与修改。</p>
<p>五、QTE应用中文显示<br />
在开发板上实现应用的中文显示是一个稍微麻烦的事情，因为嵌入式os一般缺乏必要的中文字体库与相应的编码<br />
识别。因此解决中文显示主要是两个工作：<br />
1.确定QTE应用代码中中文编辑使用的编码是什么，也就是你的代码编辑环境中字符编码是什么。QtCreator平台中<br />
默认的字符编码是UTF-8.<br />
&gt;&gt;然后在main.cpp中指定对应的编码解释：(记得对中文字符串使用tr()函数)</p>
<pre class="brush: cpp; gutter: true; first-line: 1; highlight: []; html-script: false">QTextCodec::setCodecForTr(QTextCodec::codecForName(&quot;UTF-8&quot;));
QTextCodec::setCodecForCStrings(QTextCodec::codecForName(&quot;UTF-8&quot;));</pre>
<p>2.确定开发板的文件系统上是否有中文字体库(一般是没有的),在开发板的Qt库目录下添加中文字体库，即前面的：<br />
/opt/QTE/lib/fonts目录下。<br />
linux平台上的中文字体库不多，比较常用的是文泉驿字体，可以从网上下载，它是开源的。我下载使用的是：<br />
wqy-zenhei-0.9.45.tar.gz<br />
解压缩，把里面的wqy-zenhei.ttc字体库文件拷贝到上面的fonts目录里面就可以了。<br />
通过这两个步骤就可以实现中文的显示了。</p>
<p>(1.网上说ttf字体文件也是可以的，可是我从windows的字体文件夹中拷贝一个测试了一下，无法显示中文；<br />
2.网上很多提到qpf文件是最佳中文字体显示选择，Qt默认提供了unifont_160_50.qpf中文字体文件，可是我测试<br />
了多次都无法显示中文，而且我从网上下的wenquanyi的几个qpf文件经测试也无法显示中文，不知道什么原因)</p>
<p>六、Qt中各种工具的使用：qvfp与makeqpf<br />
Qt的主目录下有一个tools文件夹，里面提供了一些有用的工具的源代码，可以通过安装好的桌面Qt开发环境编译<br />
生成这些工具的二进制程序。源代码中有.pro项目文件，可以直接打开、构建，构建好后，把对应的二进制程序<br />
拷贝到Qt安装目录下的bin/文件夹下，这样就可以直接在终端执行这些工具了。<br />
qvfp与makeqpf是tools里面的两个工具：<br />
qvfp————提供虚拟帧缓存的实现与管理，从而使得移动Qt应用可以在桌面环境中进行仿真式的测试。<br />
makeqpf————qpf字体文件的生成工具，可以转换ttf字体文件为qpf2格式的Qt自带的字体文件格式。<br />
(1).qvfp的使用<br />
a.首先运行qvfp工具,指定相应的选项：<br />
<code>Usage: qvfb [-width width] [-height height] [-depth depth] [-zoom zoom][-mmap] [-nocursor]<br />
[-qwsdisplay :id] [-x11display :id] [-skin skindirectory]<br />
Supported depths: 1, 4, 8, 12, 15, 16, 18, 24, 32</code><br />
示例：qvfp -width 640 -height 480 -depth 16,24,32 -nocursor<br />
b.然后运行你的嵌入式Qt应用程序，运行方式和在开发板上一样，即需要加上 -qws 选项，这样应用才能使用qvfp<br />
提供的虚拟帧缓存。(使用下面安装的x86目标库构建你的Qt应用)<br />
&gt;&gt;这里的应用程序必须是使用嵌入式的Qt库构建的，但是要使应用能在桌面(x86)环境上运行，就必须是x86目标，<br />
因此这里必须编译安装一个x86目标的嵌入式Qt库。过程和前面的arm目标库安装是基本一致的。配置如下：<br />
<code>(echo o ; echo yes ) | ./configure \<br />
-prefix /home/realtimedsp/703-project/tools/qte-4.7.4-x86 \<br />
-embedded x86 \<br />
-depths 16,24,32 \<br />
-qt-gfx-qvfb \<br />
-no-gif \<br />
-no-webkit \<br />
-no-javascript-jit \<br />
-no-script \<br />
-no-xmlpatterns \<br />
-qt-kbd-qvfb \<br />
-qt-mouse-qvfb \<br />
-nomake examples -nomake tools -nomake docs -nomake demos</code><br />
因为要使用qvfp进行测试，所以配置选项中的：-qt-gfx-qvfb -qt-kbd-qvfb -qt-mouse-qvfb是必须的。<br />
(2).makeqpf的使用<br />
a.运行makeqpf工具，不用输选项，然后出现图形界面，选择想要转换的字体,指定字体大小、权重、是否斜体，<br />
进行转换就好了<br />
b.界面的第二部分是各种字符集，可以参考word中的插入-&gt;符号界面中的子集下拉表。</p>
]]></content:encoded>
			<wfw:commentRss>http://lizehong.freevar.com/?feed=rss2&#038;p=188</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
