﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-zhonghua-随笔分类-qt</title><link>http://www.cppblog.com/zhonghua/category/18897.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 11 Dec 2013 09:34:50 GMT</lastBuildDate><pubDate>Wed, 11 Dec 2013 09:34:50 GMT</pubDate><ttl>60</ttl><item><title>[转]一种使用QThread线程的新方法QObject::moveToThread</title><link>http://www.cppblog.com/zhonghua/archive/2013/12/11/204717.html</link><dc:creator>米米</dc:creator><author>米米</author><pubDate>Wed, 11 Dec 2013 09:08:00 GMT</pubDate><guid>http://www.cppblog.com/zhonghua/archive/2013/12/11/204717.html</guid><wfw:comment>http://www.cppblog.com/zhonghua/comments/204717.html</wfw:comment><comments>http://www.cppblog.com/zhonghua/archive/2013/12/11/204717.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhonghua/comments/commentRss/204717.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhonghua/services/trackbacks/204717.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 昨晚在一个邮件列表里面看见一个关于在线程种使用signal/slot的讨论，由于回复太多，这里就不贴出原文了。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 主要是关于怎样从一个线程发送信号到另外一个线程的问题。其实这个也不是什么复杂的问题，在qt的asstant里面已经描诉...&nbsp;&nbsp;<a href='http://www.cppblog.com/zhonghua/archive/2013/12/11/204717.html'>阅读全文</a><img src ="http://www.cppblog.com/zhonghua/aggbug/204717.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhonghua/" target="_blank">米米</a> 2013-12-11 17:08 <a href="http://www.cppblog.com/zhonghua/archive/2013/12/11/204717.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>QTableView和QTableWidget翻页功能实现</title><link>http://www.cppblog.com/zhonghua/archive/2013/11/17/204288.html</link><dc:creator>米米</dc:creator><author>米米</author><pubDate>Sun, 17 Nov 2013 09:15:00 GMT</pubDate><guid>http://www.cppblog.com/zhonghua/archive/2013/11/17/204288.html</guid><wfw:comment>http://www.cppblog.com/zhonghua/comments/204288.html</wfw:comment><comments>http://www.cppblog.com/zhonghua/archive/2013/11/17/204288.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhonghua/comments/commentRss/204288.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhonghua/services/trackbacks/204288.html</trackback:ping><description><![CDATA[<div><p style=" padding: 0px; border: 0px; list-style: none; word-wrap: normal; word-break: normal; line-height: 18pt; color: #084487; font-family: simsun; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #bababa;">&nbsp;<wbr>转自：<a href="http://indure.chinaunix.com/space.php?uid=25520556&amp;do=blog&amp;id=2211406" style="text-decoration: none; color: #084487;">http://indure.chinaunix.com/space.php?uid=25520556&amp;do=blog&amp;id=2211406</a></p><p style=" padding: 0px; border: 0px; list-style: none; word-wrap: normal; word-break: normal; line-height: 18pt; color: #084487; font-family: simsun; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #bababa;"><span style="word-wrap: normal; word-break: normal; line-height: 18px; font-size: 9pt; font-family: 微软雅黑, sans-serif;"><span style="word-wrap: normal; word-break: normal; line-height: 18px;">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr></span></span>&nbsp;<span style="word-wrap: normal; word-break: normal; line-height: 18px; font-size: 9pt; font-family: 微软雅黑, sans-serif;">主要使用<span style="word-wrap: normal; word-break: normal; line-height: 18px;">QTableView和QTableWidget</span>中的三个函数实现</span></p><p style=" padding: 0px; border: 0px; list-style: none; word-wrap: normal; word-break: normal; line-height: 18pt; color: #084487; font-family: simsun; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #bababa;"><span style="word-wrap: normal; word-break: normal; line-height: 18px; font-size: 9pt; font-family: 微软雅黑, sans-serif;">QTableView</span><span style="word-wrap: normal; word-break: normal; line-height: 18px; font-size: 9pt; font-family: 微软雅黑, sans-serif;">：：<span style="word-wrap: normal; word-break: normal; line-height: 18px;">verticalScrollBar()-&gt;setSliderPosition()</span>；<span style="word-wrap: normal; word-break: normal; line-height: 18px;"><span style="word-wrap: normal; word-break: normal; line-height: 18px;">&nbsp;<wbr></span>&nbsp;//</span>设置当前滑动条的位置</span></p><p style=" padding: 0px; border: 0px; list-style: none; word-wrap: normal; word-break: normal; line-height: 18pt; color: #084487; font-family: simsun; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #bababa;"><span style="word-wrap: normal; word-break: normal; line-height: 18px; font-size: 9pt; font-family: 微软雅黑, sans-serif;">QTableView</span><span style="word-wrap: normal; word-break: normal; line-height: 18px; font-size: 9pt; font-family: 微软雅黑, sans-serif;">：：<span style="word-wrap: normal; word-break: normal; line-height: 18px;">verticalScrollBar()-&gt;maximum();<span style="word-wrap: normal; word-break: normal; line-height: 18px;">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr></span>&nbsp;//</span>滑动条能移动的最大位置</span></p><p style=" padding: 0px; border: 0px; list-style: none; word-wrap: normal; word-break: normal; line-height: 18pt; color: #084487; font-family: simsun; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #bababa;"><span style="word-wrap: normal; word-break: normal; line-height: 18px; font-size: 9pt; font-family: 微软雅黑, sans-serif;">QTableView</span><span style="word-wrap: normal; word-break: normal; line-height: 18px; font-size: 9pt; font-family: 微软雅黑, sans-serif;">：：<span style="word-wrap: normal; word-break: normal; line-height: 18px;">verticalScrollBar()-&gt;value();<span style="word-wrap: normal; word-break: normal; line-height: 18px;">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr></span>&nbsp;//</span>获得当前滑动条的位置</span></p><p style=" padding: 0px; border: 0px; list-style: none; word-wrap: normal; word-break: normal; line-height: 18pt; color: #084487; font-family: simsun; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #bababa;">&nbsp;<wbr></p><p style=" padding: 0px; border: 0px; list-style: none; word-wrap: normal; word-break: normal; line-height: 18pt; color: #084487; font-family: simsun; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #bababa;"><span style="word-wrap: normal; word-break: normal; line-height: 18px; font-size: 9pt; font-family: 微软雅黑, sans-serif;">&nbsp;<wbr></span></p><div style="color: #084487; font-family: simsun; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 21px; orphans: auto; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #bababa;"><ol style="margin: 0px 1px 0px 0px; padding: 5px 0px; border: 0px; list-style: none;"><li style="margin: 0px 0px 0px 30px; padding: 0px; border: 0px; list-style: decimal;"><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #000000;">static&nbsp;<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #ff0000;">int</span>&nbsp;nCurScroller<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">=</span>0<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">;</span>&nbsp;<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">/</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">/</span>翻页时的当时滑动条位置<br /></span></li><li style="margin: 0px 0px 0px 30px; padding: 0px; border: 0px; list-style: decimal;">static&nbsp;<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #ff0000;">int</span>&nbsp;pageValue&nbsp;<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">=</span>&nbsp;10<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">;</span>&nbsp;<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">/</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">/</span>&nbsp;一页显示条数<br /></li><li style="margin: 0px 0px 0px 30px; padding: 0px; border: 0px; list-style: decimal;"><br /></li><li style="margin: 0px 0px 0px 30px; padding: 0px; border: 0px; list-style: decimal;">void SplayHisForm<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">:</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">:</span>createHisForm<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">(</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">)</span><br /></li><li style="margin: 0px 0px 0px 30px; padding: 0px; border: 0px; list-style: decimal;"><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">{</span><br /></li><li style="margin: 0px 0px 0px 30px; padding: 0px; border: 0px; list-style: decimal;">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&#8230;&#8230;<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">.</span><br /></li><li style="margin: 0px 0px 0px 30px; padding: 0px; border: 0px; list-style: decimal;">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>hisTableWidget&nbsp;<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">=</span>&nbsp;new QTableWidget<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">;</span><br /></li><li style="margin: 0px 0px 0px 30px; padding: 0px; border: 0px; list-style: decimal;">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>hisTableWidget<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">-</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">&gt;</span>setSelectionMode<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">(</span>QAbstractItemView<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">:</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">:</span>SingleSelection<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">)</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">;</span><br /></li><li style="margin: 0px 0px 0px 30px; padding: 0px; border: 0px; list-style: decimal;">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;hisTableWidget<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">-</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">&gt;</span>setSelectionBehavior<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">(</span>QAbstractItemView<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">:</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">:</span>SelectRows<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">)</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">;</span><br /></li><li style="margin: 0px 0px 0px 30px; padding: 0px; border: 0px; list-style: decimal;">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&#8230;&#8230;<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">.</span><br /></li><li style="margin: 0px 0px 0px 30px; padding: 0px; border: 0px; list-style: decimal;"><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">}</span><br /></li><li style="margin: 0px 0px 0px 30px; padding: 0px; border: 0px; list-style: decimal;"><br /></li><li style="margin: 0px 0px 0px 30px; padding: 0px; border: 0px; list-style: decimal;"><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">/</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">*</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">*</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">*</span>下一页<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">*</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">*</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">*</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">/</span><br /></li><li style="margin: 0px 0px 0px 30px; padding: 0px; border: 0px; list-style: decimal;">void SplayHisForm<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">:</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">:</span>nextPageHis<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">(</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">)</span><br /></li><li style="margin: 0px 0px 0px 30px; padding: 0px; border: 0px; list-style: decimal;"><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">{</span><br /></li><li style="margin: 0px 0px 0px 30px; padding: 0px; border: 0px; list-style: decimal;">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #ff0000;">int</span>&nbsp;maxValue&nbsp;<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">=</span>&nbsp;hisTableWidget<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">-</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">&gt;</span>verticalScrollBar<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">(</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">)</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">-</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">&gt;</span>maximum<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">(</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">)</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">;</span>&nbsp;<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">/</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">/</span>&nbsp;当前SCROLLER最大显示值25<br /></li><li style="margin: 0px 0px 0px 30px; padding: 0px; border: 0px; list-style: decimal;">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>nCurScroller&nbsp;<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">=</span>&nbsp;hisTableWidget<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">-</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">&gt;</span>verticalScrollBar<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">(</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">)</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">-</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">&gt;</span>value<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">(</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">)</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">;</span>&nbsp;<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">/</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">/</span>获得当前scroller值<br /></li><li style="margin: 0px 0px 0px 30px; padding: 0px; border: 0px; list-style: decimal;"><br /></li><li style="margin: 0px 0px 0px 30px; padding: 0px; border: 0px; list-style: decimal;">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000ff;">if</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">(</span>nCurScroller<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">&lt;</span>maxValue<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">)</span><br /></li><li style="margin: 0px 0px 0px 30px; padding: 0px; border: 0px; list-style: decimal;">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>hisTableWidget<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">-</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">&gt;</span>verticalScrollBar<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">(</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">)</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">-</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">&gt;</span>setSliderPosition<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">(</span>pageValue<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">+</span>nCurScroller<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">)</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">;</span><br /></li><li style="margin: 0px 0px 0px 30px; padding: 0px; border: 0px; list-style: decimal;">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000ff;">else</span><br /></li><li style="margin: 0px 0px 0px 30px; padding: 0px; border: 0px; list-style: decimal;">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>hisTableWidget<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">-</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">&gt;</span>verticalScrollBar<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">(</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">)</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">-</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">&gt;</span>setSliderPosition<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">(</span>0<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">)</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">;</span><br /></li><li style="margin: 0px 0px 0px 30px; padding: 0px; border: 0px; list-style: decimal;"><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">}</span><br /></li><li style="margin: 0px 0px 0px 30px; padding: 0px; border: 0px; list-style: decimal;"><br /></li><li style="margin: 0px 0px 0px 30px; padding: 0px; border: 0px; list-style: decimal;"><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">/</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">*</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">*</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">*</span>上一页<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">*</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">*</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">*</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">/</span><br /></li><li style="margin: 0px 0px 0px 30px; padding: 0px; border: 0px; list-style: decimal;">void SplayHisForm<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">:</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">:</span>prePageHis<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">(</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">)</span><br /></li><li style="margin: 0px 0px 0px 30px; padding: 0px; border: 0px; list-style: decimal;"><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">{</span><br /></li><li style="margin: 0px 0px 0px 30px; padding: 0px; border: 0px; list-style: decimal;">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #ff0000;">int</span>&nbsp;maxValue&nbsp;<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">=</span>&nbsp;hisTableWidget<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">-</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">&gt;</span>verticalScrollBar<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">(</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">)</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">-</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">&gt;</span>maximum<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">(</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">)</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">;</span>&nbsp;<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">/</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">/</span>&nbsp;当前SCROLLER最大显示值25<br /></li><li style="margin: 0px 0px 0px 30px; padding: 0px; border: 0px; list-style: decimal;">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>nCurScroller&nbsp;<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">=</span>&nbsp;hisTableWidget<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">-</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">&gt;</span>verticalScrollBar<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">(</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">)</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">-</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">&gt;</span>value<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">(</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">)</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">;</span><br /></li><li style="margin: 0px 0px 0px 30px; padding: 0px; border: 0px; list-style: decimal;"><br /></li><li style="margin: 0px 0px 0px 30px; padding: 0px; border: 0px; list-style: decimal;">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000ff;">if</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">(</span>nCurScroller<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">&gt;</span>0<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">)</span><br /></li><li style="margin: 0px 0px 0px 30px; padding: 0px; border: 0px; list-style: decimal;">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>hisTableWidget<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">-</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">&gt;</span>verticalScrollBar<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">(</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">)</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">-</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">&gt;</span>setSliderPosition<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">(</span>nCurScroller<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">-</span>pageValue<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">)</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">;</span><br /></li><li style="margin: 0px 0px 0px 30px; padding: 0px; border: 0px; list-style: decimal;">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000ff;">else</span><br /></li><li style="margin: 0px 0px 0px 30px; padding: 0px; border: 0px; list-style: decimal;">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>hisTableWidget<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">-</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">&gt;</span>verticalScrollBar<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">(</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">)</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">-</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">&gt;</span>setSliderPosition<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">(</span>maxValue<span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">)</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">;</span><br /></li><li style="margin: 0px 0px 0px 30px; padding: 0px; border: 0px; list-style: decimal;"><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">}</span></li></ol></div><p style=" padding: 0px; border: 0px; list-style: none; word-wrap: normal; word-break: normal; line-height: 18pt; color: #084487; font-family: simsun; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #bababa;">&nbsp;<wbr><a href="http://indure.chinaunix.com/link.php?url=http://blog.chinaunix.net/attachment/201108/17/25520556_1313572163yziI.jpg" target="_blank" style="text-decoration: none; color: #084487;"><img src="http://blog.chinaunix.net/attachment/201108/17/25520556_1313572163yziI.jpg" alt="QTableView和QTableWidget翻页功能实现" title="QTableView和QTableWidget翻页功能实现" style="margin: 0px; padding: 0px; border: 0px; list-style: none; width: 612px; height: 400px;" border="0" height="471" width="702" /></a></p></div><img src ="http://www.cppblog.com/zhonghua/aggbug/204288.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhonghua/" target="_blank">米米</a> 2013-11-17 17:15 <a href="http://www.cppblog.com/zhonghua/archive/2013/11/17/204288.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>差点忘了。记录一下。关于QT国际化</title><link>http://www.cppblog.com/zhonghua/archive/2013/09/12/203192.html</link><dc:creator>米米</dc:creator><author>米米</author><pubDate>Thu, 12 Sep 2013 07:59:00 GMT</pubDate><guid>http://www.cppblog.com/zhonghua/archive/2013/09/12/203192.html</guid><wfw:comment>http://www.cppblog.com/zhonghua/comments/203192.html</wfw:comment><comments>http://www.cppblog.com/zhonghua/archive/2013/09/12/203192.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhonghua/comments/commentRss/203192.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhonghua/services/trackbacks/203192.html</trackback:ping><description><![CDATA[vs生成的工程 用 <div><span style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff; display: inline !important; float: none;">qmake&nbsp;-project 生成pro<br />在pro里增加</span><br />TRANSLATIONS += myapp.ts<span style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff; display: inline !important; float: none;"><br /><br /><div><pre id="recommend-content-406217660"  mb-10"="" style="margin: 0px 0px 10px; padding: 0px; font-family: arial, 'courier new', courier, 宋体, monospace; white-space: pre-wrap; word-wrap: break-word; color: #333333; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 24px; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #f1fedd;">然后命令行输入lupdate ***.pro<br />打开.ts文件，一条一条的翻译就是了<br />最后lrelease ***.pro</pre></div><br /></span></div><img src ="http://www.cppblog.com/zhonghua/aggbug/203192.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhonghua/" target="_blank">米米</a> 2013-09-12 15:59 <a href="http://www.cppblog.com/zhonghua/archive/2013/09/12/203192.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Qt Tooltip详解 </title><link>http://www.cppblog.com/zhonghua/archive/2013/06/05/200817.html</link><dc:creator>米米</dc:creator><author>米米</author><pubDate>Wed, 05 Jun 2013 08:41:00 GMT</pubDate><guid>http://www.cppblog.com/zhonghua/archive/2013/06/05/200817.html</guid><wfw:comment>http://www.cppblog.com/zhonghua/comments/200817.html</wfw:comment><comments>http://www.cppblog.com/zhonghua/archive/2013/06/05/200817.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhonghua/comments/commentRss/200817.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhonghua/services/trackbacks/200817.html</trackback:ping><description><![CDATA[<div>Qt4中的tooltip与win32中的tooltip有很多不一样的地方，下面来总结一下。<br /><br />一是不能直在堆或栈中生成QToolTip对象。因为其构造函数为私有。<br />二是从widget获取的tooltip不是tooltip对象，而是tooltip中的文本。<br />三是tooltip跟本不是一个widget。所以不把它当作widget用。<br />四是tooltip类是一个静态类，所以跟本不必生成tooltip对象就可以使用。<br />五是tooltip类不能被定制，所以不能从它产生各种形状的tooltip窗口。<br /><br />QtoolTip有两种使用方式：<br />一是静态tooltip。比如为一个widget设置一个不变的tooltip文本，当鼠标移上去时显示tooltip。此时很简单，只需调用widget的setToolTip()设置文本即可。<br />二是动态tooltip。也就是一个widget上的tooltip是变化的。此时需要重写QWidget::event()函数，在里面判断事件类型，如果是QEvent::ToolTip，则控制显示的文本的内容，即可实现动态tooltip。<br /><p>看如下代码示例：</p><div bg_cpp"=""><div><div><strong>[cpp]</strong> <a href="http://blog.csdn.net/nkmnkm/article/details/8204425#" title="view plain">view plain</a><a href="http://blog.csdn.net/nkmnkm/article/details/8204425#" title="copy">copy</a></div></div><ol start="1"><li><span>bool&nbsp;SortingBox::event(QEvent&nbsp;*event)&nbsp;&nbsp;</span></li><li>&nbsp;{&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>if&nbsp;(event-&gt;type()&nbsp;==&nbsp;QEvent::ToolTip)&nbsp;{&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QHelpEvent&nbsp;*helpEvent&nbsp;=&nbsp;<span>static_cast&lt;QHelpEvent&nbsp;*&gt;(event);&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>int&nbsp;index&nbsp;=&nbsp;itemAt(helpEvent-&gt;pos());&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>if&nbsp;(index&nbsp;!=&nbsp;-1)&nbsp;{&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QToolTip::showText(helpEvent-&gt;globalPos(),&nbsp;shapeItems[index].toolTip());&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span>else&nbsp;{&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QToolTip::hideText();&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event-&gt;ignore();&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li>&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>return&nbsp;true;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>return&nbsp;QWidget::event(event);&nbsp;&nbsp;</span></li><li>&nbsp;}&nbsp;&nbsp;</li></ol></div>可以看到，是调用 QtoolTip::showText()在某个位置显示tooltip文本。<br /><br />那么，如果想随时显示tooltip，该怎么做呢？其实十分简单：直接调用QToolTip::showText()，指定要显示的位置就行了。因为tooltip类的函数跟本就相当于全局函数而已。<br /><br />呵呵，其实很简单，但从win32转过来的人，觉得真别扭。</div><img src ="http://www.cppblog.com/zhonghua/aggbug/200817.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhonghua/" target="_blank">米米</a> 2013-06-05 16:41 <a href="http://www.cppblog.com/zhonghua/archive/2013/06/05/200817.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> QT4 thread和QObject关系详解 </title><link>http://www.cppblog.com/zhonghua/archive/2013/06/05/200816.html</link><dc:creator>米米</dc:creator><author>米米</author><pubDate>Wed, 05 Jun 2013 08:40:00 GMT</pubDate><guid>http://www.cppblog.com/zhonghua/archive/2013/06/05/200816.html</guid><wfw:comment>http://www.cppblog.com/zhonghua/comments/200816.html</wfw:comment><comments>http://www.cppblog.com/zhonghua/archive/2013/06/05/200816.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhonghua/comments/commentRss/200816.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhonghua/services/trackbacks/200816.html</trackback:ping><description><![CDATA[<div>QThread从QObject派生。它发出信号来表明线程开始了或结束了。并且也提供了几个槽。<br /><br />更有趣的是，QObject可以在多个程中同时使用，可以发出信号给另外线程的槽，以及向&#8220;活在&#8221;另外线程中的对象邮寄事件。以上之所以能发生，是因为每个初程都被允许拥有它自己的事件循环。<br /><br /><h2><a name="t0"></a>QObject 重入<br /></h2>QObject 是可重入的。它大多数非界面派生类，比如QTimer,QTcpSocket,QFtp,和QProcess，也都是可重入的，使得在多个线程中同时使用 这些类成为可能。但是注意这些类被设计为在一个线程中创建和使用；在一个线程中创建一个对象然后在另一个线程中调用它的方法是不能保证一定能工作的。有三 个限制条件要注意：<br /> QObject的儿子必须在创建它爹的线程中创建。这表示，你永远不能将QThread对象(this)作为parent传给在此thread创建的对象，因为线程对象自己就是在另一个线程中创建的。<br /> 事件驱动的对象应该只用于一个线程中。这一条尤其应用于定时器和网络模块。比如，你不能在创建对象之外的线程中启动一个定时器或连接一个socket。<br /> 你必须保证在线程中创建的一切对象在QThread被删除之前被删除。这可以通过在你的run()实现中在棧中创建对象来轻松搞定。<br /> <br />尽管QObject是可重入的，但GUI类，尤其是QWidget和它所有的派生类们，都不是可重入的。它们只能在主线程中使用。QCoreApplication::exec()必须在这个线程中调用。<br /><br />在实际应用中，最好的方式是把耗时的计算放到主线程中外进行，完成后通知主线程显示结果。<br /><br /><h2><a name="t1"></a>Pre-Thread Event循环<br /></h2>每 个线程都可以有它自己的事件循环。初始的线程使用QCoreApplication::exec()来开始它的事件循环；其它的线程可以使用 QThread::exec()来启动循环。就像QCoreApplication，QThread也提供了一个exit(int)方法和一个 quit()槽。<br /><br />线程中的事件循环使得在线程中使用依靠消息循环的非GUI的QT类成为可能（比如QTimer,QTcpSocket,QProcess）。它也使得从任何线程连接信号到一个线程的槽成为可能。这在下面的&#8220;信号和槽穿越线程&#8221;一节中有详细解释。<br /><br />一个QObject实例在那个线程中创建，就叫做&#8220;活&#8221;在那个线程中。给这个对象的事件们通过线程的事件循环派发。一个QObject对象所&#8220;活在&#8221;的线程通过QObject::thread()可以取得。<br /><br />注 意在QApplication之前创建的QObject调用QObject::thread()会返回0.这意味着主线程将只为这些对象处理邮寄的事件； 对于没有线程的对象，其它的事件处理跟本不会发生。使用QObject::moveToThread()方法来改变对象（和它儿子们）的线程（如果一个对 象有爹，它就不能被移动到另外线程）。<br /><br />在拥有对象之外的线程中调用删除对象是不安全的，除非你能保证在被删除时不在处理事件。但可以使用 QObject::deleteLater()，它会寄出DeferedDelete事件，对象的线程的事件循环最终会抓住它。默认下，拥有 Qobject的线程就是创建QObject的线程，但在QObject::moveToTread()之后就变了。<br /><br />如果没有事件循环，事件将不能传给对象。比如，如果你在一个线程中创建一个QTimer对象，但是没有再调用exec()，那么QTimer将永不能触发timeout()信号。deleteLater()也不再能工作。（这些也同样适用于主线程。）<br /><br />你可以在任何线程中使用QCoreApp:postEvent()手动向任何对象邮寄事件。事件将被对象所在线程的事件循环自动派发。<br /><br />事 件过滤器被所有的线程所支持，但有个限制条件：监视对象必须与被监视对象位于同一个线程中。同样 的，QCoreApplication::sendEvent()（不同于  QCoreApplication::postEvent()）只能在同一线程中的对象之间发送事件。<br /><br /><h2><a name="t2"></a>从另外线程访问QObject子类<br /></h2><br />QObject和它所有的子类都不是线程安全的，这也包含整个事件派送系统。要记住，当你从另外线程访问对象时，事件循环可能派送事件到你的QObject子类。<br /><br />如果你调用一个非本线程的QObject的子类的函数并且这个对象可能接收事件，你必须用mutex保护所有对你的QObject子类的内部数据的访问；否则，你可能体验的什么叫崩溃。<br /><br />就像其它对象，QThread对象&#8220;活&#8221;在创建它的线程中，而不是它自己所代表的线程中。通常在你的QThread子类中提供槽是不安全的，除非你用mutex保护成员变量。<br /><br />另一方面，你可以从你的QThread tun()中安全的发出信号，因为信号发射是线程安全的。<br /><br /><br /><h2><a name="t3"></a>穿越线程的信号和槽们<br /></h2><br />Qt支持如下信号－槽连接类型：<br />　自动连接（默认）－　如果信号是从接收对象所在的线程发出的，其行为与&#8220;直接连接&#8221;相同。否则，其行为与&#8220;队列连接&#8221;相同。<br />　直接连接－　当信号发出，槽会被立马调用。此槽在发出者的线程中执行，而不一定是接收者所在的线程。<br />　队列连接－　当控制返回到接收者所在线程的事件循环时调用。槽在接收者的线程中执行。<br />　阻塞的队列连接－　槽像&#8220;队列连接&#8221;那样被调用，除了一点：当前线程会阻塞住直到槽返回。注：在同一线程中使用此类型的连接将导致死锁！<br />　唯一连接－　行为与&#8220;自动连接&#8221;相同，但连接必须在无复制品时才能建立。也就是，如果在相同的两个对象之间已经建立了同一个信号到同一个槽的连接，那么连接就不能建立，connect()返回false。<br /><br />连接类型可以通过给connect()传递一个额外的参数来指定。注意当接收者和发送者位于不同的线程中时，使用&#8220;直接连接&#8221;，如果事件循环是运行于接收者的线程中，此时是不安全的，同理调用位于另外线程的对象的任何函数都是不安全的。<br /><br />QObject::connect()本身是线程安全的。</div><img src ="http://www.cppblog.com/zhonghua/aggbug/200816.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhonghua/" target="_blank">米米</a> 2013-06-05 16:40 <a href="http://www.cppblog.com/zhonghua/archive/2013/06/05/200816.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Qt 动画详解二 </title><link>http://www.cppblog.com/zhonghua/archive/2013/06/05/200815.html</link><dc:creator>米米</dc:creator><author>米米</author><pubDate>Wed, 05 Jun 2013 08:40:00 GMT</pubDate><guid>http://www.cppblog.com/zhonghua/archive/2013/06/05/200815.html</guid><wfw:comment>http://www.cppblog.com/zhonghua/comments/200815.html</wfw:comment><comments>http://www.cppblog.com/zhonghua/archive/2013/06/05/200815.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhonghua/comments/commentRss/200815.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhonghua/services/trackbacks/200815.html</trackback:ping><description><![CDATA[<div><p><strong>将动画们弄到一起</strong><br /></p><p><br /></p>一个应用通常将包含不止一个动画。例如，你可能想同时移动多个图形item也可能顺序的一个接一个的移动。<br />QanimationGroup 的子类们(QSequentialAnimationGroup和QParallelAnimationGroup)是其它动画的容器，所以这些动画既可 以并行也可以串行。QAnimationGroup是一个非属性动画的例子，但是它定期的收到时间改变的通知。这使得它可以把时间改变传输给所包含的动画 们，从而控制何时播放那些动画们。<br /><br />让我们看一下使用QSequentialAnimatoinGroup和QParallelAnimationGroup的代码示例。<br />QPushButton *bonnie = new QPushButton("Bonnie");<br /> bonnie-&gt;show();<br /> QPushButton *clyde = new QPushButton("Clyde");<br /> clyde-&gt;show();<br /> QPropertyAnimation *anim1 = new QPropertyAnimation(bonnie, "geometry");<br /> // Set up anim1<br /> QPropertyAnimation *anim2 = new QPropertyAnimation(clyde, "geometry");<br /> // Set up anim2<br /> QParallelAnimationGroup *group = new QParallelAnimationGroup;<br /> group-&gt;addAnimation(anim1);<br /> group-&gt;addAnimation(anim2);<br /> group-&gt;start();<br />一个并行group在同一时刻播放多个动画。对start()的调用将启动它所统治的所有的动画。<br /><br />QPushButton button("Animated Button");<br /> button.show();<br /> QPropertyAnimation anim1(&amp;button, "geometry");<br /> anim1.setDuration(3000);<br /> anim1.setStartValue(QRect(0, 0, 100, 30));<br /> anim1.setEndValue(QRect(500, 500, 100, 30));<br /> QPropertyAnimation anim2(&amp;button, "geometry");<br /> anim2.setDuration(3000);<br /> anim2.setStartValue(QRect(500, 500, 100, 30));<br /> anim2.setEndValue(QRect(1000, 500, 100, 30));<br /> QSequentialAnimationGroup group;<br /> group.addAnimation(&amp;anim1);<br /> group.addAnimation(&amp;anim2);<br /> group.start();<br />QsequentialAnimationGroup顺序的播放它的动画们。它在上一个完成时按顺序播放下一个。<br /><br /><p>既然一个动画组本就是一个动画类，你可以把它添加到其它组中。如此，你可以建立起一个动画树。<br /></p><p><br /></p><strong>动画和状态</strong><br />当 使用状态机，我们可以使用一个QSignalTransition或QEventTransition类在状态转换时连接一个或多个动画。这些类都是从 QAbstractTransition派生的，它们定义了简易的函数addAnimation()，使得能够添加一个或多个动画，在状态转换时启动这些 动画。<br /><br />我们还可能连接属性与状态，而不是手动设置开始与结束值。下面是完整的代码，演示了动画一个QPushButton的geometry属性。<br /><br />QPushButton *button = new QPushButton("Animated Button");<br /> button-&gt;show();<br /> QStateMachine *machine = new QStateMachine;<br /> QState *state1 = new QState(machine);<br /> state1-&gt;assignProperty(button, "geometry", QRect(0, 0, 100, 30));<br /> machine-&gt;setInitialState(state1);<br /> QState *state2 = new QState(machine);<br /> state2-&gt;assignProperty(button, "geometry", QRect(250, 250, 100, 30));<br /> QSignalTransition *transition1 = state1-&gt;addTransition(button,<br />     SIGNAL(clicked()), state2);<br /> transition1-&gt;addAnimation(new QPropertyAnimation(button, "geometry"));<br /> QSignalTransition *transition2 = state2-&gt;addTransition(button,<br />     SIGNAL(clicked()), state1);<br /> transition2-&gt;addAnimation(new QPropertyAnimation(button, "geometry"));<br /> machine-&gt;start();</div><img src ="http://www.cppblog.com/zhonghua/aggbug/200815.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhonghua/" target="_blank">米米</a> 2013-06-05 16:40 <a href="http://www.cppblog.com/zhonghua/archive/2013/06/05/200815.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Qt 动画详解一 </title><link>http://www.cppblog.com/zhonghua/archive/2013/06/05/200814.html</link><dc:creator>米米</dc:creator><author>米米</author><pubDate>Wed, 05 Jun 2013 08:39:00 GMT</pubDate><guid>http://www.cppblog.com/zhonghua/archive/2013/06/05/200814.html</guid><wfw:comment>http://www.cppblog.com/zhonghua/comments/200814.html</wfw:comment><comments>http://www.cppblog.com/zhonghua/archive/2013/06/05/200814.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhonghua/comments/commentRss/200814.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhonghua/services/trackbacks/200814.html</trackback:ping><description><![CDATA[<div><h2>概述<br /></h2><p style="margin-bottom: 0in;">Qt<span style="font-family:DejaVu Sans;">动画架构中的主要类如下图所示：</span></p><p style="margin-bottom: 0in;"><img src="http://img.my.csdn.net/uploads/201212/12/1355280135_1882.png" alt="" /><br /></p><p style="margin-bottom: 0in;"><br /></p><p style="margin-bottom: 0in"><span style="font-family:DejaVu Sans;">动画框架由基类</span>QAbstractAnimation<span style="font-family:DejaVu Sans;">和它的两个儿子</span>QVariantAnimation<span style="font-family:DejaVu Sans;">和</span>QAnimationGroup<span style="font-family:DejaVu Sans;">组成。</span>QAbstractAnimation<span style="font-family:DejaVu Sans;">是所有动画类的祖宗。它包含了所有动画的基本属性。比如开始，停止和暂停一个动画的能力。它也可以接收时间改变通知。</span></p><p style="margin-bottom: 0in"><br /></p><p style="margin-bottom: 0in"><span style="font-family:DejaVu Sans;">动画框架又进一步提供了</span>QProertyAnimation<span style="font-family:DejaVu Sans;">类。它继承自</span>QVariantAnimation<span style="font-family:DejaVu Sans;">并对某个</span>Qt<span style="font-family:DejaVu Sans;">属性（它须是</span>Qt<span style="font-family:DejaVu Sans;">的&#8221;元数据对象系统&#8221;的一部分，见</span>http://blog.csdn.net/nkmnkm/article/details/8225089<span style="font-family:DejaVu Sans;">）执行动画。此类对属性执行一个宽松曲线插值。所以当你想去动画一个值时，你可以把它声明为一个属性，并且让你的类成为一个</span>QObject<span style="font-family:DejaVu Sans;">。这给予我们极大的自由度来动画那些已存在的</span>widget<span style="font-family:DejaVu Sans;">和其它</span>QObject<span style="font-family:DejaVu Sans;">。</span></p><p style="margin-bottom: 0in"><br /></p><p style="margin-bottom: 0in"><span style="font-family:DejaVu Sans;">复杂的动画可以通过建立一个</span>QAbstractAnimation<span style="font-family:DejaVu Sans;">的树来构建。这个树通过使用</span>QAnimationGroups<span style="font-family:DejaVu Sans;">来创建，</span>QAnimationGroups<span style="font-family:DejaVu Sans;">作为其它动画的容器。注意动画组也是从</span>QAbstractAnimation<span style="font-family:DejaVu Sans;">派生的，所以动画组可以再包含其它动画组。</span></p><p style="margin-bottom: 0in"><br /></p><p style="margin-bottom: 0in"><span style="font-family:DejaVu Sans;">动画框架可以单独使用，同时也被设计为状态机框架的一部分。状态机提供了一个特定的状态可以用来播放动画。在进入或退出某个状态时</span>QState<span style="font-family:DejaVu Sans;">也可以设置属性们，并且这个特定的动画状态将在指定</span>QPropertyAnimation<span style="font-family:DejaVu Sans;">时给予的值之间做插值运算。后面我们要进一步介绍此问题。</span></p><p style="margin-bottom: 0in"><br /></p><p style="margin-bottom: 0in"><span style="font-family:DejaVu Sans;">在场景的背后，动画被一个全局定时器收集，这个定时器发送</span>update<span style="font-family:DejaVu Sans;">到所有的正在播放的动画中。</span></p><h2><a name="t1"></a><span style="font-family:DejaVu Sans;">动画框架中的类们</span></h2><table cellpadding="2" cellspacing="0" width="100%"><colgroup><col width="106*"><col width="150*"></colgroup><tbody><tr><td style="border: none; padding: 0in" width="41%"><p align="CENTER"><a href="http://qabstractanimation.html/"><span style="color:#0000ff;"><span style="font-family:Arial,Geneva,Helvetica,sans-serif;"><u><strong>QAbstractAnimation</strong></u></span></span></a></p></td><td style="border: none; padding: 0in" width="59%"><p><span style="font-family:DejaVu Sans;">所有动画类的基类</span></p></td></tr><tr><td style="border: none; padding: 0in" width="41%"><p align="CENTER"><a href="http://qanimationgroup.html/"><span style="color:#0000ff;"><span style="font-family:Arial,Geneva,Helvetica,sans-serif;"><u><strong>QAnimationGroup</strong></u></span></span></a></p></td><td style="border: none; padding: 0in" width="59%"><p><span style="font-family:DejaVu Sans;">动画组的基类</span></p></td></tr><tr><td style="border: none; padding: 0in" width="41%"><p align="CENTER"><a href="http://qeasingcurve.html/"><span style="color:#0000ff;"><span style="font-family:Arial,Geneva,Helvetica,sans-serif;"><u><strong>QEasingCurve</strong></u></span></span></a></p></td><td style="border: none; padding: 0in" width="59%"><p><span style="font-family:DejaVu Sans;">控制动画的宽松曲线类</span></p></td></tr><tr><td style="border: none; padding: 0in" width="41%"><p align="CENTER"><a href="http://qparallelanimationgroup.html/"><span style="color:#0000ff;"><span style="font-family:Arial,Geneva,Helvetica,sans-serif;"><u><strong>QParallelAnimationGroup</strong></u></span></span></a></p></td><td style="border: none; padding: 0in" width="59%"><p><span style="font-family:DejaVu Sans;">并行动画组类</span></p></td></tr><tr><td style="border: none; padding: 0in" width="41%"><p align="CENTER"><a href="http://qpauseanimation.html/"><span style="color:#0000ff;"><span style="font-family:Arial,Geneva,Helvetica,sans-serif;"><u><strong>QPauseAnimation</strong></u></span></span></a></p></td><td style="border: none; padding: 0in" width="59%"><p><span style="font-family:DejaVu Sans;">串行动画组类的暂停类</span></p></td></tr><tr><td style="border: none; padding: 0in" width="41%"><p align="CENTER"><a href="http://qpropertyanimation.html/"><span style="color:#0000ff;"><span style="font-family:Arial,Geneva,Helvetica,sans-serif;"><u><strong>QPropertyAnimation</strong></u></span></span></a></p></td><td style="border: none; padding: 0in" width="59%"><p><span style="font-family:DejaVu Sans;">动画</span><span style="font-family:Arial,Geneva,Helvetica,sans-serif;">Qt</span><span style="font-family:DejaVu Sans;">属性的类</span></p></td></tr><tr><td style="border: none; padding: 0in" width="41%"><p align="CENTER"><a href="http://qsequentialanimationgroup.html/"><span style="color:#0000ff;"><span style="font-family:Arial,Geneva,Helvetica,sans-serif;"><u><strong>QSequentialAnimationGroup</strong></u></span></span></a></p></td><td style="border: none; padding: 0in" width="59%"><p><span style="font-family:DejaVu Sans;">串行动画组类</span></p></td></tr><tr><td style="border: none; padding: 0in" width="41%"><p align="CENTER"><a href="http://qtimeline.html/"><span style="color:#0000ff;"><span style="font-family:Arial,Geneva,Helvetica,sans-serif;"><u><strong>QTimeLine</strong></u></span></span></a></p></td><td style="border: none; padding: 0in" width="59%"><p><span style="font-family:DejaVu Sans;">控制动画的时间线类</span></p></td></tr><tr><td style="border: none; padding: 0in" width="41%"><p align="CENTER"><a href="http://qvariantanimation.html/"><span style="color:#0000ff;"><span style="font-family:Arial,Geneva,Helvetica,sans-serif;"><u><strong>QVariantAnimation</strong></u></span></span></a></p></td><td style="border: none; padding: 0in" width="59%"><p><span style="font-family:DejaVu Sans;">各动画类的虚基类</span></p></td></tr></tbody></table><p style="margin-bottom: 0in;"><br /></p><h2><a name="t2"></a><span style="font-family:DejaVu Sans;">动画</span>Qt<span style="font-family:DejaVu Sans;">属性们</span></h2><p style="margin-bottom: 0in"><span style="font-family:DejaVu Sans;">如前面所讲，</span>QPropertyAnimation<span style="font-family:DejaVu Sans;">类可以修改</span>Qt<span style="font-family:DejaVu Sans;">属性们。要动画一个值，就需要使用此类。实际上，它的父类，</span>QVariantAnimation<span style="font-family:DejaVu Sans;">，是一个虚拟类，不能被直接使用。</span></p><p style="margin-bottom: 0in"><br /></p><p style="margin-bottom: 0in"><span style="font-family:DejaVu Sans;">我们选择动画</span>Qt<span style="font-family:DejaVu Sans;">属性的一个主要理由是</span>Qt<span style="font-family:DejaVu Sans;">属性为我们提供了自己动画已存在的类的自由度。尤其是</span>QWidget<span style="font-family:DejaVu Sans;">类（我们也可以把它嵌入到一个</span>QGraphicsView<span style="font-family:DejaVu Sans;">中）具有很多属性表示其</span>bounds,colors<span style="font-family:DejaVu Sans;">等等。让我们看一个小例子：</span></p><div bg_cpp"=""><div><div><strong>[cpp]</strong> <a href="http://blog.csdn.net/nkmnkm/article/details/8285484#" title="view plain">view plain</a><a href="http://blog.csdn.net/nkmnkm/article/details/8285484#" title="copy">copy</a></div></div><ol start="1"><li><span>QPushButton&nbsp;button("Animated&nbsp;Button");&nbsp;&nbsp;</span></li><li>button.show();&nbsp;&nbsp;</li><li>QPropertyAnimation&nbsp;animation(&amp;button,&nbsp;<span>"geometry");&nbsp;&nbsp;</span></li><li>animation.setDuration(10000);&nbsp;&nbsp;</li><li>animation.setStartValue(QRect(0,&nbsp;0,&nbsp;100,&nbsp;30));&nbsp;&nbsp;</li><li>animation.setEndValue(QRect(250,&nbsp;250,&nbsp;100,&nbsp;30));&nbsp;&nbsp;</li><li>animation.start();&nbsp;&nbsp;</li></ol></div><p style="margin-bottom: 0in"><span style="font-family:DejaVu Sans;">这段代码将把按钮在</span>10<span style="font-family:DejaVu Sans;">秒种内从屏幕的左上角移动到</span>(250,250)<span style="font-family:DejaVu Sans;">处。</span></p><p style="margin-bottom: 0in;"><span style="font-family:DejaVu Sans;">上面的例子举在开始值和结束值之间做线性插值。还可以在开始和结束值之间设置值，插值运算就会经过这些点。</span></p><p style="margin-bottom: 0in"><span style="font-family:DejaVu Sans;"><br /></span></p><div bg_cpp"=""><div><div><strong>[cpp]</strong> <a href="http://blog.csdn.net/nkmnkm/article/details/8285484#" title="view plain">view plain</a><a href="http://blog.csdn.net/nkmnkm/article/details/8285484#" title="copy">copy</a></div></div><ol start="1"><li><span>QPushButton&nbsp;button("Animated&nbsp;Button");&nbsp;&nbsp;</span></li><li>button.show();&nbsp;&nbsp;</li><li>QPropertyAnimation&nbsp;animation(&amp;button,&nbsp;<span>"geometry");&nbsp;&nbsp;</span></li><li>animation.setDuration(10000);&nbsp;&nbsp;</li><li>animation.setKeyValueAt(0,&nbsp;QRect(0,&nbsp;0,&nbsp;100,&nbsp;30));&nbsp;&nbsp;</li><li>animation.setKeyValueAt(0.8,&nbsp;QRect(250,&nbsp;250,&nbsp;100,&nbsp;30));&nbsp;&nbsp;</li><li>animation.setKeyValueAt(1,&nbsp;QRect(0,&nbsp;0,&nbsp;100,&nbsp;30));&nbsp;&nbsp;</li><li>animation.start();&nbsp;&nbsp;</li></ol></div><p>在此例中，动画将按钮在8秒中内弄到(250,250)处，然后在2秒种内又弄回原位。移位是在这些点中间以线性插值进行的。</p><p><br />你 也有可能动画一个QObject的值，虽然这些值并没有被声明为Qt属性。唯一的要求就是这个值具有一个setter。之后你可以从这个类派生子类从而包 含这些值并且声明一个使用这个setter的属性。注意每个Qt属性都需要有一个getter，所以你需要提供一个getter，如果它不存在的话。</p><div bg_cpp"=""><div><div><strong>[cpp]</strong> <a href="http://blog.csdn.net/nkmnkm/article/details/8285484#" title="view plain">view plain</a><a href="http://blog.csdn.net/nkmnkm/article/details/8285484#" title="copy">copy</a></div></div><ol start="1"><li><span>class&nbsp;MyGraphicsRectItem&nbsp;:&nbsp;public&nbsp;QObject,&nbsp;public&nbsp;QGraphicsRectItem&nbsp;&nbsp;</span></li><li>{&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;Q_OBJECT&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;Q_PROPERTY(QRectF&nbsp;geometry&nbsp;READ&nbsp;geometry&nbsp;WRITE&nbsp;setGeometry)&nbsp;&nbsp;</li><li>};&nbsp;&nbsp;</li></ol></div><p>在上例中，我们派生了QGraphicsRectItem并定义了一个geometry属性。我们现在可以动画这个widget的geometry了，即使QGraphicsRectItem没有提供geometry属性。</p><h2><a name="t3"></a><span style="font-family:DejaVu Sans;">动画和图形视图框架</span></h2><p style="margin-bottom: 0in"><span style="font-family:DejaVu Sans;">当你想动画</span>QGraphicsItems<span style="font-family:DejaVu Sans;">，你也要用</span>QPropertyAnimation<span style="font-family:DejaVu Sans;">。然而，</span>QGraphicsItem<span style="font-family:DejaVu Sans;">不是从</span>QObject<span style="font-family:DejaVu Sans;">派生的。一个好的解决方案是派生要动画的图形</span>item<span style="font-family:DejaVu Sans;">。派生类也要从</span>QObject<span style="font-family:DejaVu Sans;">派生。这样，</span>QPropertyAnimation<span style="font-family:DejaVu Sans;">就可以被用于</span>QGraphicsItems<span style="font-family:DejaVu Sans;">了。</span></p><div bg_cpp"=""><div><div><strong>[cpp]</strong> <a href="http://blog.csdn.net/nkmnkm/article/details/8285484#" title="view plain">view plain</a><a href="http://blog.csdn.net/nkmnkm/article/details/8285484#" title="copy">copy</a></div></div><ol start="1"><li><span>class&nbsp;Pixmap&nbsp;:&nbsp;public&nbsp;QObject,&nbsp;public&nbsp;QGraphicsPixmapItem&nbsp;&nbsp;</span></li><li>{&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;Q_OBJECT&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;Q_PROPERTY(QPointF&nbsp;pos&nbsp;READ&nbsp;pos&nbsp;WRITE&nbsp;setPos)&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;...&nbsp;&nbsp;</li></ol></div><p style="margin-bottom: 0in"><span style="font-family:DejaVu Sans;">就如上一节中所讲的，我们需要定义希望去动画的属性。</span></p><p style="margin-bottom: 0in"><span style="font-family:DejaVu Sans;">注意：</span>QObject<span style="font-family:DejaVu Sans;">必须是继承中的第一个，因为元数据对象系统需要这样做。</span></p><h2><a name="t4"></a><span style="font-family:DejaVu Sans;">宽松曲线</span></h2><p style="margin-bottom: 0in;">QPropertyAnimation<span style="font-family:DejaVu Sans;">在属性的开始值和结束值之间执行一个插值运算。除了向动画添加更多的关键值外，你还可以使用一个宽松曲线。宽松曲线描述了一个在</span>0<span style="font-family:DejaVu Sans;">和</span>1<span style="font-family:DejaVu Sans;">之间插值的速度变化的函数，如果你想控制一个动画的速度而不改变插值的路径时，就非常有用。</span></p><p style="margin-bottom: 0in;"><br /></p><div bg_cpp"=""><div><div><strong>[cpp]</strong> <a href="http://blog.csdn.net/nkmnkm/article/details/8285484#" title="view plain">view plain</a><a href="http://blog.csdn.net/nkmnkm/article/details/8285484#" title="copy">copy</a></div></div><ol start="1"><li><span>QPushButton&nbsp;button("Animated&nbsp;Button");&nbsp;&nbsp;</span></li><li>button.show();&nbsp;&nbsp;</li><li>QPropertyAnimation&nbsp;animation(&amp;button,&nbsp;<span>"geometry");&nbsp;&nbsp;</span></li><li>animation.setDuration(3000);&nbsp;&nbsp;</li><li>animation.setStartValue(QRect(0,&nbsp;0,&nbsp;100,&nbsp;30));&nbsp;&nbsp;</li><li>animation.setEndValue(QRect(250,&nbsp;250,&nbsp;100,&nbsp;30));&nbsp;&nbsp;</li><li>animation.setEasingCurve(QEasingCurve::OutBounce);&nbsp;&nbsp;</li><li>animation.start();&nbsp;&nbsp;</li></ol></div><p style="margin-bottom: 0in"><span style="font-family:DejaVu Sans;">这里，动画将按照一个曲线进行，这个曲线使得动画像一个跳动的皮球从开始位置跳到结束位置。</span>QEasingCurve<span style="font-family:DejaVu Sans;">具有一个大曲线集合，你可以从里面选择一个。它们被定义为</span>QEasingCurve::Type<span style="font-family:DejaVu Sans;">枚举。如果你需要不一样的曲线，你也可以自己实现一个，然后注册到</span>QEasingCurve<span style="font-family:DejaVu Sans;">。</span></p></div><img src ="http://www.cppblog.com/zhonghua/aggbug/200814.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhonghua/" target="_blank">米米</a> 2013-06-05 16:39 <a href="http://www.cppblog.com/zhonghua/archive/2013/06/05/200814.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Qt属性系统详解 </title><link>http://www.cppblog.com/zhonghua/archive/2013/06/05/200808.html</link><dc:creator>米米</dc:creator><author>米米</author><pubDate>Wed, 05 Jun 2013 01:53:00 GMT</pubDate><guid>http://www.cppblog.com/zhonghua/archive/2013/06/05/200808.html</guid><wfw:comment>http://www.cppblog.com/zhonghua/comments/200808.html</wfw:comment><comments>http://www.cppblog.com/zhonghua/archive/2013/06/05/200808.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhonghua/comments/commentRss/200808.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhonghua/services/trackbacks/200808.html</trackback:ping><description><![CDATA[<div><p>Qt提供了一个绝妙的属性系统。跟那些由编译器提供的属性差不多。然而，作为一个独立于编译器和平台的库，Qt不依赖于非标准的编译特性，比如 __property  或[property]。Qt可以在任何平台上的标准编译器下编译。Qt属性系统基于元数据对象系统－－就是那个提供了对象内置信号和槽通讯机制的家伙。<br /></p><br /><h2><a name="t0"></a>声明属性需要什么<br /></h2><br />要声明一个属性，需在继承自QObject的类中使用Q_PROPERTY()宏。<br />Q_PROPERTY(type name<br />&nbsp;           &nbsp;READ getFunction<br />&nbsp;           &nbsp;[WRITE setFunction]<br />&nbsp;           &nbsp;[RESET resetFunction]<br />&nbsp;           &nbsp;[NOTIFY notifySignal]<br />&nbsp;           &nbsp;[DESIGNABLE bool]<br />&nbsp;           &nbsp;[SCRIPTABLE bool]<br />&nbsp;           &nbsp;[STORED bool]<br />&nbsp;           &nbsp;[USER bool]<br />&nbsp;           &nbsp;[CONSTANT]<br />&nbsp;           &nbsp;[FINAL])<br /><p>下面是一些典型的声明属性的示例：</p><div bg_cpp"=""><div><div><strong>[cpp]</strong> <a href="http://blog.csdn.net/nkmnkm/article/details/8225089#" title="view plain">view plain</a><a href="http://blog.csdn.net/nkmnkm/article/details/8225089#" title="copy">copy</a></div></div><ol start="1"><li><span>Q_PROPERTY(bool&nbsp;focus&nbsp;READ&nbsp;hasFocus)&nbsp;&nbsp;</span></li><li>Q_PROPERTY(<span>bool&nbsp;enabled&nbsp;READ&nbsp;isEnabled&nbsp;WRITE&nbsp;setEnabled)&nbsp;&nbsp;</span></li><li>Q_PROPERTY(QCursor&nbsp;cursor&nbsp;READ&nbsp;cursor&nbsp;WRITE&nbsp;setCursor&nbsp;RESET&nbsp;unsetCursor)&nbsp;&nbsp;</li></ol></div><ul><li>一个属性的行为就像类的数据成员，但是它还具有附加的特性，这些特性可以被元数据对象系统操作。这些特性是：<br />需要一个READ访问器函数。用于读属性的值。理想情况下，有一个不变的函数用于此目的，并且它必须返回属性的类型的值或指针或引用。例如，QWidget::focus是一个只读的属性，它对应一个读函数：QWidget::hasFocus()。</li><li>一 个可选的WRITE访问器函数。它用于设置属性的值。它必须返回空并且至少具有一个参数，参数是属性类型的值或指针或引用。例 如：QWidget::enabled具有WRITE函数QWidget::setEnable()。只读属性不需要写函数。例 如，QWidget::focus没有对应的写函数。</li><li>一个可选的RESET函数。用于设置属性的值到它的默认值。例 如：QWidget::cursor具有典型的READ和WRITE函数，QWidget::cursor()和 QWidget::setCursor()，并且它也具有一个RESET函数，QWidget::unsetCursor()。RESET函数必须返回 void并且不带有任何参数。</li><li>一个可选的NOTIFY信号。如果被定义了，信号将在属性的值改变时发出。信号必须带有一个参数，这个参数的类型必须与属性相同；参数保存的是属性的新值。</li><li>一个DESIGNABLE变量表明此属性是否在界面设计器的属性编辑器中出现。大多数属性是可见的，除了为这个变量传入true或false，你还可以指定一个bool型的成员函数。</li><li>SCRIPTABLE变量表明这个属性是否可以被一个脚本引擎操作（默认是true）。你也可以赋予它true或false或bool型函数。</li><li>STORED 变量表明了属性是否被认为是独立存在还是依赖于其它的值而存在。它也表明是否在保存对象状态时保存此属性的值。大多数属性都是需要保存的，但是，如 QWidget::minimumWidth()就是不被保存的，因为它的值是从另一个属性QWidget::minimumSize()得来的。</li><li>USER变量表明属性是否被设计为面向用户的或用户可修改的类属性。通常，每个类只有一个USER属性。例如，QAbstractButton::checked是按钮类的用户可修改属性。注意QItemDelegate获取和设置widget的USER属性。</li><li>CONSTANT的出现表明属性的值是不变的。对于一个object实例，常量属性的READ方法在每次被调用时必须返回相同的值。此常量值可能在不同的object实例中不相同。一个常量属性不能具有WRITE方法或NOYIFY信号。</li><li>FINAL变量的出现表明属性不能被派生类所重写。有些情况下，这可以用于效率优化，但不是被moc强制的。程序员必须永远注意不能重写一个FINAL属性。<br /></li></ul><p>READ，WRITE和RESET函数都可以被继承。它们也可以是虚函数。当它们在被多重继承中被继承时，它们必须出现在第一个被继承的类中。<br /><br />属性的类型可以是被QVariant支持的所有类型，也可以是用户定义的类型。在下面的例子中，类QDate被当作用户自定义类型。<br />	Q_PROPERTY(QDate data READ getDate WRITE setDate)<br />因为QDate是用户定义的，你必须包含&lt;QDate&gt;头文件。<br /><br />对 于QMap,QList和QValueList属性，属性的值是一个QVariant，它包含整个list或map。注意Q_PROPERTY字符串不能 包含逗号，因为逗号会划分宏的参数。因此，你必须使用QMap作为属性的类型而不是QMap&lt;QString,QVariant&gt;。为了保持 一致性，也需要用QList和QValueList而不是QList&lt;QVariant&gt;和 QValueList&lt;QVariant&gt;。</p><p><br /></p><h3><a name="t1"></a>通过元数据对象系统读写属性<br /></h3><p>一 个属性可以使用常规函数QObject::property()和QObject::setProperty()进行读写，不用知道属性所在类的任何细 节，除了属性的名字。在下面的小代码片段中，调用QAbstractButton::setDown()和QObject::setProperty() 都把属性设置为&#8220;down&#8221;。</p><div bg_cpp"=""><div><div><strong>[cpp]</strong> <a href="http://blog.csdn.net/nkmnkm/article/details/8225089#" title="view plain">view plain</a><a href="http://blog.csdn.net/nkmnkm/article/details/8225089#" title="copy">copy</a></div></div><ol start="1"><li><span>QPushButton&nbsp;*button&nbsp;=&nbsp;new&nbsp;QPushButton;&nbsp;&nbsp;</span></li><li>QObject&nbsp;*object&nbsp;=&nbsp;button;&nbsp;&nbsp;</li><li>button-&gt;setDown(<span>true);&nbsp;&nbsp;</span></li><li>object-&gt;setProperty(<span>"down",&nbsp;true);&nbsp;&nbsp;</span></li></ol></div><br /><p>通 过WRITE操作器来操作一个属性是上面两者中更好的，因为它快并且在编译时给于更好的诊断帮助，但是以这种方式设置属性要求你必须在编译时了解其类。通 过名字来操作属性使你可以操作在编译器你不了解的类。你可以在运行时发现一个类的属性们，通过查询它的QObject,QMetaObject和 QMetaProerties。</p><div bg_cpp"=""><div><div><strong>[cpp]</strong> <a href="http://blog.csdn.net/nkmnkm/article/details/8225089#" title="view plain">view plain</a><a href="http://blog.csdn.net/nkmnkm/article/details/8225089#" title="copy">copy</a></div></div><ol start="1"><li><span>QObject&nbsp;*object&nbsp;=&nbsp;...&nbsp;&nbsp;</span></li><li><span>const&nbsp;QMetaObject&nbsp;*metaobject&nbsp;=&nbsp;object-&gt;metaObject();&nbsp;&nbsp;</span></li><li><span>int&nbsp;count&nbsp;=&nbsp;metaobject-&gt;propertyCount();&nbsp;&nbsp;</span></li><li><span>for&nbsp;(int&nbsp;i=0;&nbsp;i&lt;count;&nbsp;++i)&nbsp;{&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;QMetaProperty&nbsp;metaproperty&nbsp;=&nbsp;metaobject-&gt;property(i);&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>const&nbsp;char&nbsp;*name&nbsp;=&nbsp;metaproperty.name();&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;QVariant&nbsp;value&nbsp;=&nbsp;object-&gt;property(name);&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;...&nbsp;&nbsp;</li><li>}&nbsp;&nbsp;</li></ol></div><br /><p>在上面的代码片段中，QMetaObject::property()被用于获取未知类中的属性的metadata。从metadata中获取属性名然后传给QObject::property()来获取<br /></p><h3><a name="t2"></a>一个简单例子<br /></h3><p><br />假 设我们有一个类MyClass，它从QObject派生并且在它的private区使用  了Q_OBJECT宏。我们想在MyClass类中声明一个属性来持续追踪一个Priorty值。属性的值叫做priority，并且它的类型是一个在类 MyClass中定义的叫做Priority的枚举。<br /><br />我们在类的private区使用Q_PROPERTY()来声明属性。READ函数 叫做priority,并且我们包含一个WRITE函数叫做setPriority。枚举类型必须使用Q_ENUMS()注册到元数据对象系统中。注册一 个枚举类型使得枚举的名字可以在调用QObject::setProperty()时使用。我们还必须为READ和WRITE函数提供我们自己的声明。 MyClass的声明看起来应该是这样的：</p><div bg_cpp"=""><div><div><strong>[cpp]</strong> <a href="http://blog.csdn.net/nkmnkm/article/details/8225089#" title="view plain">view plain</a><a href="http://blog.csdn.net/nkmnkm/article/details/8225089#" title="copy">copy</a></div></div><ol start="1"><li><span>class&nbsp;MyClass&nbsp;:&nbsp;public&nbsp;QObject&nbsp;&nbsp;</span></li><li>{&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;Q_OBJECT&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;Q_PROPERTY(Priority&nbsp;priority&nbsp;READ&nbsp;priority&nbsp;WRITE&nbsp;setPriority)&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;Q_ENUMS(Priority)&nbsp;&nbsp;</li><li><span>public:&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;MyClass(QObject&nbsp;*parent&nbsp;=&nbsp;0);&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;~MyClass();&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>enum&nbsp;Priority&nbsp;{&nbsp;High,&nbsp;Low,&nbsp;VeryHigh,&nbsp;VeryLow&nbsp;};&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>void&nbsp;setPriority(Priority&nbsp;priority);&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;Priority&nbsp;priority()&nbsp;<span>const;&nbsp;&nbsp;</span></li><li>};&nbsp;&nbsp;</li></ol></div><p>READ函数是const的并且返回属性的类型。WRITE函数返回void并且具有一个属性类型的参数。元数据对象编译器强制做这些事情。<br /><br />在有了一个指向MyClass实例的指针时，我们有两种方法来设置priority属性：</p><div bg_cpp"=""><div><div><strong>[cpp]</strong> <a href="http://blog.csdn.net/nkmnkm/article/details/8225089#" title="view plain">view plain</a><a href="http://blog.csdn.net/nkmnkm/article/details/8225089#" title="copy">copy</a></div></div><ol start="1"><li><span>MyClass&nbsp;*myinstance&nbsp;=&nbsp;new&nbsp;MyClass;&nbsp;&nbsp;</span></li><li>&nbsp;QObject&nbsp;*object&nbsp;=&nbsp;myinstance;&nbsp;&nbsp;</li><li>&nbsp;myinstance-&gt;setPriority(MyClass::VeryHigh);&nbsp;&nbsp;</li><li>&nbsp;object-&gt;setProperty(<span>"priority",&nbsp;"VeryHigh");&nbsp;&nbsp;</span></li></ol></div><p>在 此例子中，枚举类型在MyClass中声明并被使用Q_ENUMS()注册到元数据对象系统中。这使得枚举值可以在调用setProperty()时做为 字符串使用。如果枚举类型是在其它类中声明的，那么我们就需要用枚举的全名（如OtherClass::Priority)，并且这个其它类也必须从 QObject中派生并且也要注册枚举类型。<br />另一个简单的Q_FLAGS()也是可用的。就像Q_ENUMS()，它注册一个枚举类型，但是它把 枚举类型作为一个flag的集合，也就是，值可以用OR操作来合并。一个I/O类可能具有枚举值Read和Write并且 QObject::setProperty()可以接受 Read|Write。此时应使用Q_FLAGS()来注册枚举值。<br /></p><h3><a name="t3"></a>动态属性<br /></h3><p>Qobject::setProperty() 也可以用来在运行时向一个类的实例添加新的属性。当使用一个名字和值调用它时，如果一个对应的属性已经存在，并且如果值的类型与属性的类型兼容，那么值就 被存储到属性中，然后返回true。如果值类型不兼容，属性的值就不会发生改变，就会返回false。但是如果对应名字的属性不存在，那么一个新的属性就 诞生了，以传入的名字为名，以传入的值为值，但是依然会返回false。这表示返回值不能用于确定一个属性是否被设置值，除非你已经知道这个属性已经存在 于QObject中了。<br />注意动态属性被添加到单个实现的基础中，也就是，被添加到QObject，而不是QMetaObject。一个属性可以从 一个实例中删除，通过传入属性的名字和非法的QVariant值给QObject::setProperty()。默认的QVariant构造器构造一个 非法的QVariant。<br />动态属性可用QObject::property()来查询，就行使用Q_PROPERTY()声明的属性一样。</p><h3><a name="t4"></a>属性和自定义类型<br /></h3><p>被属性使用的自定义类型需要使用Q_DECLARE_METATYPE()宏注册，以使它们的值能被保存在QVariant对象中。这使得它们可以用于被Q_PROPERTY()声明的静态类型中，也可以被用于动态类型中。</p></div><img src ="http://www.cppblog.com/zhonghua/aggbug/200808.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhonghua/" target="_blank">米米</a> 2013-06-05 09:53 <a href="http://www.cppblog.com/zhonghua/archive/2013/06/05/200808.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>QGrapicsItem类  </title><link>http://www.cppblog.com/zhonghua/archive/2013/05/24/200561.html</link><dc:creator>米米</dc:creator><author>米米</author><pubDate>Fri, 24 May 2013 03:08:00 GMT</pubDate><guid>http://www.cppblog.com/zhonghua/archive/2013/05/24/200561.html</guid><wfw:comment>http://www.cppblog.com/zhonghua/comments/200561.html</wfw:comment><comments>http://www.cppblog.com/zhonghua/archive/2013/05/24/200561.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhonghua/comments/commentRss/200561.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhonghua/services/trackbacks/200561.html</trackback:ping><description><![CDATA[<div>QGraphicsItem类是视图框架的一部分，是在一个QGraphicsScene中最基本的图形类，它为绘制你<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />自己的item提供了一个轻量级的窗口，包括声明item的位置，碰撞检测，绘制重载和item之间的相<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />互作用通过事件处理<br />&nbsp;<br />Qt提供了一系列标准的items对一些常见的图像，非常的方便，有下面这些：<br />&nbsp;<br />QGraphicsEllipseItem&nbsp; 提供一个椭圆item<br />&nbsp;<br />QGraphicsLineItem&nbsp;&nbsp;&nbsp;&nbsp; 提供一条线的item<br />&nbsp;<br />QGraphicsPathItem&nbsp;&nbsp;&nbsp;&nbsp; 提供一个任意的路径item<br />&nbsp;<br />QGraphicsPixmapItem&nbsp;&nbsp; 提供一个图形item<br />&nbsp;<br />QGraphicsPolygonItem&nbsp; 提供一个多边形item<br />&nbsp;<br />QGraphicsRectItem&nbsp;&nbsp;&nbsp;&nbsp; 提供一个矩形item<br />&nbsp;<br />QGraphicsSimpleTextItem 提供一个简单的文本item<br />&nbsp;<br />QGraphicsTextItem&nbsp;&nbsp;&nbsp;&nbsp; 提供一个文本浏览item<br />&nbsp;<br />item 的所有几何位置信息都建立在本地坐标系统上，item的位置，使用pos()获得，是唯一一个不再本地item中实现的。它返回的是item在父亲坐标系 统中的位置，关于坐标系统可以详细参看 The Graphics View Coordinate System<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />通 过调用哪个setVisible()，可以设置item是否可见，隐藏一个item同时也隐藏了他的孩子，相似的，你可以通过调用 setEnabled()来是指item是否可用。如果禁用了item，那么它所有的孩子都不可用。默认的，items都是可见和可用的。来开关一个 item是否被选择，首先通过设置itemsSelectable  flag来使能选择。然后调用setSelect()，通常，是否可被选择的开关时打开的<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />写自己的item图形，首先应该继承QGraphicsItem,然后重写他的两个纯虚公共函数，   <p>boundingRect()和paint()，第一个函数返回绘制item大概的区域，第二个函数用来绘制item内容<br />&nbsp;<br />&nbsp;<br />&nbsp;</p>  <p><br />boundingRect() 函数有很多用处，场景在boundingRect()来建立它的item的index，视图view使用它来剪切可见的item，在重新绘制item时 候，来决定相互重叠的部分，此外，item的碰撞检测机制也使用的boundingRect()来提供一个高效的定点，在 collidesWithItem()更好的碰撞算法建立在调用函数shape(),shape()函数以QpainterPath类型返回item的精 准的轮廓。<br />&nbsp;<br />一般的，场景不希望item的boundingRect()和shape()变化，除非该item被通告，如果想通过一些方法改变item的形状，首先应该调用QgraphicsScene()来允许场景QgraphicsScene来刷新它的item记录。<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />碰撞检测可以通过下面两种方法来完成<br />&nbsp;<br />1、重写shape()函数来返回item的精准轮廓，依靠默认的collidesWithItem()来做外形交集。如果item轮廓和复杂时候，这个消耗是很大的<br />&nbsp;<br />2、重写collidesWithItem()，提供一个自己的item和轮廓碰撞的算法<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />Contains（）函数可以调用，用来决定一个item是否包含一个点。这个函数也可以重写，contains()函数默认的方法是通过调用shape（）来完成的。<br />&nbsp;<br />Items中也可以包含其他的items,也可以被别的items包含，所有的items可以有一个父亲item和一串孩子items,除非一个item没有父亲，否则它的位置是在父亲坐标中，父亲items遗传他的位置和转换给孩子item<br />&nbsp;<br />转换<br />&nbsp;<br />QgraphicsItem 支持投射转换，有很多方法来改变item的转换，对于简单的转换，可以调用函数setRotation()或者setScale()，可以传递一个转换矩 阵给函数setTransform(),对于一些更复杂的转换，可以通过调用函数setTransformations()来设置一系列组合的转换。<br />&nbsp;<br />Item 转换从父亲到孩子进行聚集，因此如果一个父亲和孩子item都旋转90度，那么孩子就旋转了180度，相似的，如果父亲item放大了2X倍，那么孩子 item就被方法4X倍，一个item的转换不影响他的外观，所有和外观有关的函数（例如contains(),update()和所有的映射 mapping函数）将会在本地坐标中操作，更方便的，QgraphicsItem提供函数sceneTransform()，将会返回item所有的转 换矩阵，scenePos()将会返回item在场景坐标中的位置，重新设置item的矩阵，调用函数resetTransform()<br />&nbsp;<br />一 般的转换回产生一个不同的结果，这取决于转换应用的顺序，例如，如果你放大一个转换，然后再旋转它，可能和你先旋转它得到的结果不一样，你设置转换属性的 顺序并不影响转换的结果，（也就是仍旧会按照你的转换命令去转换，只是最后得到的图形不一样而已），QgraphicsItem经常应用一个合适的顺序如 下：<br />&nbsp;</p>  <p><br />绘图painting<br />&nbsp;<br />paint()函数被QgrapicsView类调用来绘制item的 内容，item默认是没有背景或者填充颜色的。在函数中没有被绘制的所有区域都将会发亮，可以调用update（）来重绘item，可以选择传递需要重绘 的矩形区域（不是必须的）。取决于item在view中是否可见，item可能会也可能不会重绘，QgraphicsItem里面没有和 Qwidget::repaint()函数等价的<br />&nbsp;<br />item通过view来绘制，从父items开始，然后是自items，以上升的栈的 顺序，可以通过调用setZValue()设置item的栈顺序，通过zValue()来测试，具有低z-values的item比具有高z-value 的item先绘制，栈顺序应用于兄弟items，父items总是比子items更早绘制。<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />排序sort<br />&nbsp;<br />所有的items都按照一个已经声明的，稳定的顺序来绘制，这个顺序也决定了当你在场景中点击鼠标时候，哪个items最先接受鼠标的输入。一般的，你不需要担心排序问题，因为所有的items都按照一个在场景中声明的自然的顺序<br />&nbsp;</p>  <p><br />在一个栈中，子item在父item的上面，兄弟item按照插入场景的顺序来入栈，如果你先添加了item A ，然后是item B，然后是item C ，这样栈中的顺序从下往上就是A,B,C<br />&nbsp;<br />Drag  and Drop  Robot例子中展示了该robot的栈顺序，躯干顺序是根item（其他所有的item都是躯干item的子item或者后代item），然后是头 item被绘制，由于它是躯干item的子item列表中的第一个item，然后是左臂膀上面的那部分item，下面那个臂膀item是上面臂膀item 的子item，所以会在和3号item同等级的兄弟item绘制完后被绘制，接着就是右边上面的的臂膀item，就是5号item。<br />&nbsp;<br />&nbsp;。可以调用setZvalue()来设置一个item的相对亦另一个向上，向下或者兄弟栈顺序。默认的Z值是0，具有同样的Z值的item会按照插入的顺序来入栈。<br />&nbsp;<br />。可以调用stackBefore()来备份孩子item的列表，这可以直接更正item的顺序。<br />&nbsp;<br />。如果想让孩子item在父item的后面，也就是先绘制孩子item，然后在绘制父item，怎么办呢？可以设置ItemStacksBehindParent属性给这个item，利用函数setFlag();<br />&nbsp;<br />两个兄弟item的顺序也决定了他们的子item 和后代item的顺序，如果一个父item的在两个父item的后面，那么他所有的孩子items都在另一个父item的孩子items后面。<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />事件Event<br />&nbsp;<br />QgraphicsItem从场景中通过sceneEvent()函数来接受事件，这个函数通过一些方便的操作分散大部分事件<br />&nbsp;<br />ContextMenuEvent()函数接受上下文菜单事件<br />&nbsp;<br />FocusInEvent()和focusOutEvent()函数接受焦点进出事件<br />&nbsp;<br />hoverEnterEvent(), hoverMoveEvent(), and hoverLeaveEvent() 接受鼠标悬浮 移动和离开事件<br />&nbsp;<br />inputMethodEvent()函数处理输入法事件，<br />&nbsp;<br />keyPressEvent() and keyReleaseEvent()事件处理键盘按下和松开事件<br />&nbsp;<br />mousePressEvent(), mouseMoveEvent(), mouseReleaseEvent(), and mouseDoubleClickEvent()处理鼠标按下，移动，松开，双击事件<br />&nbsp;<br />也 可以为一些item过滤一些事件通过安装过滤器，这个和QT一般的事件过滤器不一样，一般的过滤器只工作在Qobject和它的子类，通过调用 installSceneEventFilter()为item安装了过滤器后，被过滤的事件将会被虚函数sceneEventFilter().捕捉 到，可以通过调用函数removeSceneEventFilter().来去除掉事件过滤器<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />Custom Data数据<br />&nbsp;<br />有 些时候为item注册一些数值很有用，做一个普通的item或者标准的item，可以调用setData()来为任一个item设置值，这个值使用 key-value对，（key是整形，value是变种数据Qvarient）来得到item的数据，通过调用data(),<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />1、QVariant QGraphicsItem::itemChange ( GraphicsItemChange change, const QVariant &amp; value )&nbsp;&nbsp; [virtual protected]<br />&nbsp;<br />这个函数被QGraphicsItem调用用来标明items的一些状态改变了，通过重载这个函数，可以对自己定义事件响应，在一些情况下，可以做一些调整。<br />&nbsp;<br />参数change是改变的那个item的改变状态参数，value是一个新的数据，他的类型取决于change，<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />change是QGraphicsItem::GraphicsItemChange的枚举变量<br />&nbsp;<br />enum&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GraphicsItemChange { ItemEnabledChange, ItemEnabledHasChanged, </p>  <p>&nbsp;<br />&nbsp;<br />ItemMatrixChange, ItemPositionChange, ..., ItemScenePositionHasChanged }<br />&nbsp;<br />例如：<br />&nbsp;<br />&nbsp;QVariant Component::itemChange(GraphicsItemChange change, const QVariant &amp;value)<br />&nbsp;<br />&nbsp;{<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp; if (change == ItemPositionChange &amp;&amp; scene()) {<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // value is the new position.<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QPointF newPos = value.toPointF();<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QRectF rect = scene()-&gt;sceneRect();<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!rect.contains(newPos)) {<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Keep the item inside the scene rect.<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newPos.setX(qMin(rect.right(), qMax(newPos.x(), rect.left())));<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newPos.setY(qMin(rect.bottom(), qMax(newPos.y(), rect.top())));<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return newPos;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp; return QGraphicsItem::itemChange(change, value);<br />&nbsp;<br />&nbsp;}<br />&nbsp;<br />默认的函数什么都不做，只返回value<br />&nbsp;<br />注 意：在使用这个函数时候，在函数内部调用函数时候要小心，因为这可能导致一些意想不到的结果，例如：你不能再这个函数里面调用setPos()在 change是ItemPositionChange时候，由于setPos()函数将会再次调用 itemChange(ItemPositionChange)，如此就一直循环下去了。<br />&nbsp;<br />2、void QGraphicsItem::setFlag ( GraphicsItemFlag flag, bool enabled = true )<br />&nbsp;<br />void QGraphicsItem::setFlags ( GraphicsItemFlags flags )<br />&nbsp;<br />把flags设置为item的属性，如果item获得了光标，但是flags没有使能ItemsFocusable,这个item<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />将会丢失光标，同样的，当item被选择到，但是没有使能ItemsSelectable,这个item会自动的失去<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />选择。<br />&nbsp;<br />默认的，所有的flags都是不可用的。（QGraphicsWidget 为了获得位置变化默认使能了<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />ItemSendsGeometryChanges）<br />&nbsp;<br />相近的函数<br />&nbsp;<br />GraphicsItemFlags QGraphicsItem::flags () const<br />&nbsp;<br />返回item的所有使能的flags，例如，如果flags里面包含了ItemIsFocusable，这个item可以接受<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />输入光标<br />&nbsp;<br />3、QPainterPath QGraphicsItem::shape () const&nbsp;&nbsp; [virtual]<br />&nbsp;<br />以QPainterPath返回item在local坐标中的形状，这个形状可以用来做很多事情，包括碰撞侦测，<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />打击测试，还有用来 QGraphicsScene::items() 函数<br />&nbsp;<br />默认的函数调用boundingRect()返回一个简单的矩形形状，但是子类可以重载这个函数，为非矩形<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />的item返回一个更加精准的形状，例如一个圆形的item可以选择返回一个椭圆形，用来获得更好的<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />碰撞侦测效果。代码：<br />&nbsp;<br />QPainterPath RoundItem::shape() const<br />&nbsp;<br />&nbsp;{<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp; QPainterPath path;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp; path.addEllipse(boundingRect());<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp; return path;<br />&nbsp;<br />&nbsp;}<br />&nbsp;<br />形状的轮廓线可以通过绘制时候的pen来变化<br />&nbsp;<br />4、QRectF QGraphicsItem::boundingRect () const&nbsp;&nbsp; [pure virtual]<br />&nbsp;<br />这个纯虚函数用矩形声明了item的边界轮廓，所有的绘制都必须限定在item的矩形边框内。<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />QGraphicsView使用这个方法来决定item是否需要重绘<br />&nbsp;<br />尽管item的形状可以是任意的，但是边框一直都是矩形，不影响items的变换<br />&nbsp;<br />如果想改变items的边框，应该首先调用prepareGeometryChange()，这将通知场景scene即将发生的变化，这样场景可以刷新item的位置下标。否则，场景将不会察觉到item的变化，结果也未知。<br />&nbsp;<br />如果要重绘item时候，重载这个函数来让QGraphicsView来决定item的边界区域，<br />&nbsp;<br />注意：由于绘制边界时候的边界轮廓线，在这个矩形区域内包含画笔pen宽度的一半很重要，不需<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />要补偿画图走样&nbsp; 例如<br />&nbsp;<br />&nbsp;QRectF CircleItem::boundingRect() const<br />&nbsp;<br />&nbsp;{<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp; qreal penWidth = 1;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp; return QRectF(-radius - penWidth / 2, -radius - penWidth / 2,<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; diameter + penWidth, diameter + penWidth);<br />&nbsp;<br />&nbsp;}<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />同样的一个返回item轮廓的函数<br />&nbsp;<br />QRegion QGraphicsItem::boundingRegion ( const QTransform &amp; itemToDeviceTransform ) const<br />&nbsp;<br />返回该item的轮廓区域，返回的区域的坐标系统依赖于参数itemToDeviceTransform，如果你传递一个Qtransform对象作为参数，那么函数将返回本地坐标系统区域<br />&nbsp;<br />返回的区域是item内容可见的一个大概的轮廓，尽管计算起来很浪费空间和时间，但是比boundingRect（）更精准，而且当重绘时候，它还能避免不必要的重绘。对像线或者简单的多边形来说非常有效。<br />&nbsp;<br />也可以调节轮廓区域的粒度通过调用setBoundingRegionGranularity()，默认的粒度是0，这时候item的区域和轮廓矩形一样的。<br />&nbsp;<br />itemToDeviceTransform是从item坐标系统到设备坐标系统的一个转换。如果你想让这个函数返回一个场景坐标区域，可以用函数sceneTransform()作为参数。<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />相关函数qreal QGraphicsItem::boundingRegionGranularity () const<br />&nbsp;<br />返回item的轮廓区域粒度<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />5、void QGraphicsItem::setPos ( const QPointF &amp; pos )<br />&nbsp;<br />在父对象坐标系统中设置item的位置为pos，对没有父对象的items,pos使用的场景的坐标系统，<br />&nbsp;<br />6、QPointF QGraphicsItem::scenePos () const<br />&nbsp;<br />返回该item在场景中的坐标点，等价于调用函数mapToScene(0, 0).<br />&nbsp;<br />7、QPointF QGraphicsItem::pos () const<br />&nbsp;<br />返回item在父坐标系中的位置，如果没有父坐标系，那么返回在场景坐标系中的位置，此时等价于调用scenePos ()，可以直接调用scenePos ()来获取该item在场景中的位置，从而忽略其父对象。<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />8、enum QGraphicsItem::CacheMode<br />设置绘图的缓冲模式，默认是没有缓冲，如果使用缓冲区的话，在重绘时候，非常快<br />&nbsp;<br />设置缓冲模式使用函数QGraphicsItem::setCacheMode().<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />9、bool QGraphicsItem::acceptDrops () const<br />&nbsp;<br />如果item能够接受拖拽事件，就返回真，否则返回假，默认的不能接受拖拽事件<br />&nbsp;<br />&nbsp;同类函数<br />&nbsp;<br />void QGraphicsItem::setAcceptDrops ( bool on )<br />&nbsp;<br />如果On是真的话，就设置item可以接受拖拽事件，否则对拖拽事件是透明的，也就是不能响应拖拽，默认是不响应的。<br />&nbsp;<br />10、bool QGraphicsItem::acceptHoverEvents () const<br />&nbsp;<br />如果可以接受鼠标悬浮在他上面的事件，就返回真，否则返回假。默认也是不接受该事件的。<br />&nbsp;<br />同样的用于设置是否接受该事件的函数<br />&nbsp;<br />void QGraphicsItem::setAcceptHoverEvents ( bool enabled )<br />&nbsp;<br />如果enabled为真，就接受，否则就不接受。<br />&nbsp;<br />11、Qt::MouseButtons QGraphicsItem::acceptedMouseButtons () const<br />&nbsp;<br />返回这个item所能接受的鼠标事件的鼠标键，默认的是所有的鼠标键事件都能接受。<br />&nbsp;<br />同 样的使用函数void QGraphicsItem:: setAcceptedMouseButtons ( Qt::MouseButtons  buttons )来设置接受的鼠标键事件，如果想忽略某个鼠标键事件，可以用setAcceptedMouseButtons（0）<br />&nbsp;<br />12、void QGraphicsItem::advance ( int phase )&nbsp;&nbsp; [virtual]<br />&nbsp;<br />这 个虚函数被QGraphicsScene::advance()调用两次，第一次调用，所有的items都调用，使用参数phase=0，表示场景中所有 的items都将advance（前进），然后所有的items都将调用，使用参数phase=1，重写这个函数，可以来刷新你的item，如果你需要简 单的场景控制动画。<br />&nbsp;<br />默认的该函数什么事都不做<br />&nbsp;<br />如果想写动画，可以使用两种方法，一个使用 QGraphicsItemAnimation,，或多重继承Qobject和QgraphicsItem，然后使用 QObject::startTimer() 和 QObject::timerEvent().来使item成动画。<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />13、QList&lt;QGraphicsItem *&gt; QGraphicsItem::childItems () const<br />&nbsp;<br />返回孩子item的一个链表，这些items按照栈顺序排列，考虑了item的插入顺序和Z-values<br />&nbsp;<br />14、QRectF QGraphicsItem::childrenBoundingRect () const<br />&nbsp;<br />返回这个item的所有子孙items的本地坐标系统轮廓矩形。这个矩形包括了这个item所有的子孙item，如果这个item不含有子孙item，这个函数将返回一个空的矩形。<br />&nbsp;<br />返回的矩形不包括item本身的轮廓矩形，只返回子孙item的矩形轮廓，如果你想包含item本身的矩形区域，可以使用QRectF::operator|()把boundingRect()和hildrenBoundingRect()或起来。<br />&nbsp;<br />这个函数很复杂，它决定了返回轮廓的大小通过重复所有子孙item<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />15、void QGraphicsItem::clearFocus ()<br />&nbsp;<br />去除item的光标，如果原来有光标焦点，当焦点失去时候，事件focus out event会发送给这个item，提示他将会失去焦点。<br />&nbsp;<br />Item只有设置了ItemsFocusable属性，或者widget设置了合适的焦点策略，才能接受键盘焦点。<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />16、 bool QGraphicsItem::collidesWithItem ( const QGraphicsItem * other,  Qt::ItemSelectionMode mode = Qt::IntersectsItemShape ) const&nbsp;&nbsp; [virtual]<br />&nbsp;<br />如 果这个item和另一个item碰撞就返回真，mode是应用于其他item的，默认是Qt::IntersectsItemShape，如果其他的 item和这个item相互影响或者包含，被包含于这个item的形状（详见Qt::ItemSelectionMode）。<br />&nbsp;<br />默认的函 数是就基于外形相互影响，它调用两个item的shape()函数，这将会花费很大时间，你可以在QgraphicsItem子类中重写这个函数，提供一 个简单的算法。这样你可以使用自己item的一些参数，这样可以提高碰撞侦测的效果。例如，两个完全没有转换的圆item的碰撞可以通过对比他们的圆心位 置和半径<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />17、bool QGraphicsItem::collidesWithPath ( const  QPainterPath &amp; path, Qt::ItemSelectionMode mode =  Qt::IntersectsItemShape ) const&nbsp;&nbsp; [virtual]<br />&nbsp;<br />如果item按照path碰撞就返回真，<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />18、QList&lt;QGraphicsItem *&gt; QGraphicsItem::collidingItems ( Qt::ItemSelectionMode mode = Qt::IntersectsItemShape ) const<br />&nbsp;<br />返回和这个item相互碰撞的item的链表<br />&nbsp;<br />碰撞侦测模式取决于mode,<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />19\ QGraphicsItem * QGraphicsItem::commonAncestorItem ( const QGraphicsItem * other ) const<br />&nbsp;<br />返回item最近的祖先item，如果other为0，或者没有祖先item，就返回0<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />20、bool QGraphicsItem::contains ( const QPointF &amp; point ) const&nbsp;&nbsp; [virtual]<br />&nbsp;<br />如果item包含了点point就返回TRUE，否则返回FALSE，最常用的是在QgraphicsView中调用，来判断这个item是否在光标下面，如果要重写这个函数，那就尽可能的简单。默认的这个函数调用的shape()函数<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />21、void QGraphicsItem::contextMenuEvent ( QGraphicsSceneContextMenuEvent * event )&nbsp;&nbsp; [virtual protected]<br />&nbsp;<br />右键菜单事件，可以在子类中重写这个函数，event里面包含了事件要具体处理的数据。<br />&nbsp;<br />如果忽略这个事件，调用函数QEvent::ignore()，事件event将会被传播到任何在该item之下的items,如果没有item响应这个事件，那么场景就忽略这个事件，传递给view视图<br />&nbsp;<br />通常是响应该事件打开一个右键菜单，例如<br />&nbsp;<br />void  CustomItem::contextMenuEvent(QGraphicsSceneContextMenuEvent *event)&nbsp;  {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QMenu menu;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QAction *removeAction =  menu.addAction("Remove");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QAction *markAction =  menu.addAction("Mark");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QAction *selectedAction =  menu.exec(event-&gt;screenPos());&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // ...&nbsp; } <br />&nbsp;<br />&nbsp;<br />默认是忽略该事件。<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />22、QVariant QGraphicsItem::data ( int key ) const<br />&nbsp;<br />以Qvariant的格式返回item中的数据，当前的item数据对存储任意数据很有用，例如<br />&nbsp;<br />static  const int ObjectName = 0;&nbsp;&nbsp;&nbsp; QGraphicsItem *item = scene.itemAt(100,  50);&nbsp; if (item-&gt;data(ObjectName).toString().isEmpty()) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if  (qgraphicsitem_cast&lt;ButtonItem *&gt;(item))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  item-&gt;setData(ObjectName, "Button");&nbsp; } <br />void QGraphicsItem::setData ( int key, const QVariant &amp; value )<br />&nbsp;<br />用来设置item的数据<br />&nbsp;<br />23、QTransform QGraphicsItem::deviceTransform ( const QTransform &amp; viewportTransform ) const<br />&nbsp;<br />返回item设备的转换矩阵，使用viewportTransform来从场景到设备影射坐标，这个矩阵可以用来从这个item本地坐标到视图口坐标系统映射坐标或者几何图形，如果要映射视图口坐标到本地坐标，首先应该转换返回的这个矩阵。<br />&nbsp;<br />QGraphicsRectItem  rect;&nbsp; rect.setPos(100, 100);&nbsp;&nbsp;&nbsp;  rect.deviceTransform(view-&gt;viewportTransform()).map(QPointF(0, 0));&nbsp;  // returns the item's (0, 0) point in view's viewport coordinates&nbsp;&nbsp;&nbsp;  rect.deviceTransform(view-&gt;viewportTransform()).inverted().map(QPointF(100,  100));&nbsp; // returns view's viewport's (100, 100) coordinate in item  coordinates <br />这个函数是结合了到场景的转换和到视图的转换，设备转换可以用来对那些没有进行转换坐标的item计算碰撞。<br />&nbsp;<br />24、拖拽类函数<br />&nbsp;<br />void QGraphicsItem::dragEnterEvent ( QGraphicsSceneDragDropEvent * event )&nbsp;&nbsp; [virtual protected]<br />&nbsp;<br />void QGraphicsItem::dragLeaveEvent ( QGraphicsSceneDragDropEvent * event )&nbsp;&nbsp; [virtual protected]<br />&nbsp;<br />void QGraphicsItem::dragMoveEvent ( QGraphicsSceneDragDropEvent * event )&nbsp;&nbsp; [virtual protected]<br />&nbsp;<br />void QGraphicsItem::dropEvent ( QGraphicsSceneDragDropEvent * event )&nbsp;&nbsp; [virtual protected]<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />25、qreal QGraphicsItem::effectiveOpacity () const<br />&nbsp;<br />返回item的有效透明度，这个数值在0.0~~1.0之间<br />&nbsp;<br />同样的可以用函数void QGraphicsItem::setOpacity ( qreal opacity )来设置透明度，<br />&nbsp;<br />默认的子item继承父item的透明度<br />&nbsp;<br />同样可以设置item的属性QGraphicsItem::ItemIgnoresParentOpacity 来忽略父item的透明度对自己的影响<br />&nbsp;<br />设置子item的属性QGraphicsItem::ItemIgnoresTransformations来忽略视图转换（放大，缩小）等操作对自己的影响，在显示文本时候很有用。<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />26、void QGraphicsItem::hoverEnterEvent ( QGraphicsSceneHoverEvent * event )&nbsp;&nbsp; [virtual protected]<br />&nbsp;<br />void QGraphicsItem::hoverLeaveEvent ( QGraphicsSceneHoverEvent * event )&nbsp;&nbsp; [virtual protected]<br />&nbsp;<br />void QGraphicsItem::hoverMoveEvent ( QGraphicsSceneHoverEvent * event )&nbsp;&nbsp; [virtual protected]<br />&nbsp;<br />鼠标悬浮事件<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />27、void QGraphicsItem::mouseDoubleClickEvent ( QGraphicsSceneMouseEvent * event )&nbsp;&nbsp; [virtual protected]<br />&nbsp;<br />void QGraphicsItem::mouseMoveEvent ( QGraphicsSceneMouseEvent * event )&nbsp;&nbsp; [virtual protected]<br />&nbsp;<br />void QGraphicsItem::mousePressEvent ( QGraphicsSceneMouseEvent * event )&nbsp;&nbsp; [virtual protected]<br />&nbsp;<br />void QGraphicsItem::mouseReleaseEvent ( QGraphicsSceneMouseEvent * event )&nbsp;&nbsp; [virtual protected]<br />&nbsp;<br />鼠标双击，移动，释放的事件<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />28、QPointF QGraphicsItem::mapFromItem ( const QGraphicsItem * item, const QPointF &amp; point ) const<br />&nbsp;<br />QPolygonF QGraphicsItem::mapFromItem ( const QGraphicsItem * item, const QRectF &amp; rect ) const<br />&nbsp;<br />QPainterPath QGraphicsItem::mapFromItem ( const QGraphicsItem * item, const QPainterPath &amp; path ) const<br />&nbsp;<br />QPolygonF QGraphicsItem::mapFromItem ( const QGraphicsItem * item, qreal x, qreal y, qreal w, qreal h ) const<br />&nbsp;<br />QPointF QGraphicsItem::mapFromItem ( const QGraphicsItem * item, qreal x, qreal y ) const<br />&nbsp;<br />QPointF QGraphicsItem::mapFromParent ( const QPointF &amp; point ) const<br />&nbsp;<br />QPolygonF QGraphicsItem::mapFromParent ( const QRectF &amp; rect ) const<br />&nbsp;<br />QPolygonF QGraphicsItem::mapFromParent ( const QPolygonF &amp; polygon ) const<br />&nbsp;<br />QPainterPath QGraphicsItem::mapFromParent ( const QPainterPath &amp; path ) const<br />&nbsp;<br />QPolygonF QGraphicsItem::mapFromParent ( qreal x, qreal y, qreal w, qreal h ) const<br />&nbsp;<br />QPointF QGraphicsItem::mapFromParent ( qreal x, qreal y ) const<br />&nbsp;<br />QPointF QGraphicsItem::mapFromScene ( const QPointF &amp; point ) const<br />&nbsp;<br />QPolygonF QGraphicsItem::mapFromScene ( const QRectF &amp; rect ) const<br />&nbsp;<br />QPolygonF QGraphicsItem::mapFromScene ( const QPolygonF &amp; polygon ) const<br />&nbsp;<br />QPainterPath QGraphicsItem::mapFromScene ( const QPainterPath &amp; path ) const<br />&nbsp;<br />QPolygonF QGraphicsItem::mapFromScene ( qreal x, qreal y, qreal w, qreal h ) const<br />&nbsp;<br />QPointF QGraphicsItem::mapFromScene ( qreal x, qreal y ) const<br />&nbsp;<br />QRectF QGraphicsItem::mapRectFromItem ( const QGraphicsItem * item, const QRectF &amp; rect ) const<br />&nbsp;<br />QRectF QGraphicsItem::mapRectFromItem ( const QGraphicsItem * item, qreal x, qreal y, qreal w, qreal h ) const<br />&nbsp;<br />。。。。。。。。。。太多了<br />&nbsp;<br />转换矩阵函数<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />29、void QGraphicsItem::moveBy ( qreal dx, qreal dy )<br />&nbsp;<br />向x,y方向上移动dx,dy的距离，等价于调用setPos(pos()+QpointF(dx,dy))<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />30\最重要的一个函数<br />&nbsp;<br />void QGraphicsItem::paint ( QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget = 0 )&nbsp;&nbsp; [pure virtual]<br />&nbsp;<br />这个函数通常被view调用，然后再本地坐标系统中绘制item的内容<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />31、qreal QGraphicsItem::rotation () const<br />&nbsp;<br />返回item的旋转度，<br />&nbsp;<br />设置旋转度函数使用setRotation(),<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />32、qreal QGraphicsItem::scale () const<br />&nbsp;<br />返回缩放系数<br />&nbsp;<br />设置缩放使用setScale()<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />33、bool QGraphicsItem::sceneEvent ( QEvent * event )&nbsp;&nbsp; [virtual protected]<br />&nbsp;<br />截获事件，在事件没有分发给各个具体的事件处理函数之前。<br />&nbsp;<br />相当于bool QObject::event ( QEvent * e )&nbsp;&nbsp; [virtual]<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />34、void QGraphicsItem::scroll ( qreal dx, qreal dy, const QRectF &amp; rect = QRectF() )<br />&nbsp;<br />滚动item<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />35、在使item能响应一些事件之前，需要先使能这个功能，例如<br />&nbsp;<br />void QGraphicsItem::setAcceptDrops ( bool on )&nbsp; </p>  <p>如果on为真，那么就使能拖拽，否则将会忽略拖拽事件。默认是不接受的<br />&nbsp;<br />void QGraphicsItem::setAcceptHoverEvents ( bool enabled )<br />&nbsp;<br />如果on为真，使能鼠标悬浮事件。默认不接受该事件。<br />&nbsp;<br />void QGraphicsItem::setAcceptTouchEvents ( bool enabled )<br />&nbsp;<br />在一些支持触摸的设备上，这个函数将使能触摸事件。<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />36、void QGraphicsItem::setEnabled ( bool enabled )<br />&nbsp;<br />使该item有效，如果enabled为假，则该item不能用了<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />37、void QGraphicsItem::setGraphicsEffect ( QGraphicsEffect * effect )、<br />&nbsp;<br />设置item的效果，可以用模糊效果，印象效果，给定颜色绘制效果，透明效果等<br />&nbsp;<br />详细的可以参见QgraphicsEffect类<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />38、const int QGraphicsItem::Type<br />&nbsp;<br />返回该item的类型值，这个值是自己通过定义Type的值，然后使用type()虚函数来返回的，看例子<br />&nbsp;<br />class  QGraphicsPathItem : public QAbstractGraphicsShapeItem&nbsp; {&nbsp;&nbsp; public:&nbsp;&nbsp;&nbsp;  enum { Type = 2 };&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int type() const { return Type; }&nbsp;&nbsp;&nbsp; ...&nbsp; }; <br />&nbsp;<br />&nbsp;<br />39、T qgraphicsitem_cast ( QGraphicsItem * item )<br />&nbsp;<br />如果item是T类型的，把item转换成T类型的item，如果失败，则返回0<br />&nbsp;<br />如果想让他正确的工作，需要重新实现函数type（）来进行判断</p></div><img src ="http://www.cppblog.com/zhonghua/aggbug/200561.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhonghua/" target="_blank">米米</a> 2013-05-24 11:08 <a href="http://www.cppblog.com/zhonghua/archive/2013/05/24/200561.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>QT Plugin框架结构 </title><link>http://www.cppblog.com/zhonghua/archive/2013/02/22/198000.html</link><dc:creator>米米</dc:creator><author>米米</author><pubDate>Fri, 22 Feb 2013 07:10:00 GMT</pubDate><guid>http://www.cppblog.com/zhonghua/archive/2013/02/22/198000.html</guid><wfw:comment>http://www.cppblog.com/zhonghua/comments/198000.html</wfw:comment><comments>http://www.cppblog.com/zhonghua/archive/2013/02/22/198000.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhonghua/comments/commentRss/198000.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhonghua/services/trackbacks/198000.html</trackback:ping><description><![CDATA[<div><span id="articlecontent" style="width: 740px">                                                             <p align="center"><strong><span style="font-size: 15pt; font-family: 宋体;">一：</span></strong><strong><span style="font-size: 15pt;">qt plugin </span></strong><strong><span style="font-size: 15pt; font-family: 宋体;">介绍</span></strong></p>  <p><strong><span style="font-size: 15pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></strong><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; color: black;">Qt Plugin</span><span style="font-family: 宋体; color: black;">和其他类型的插件一样，是一种计算机应用程序，它和主应用程序</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; color: black;">(host application)</span><span style="font-family: 宋体; color: black;">互相交互，以提供特定的功能。应用程序支持</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; color: black;">Plugin</span><span style="font-family: 宋体; color: black;">有许多原因，一些主要原因包括：使得第三方开发者有能力扩展应用程序，以提供无法先期预料的特色；减小应用程序的大小；由于软件版权之间的不兼容性将源代码和应用程序分享。</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; color: black;">Qt Plugin </span><span style="font-family: 宋体; color: black;">分动态插件和静态插件两种。</span></p>  <p><strong><span style="font-size: 15pt; font-family: 宋体;">二：</span></strong><strong><span style="font-size: 15pt;">qt plugin </span></strong><strong><span style="font-size: 15pt; font-family: 宋体;">创建和使用方法</span></strong></p>  <p style="text-indent: 21pt;"><span style="font-size: 12pt;">Qt</span><span style="font-size: 12pt; font-family: 宋体;">有两种与插件有关的</span><span style="font-size: 12pt;">API</span><span style="font-size: 12pt; font-family: 宋体;">。一种用来扩展</span><span style="font-size: 12pt;">Qt</span><span style="font-size: 12pt; font-family: 宋体;">本身的功能，如自定义数据库驱动，图像格式，文本编解码，自定义分格，等等，称为</span><span style="font-size: 12pt;">Higher-Level API</span><span style="font-size: 12pt; font-family: 宋体;">。另一种用于应用程序的功能扩展，称为</span><span style="font-size: 12pt;">Lower-Level API</span><span style="font-size: 12pt; font-family: 宋体;">。前一种是建立在后一种的基础之上的。这里讨论的是后一种，即用来扩展应用程序的</span><span style="font-size: 12pt;">Lower-level API</span><span style="font-size: 12pt; font-family: 宋体;">。</span></p>  <p><span style="font-size: 12pt; font-family: 宋体;">让应用程序支持插件扩展的步骤：</span></p>  <p><span style="font-size: 12pt;">&nbsp;1. </span><span style="font-size: 12pt; font-family: 宋体;">定义一个接口集</span><span style="font-size: 12pt;">(</span><span style="font-size: 12pt; font-family: 宋体;">只有纯虚函数的类</span><span style="font-size: 12pt;">)</span><span style="font-size: 12pt; font-family: 宋体;">，用来与插件交流。</span></p>  <p><span style="font-size: 12pt;">&nbsp;2. </span><span style="font-size: 12pt; font-family: 宋体;">用宏</span><span style="font-size: 12pt;">Q_DECLARE_INTERFACE()</span><span style="font-size: 12pt; font-family: 宋体;">将该接口告诉</span><span style="font-size: 12pt;">Qt</span><span style="font-size: 12pt; font-family: 宋体;">元对象系统。</span></p>  <p><span style="font-size: 12pt;">&nbsp;Q_DECLARE_INTERFACE(BrushInterface,"com.trolltech.PlugAndPaint.BrushInterface/1.0")</span></p>  <p><span style="font-size: 12pt;">&nbsp;3. </span><span style="font-size: 12pt; font-family: 宋体;">应用程序中用</span><span style="font-size: 12pt;">QPluginLoader</span><span style="font-size: 12pt; font-family: 宋体;">来装载插件。</span></p>  <p><span style="font-size: 12pt;">&nbsp;4. </span><span style="font-size: 12pt; font-family: 宋体;">用宏</span><span style="font-size: 12pt;">qobject_cast()</span><span style="font-size: 12pt; font-family: 宋体;">来确定一个插件是否实现了接口。</span></p>  <p><span style="font-size: 12pt;">&nbsp;QObject *obj = new QTimer;&nbsp;</span></p>  <p><span style="font-size: 12pt;">&nbsp;QTimer *timer = qobject_cast&lt;QTimer *&gt;(obj);</span></p>  <p><span style="font-size: 12pt; font-family: 宋体;">写一个插件的步骤：</span></p>  <p><span style="font-size: 12pt;">&nbsp;1. </span><span style="font-size: 12pt; font-family: 宋体;">声明插件类，该类从</span><span style="font-size: 12pt;">QObject</span><span style="font-size: 12pt; font-family: 宋体;">和该插件希望实现的接口继承而来。</span></p>  <p><span style="font-size: 12pt;">&nbsp;2. </span><span style="font-size: 12pt; font-family: 宋体;">用宏</span><span style="font-size: 12pt;">Q_INTERFACES()</span><span style="font-size: 12pt; font-family: 宋体;">将该接口告诉</span><span style="font-size: 12pt;">Qt</span><span style="font-size: 12pt; font-family: 宋体;">元对象系统。</span></p>  <p><span style="font-size: 12pt;">&nbsp;&nbsp;class BasicToolsPlugin : public QObject,</span></p>  <p><span style="font-size: 12pt;">&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;public BrushInterface,</span></p>  <p><span style="font-size: 12pt;">&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; public ShapeInterface,</span></p>  <p><span style="font-size: 12pt;">&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; public FilterInterface</span></p>  <p><span style="font-size: 12pt;">&nbsp;&nbsp;{</span></p>  <p><span style="font-size: 12pt;">&nbsp;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Q_OBJECT</span></p>  <p><span style="font-size: 12pt;">&nbsp;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Q_INTERFACES(BrushInterface ShapeInterface FilterInterface)</span></p>  <p><span style="font-size: 12pt;">&nbsp;&nbsp;public:</span></p>  <p><span style="font-size: 12pt;">&nbsp;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>...</span></p>  <p><span style="font-size: 12pt;">&nbsp;&nbsp; };</span></p>  <p><span style="font-size: 12pt;">&nbsp;3. </span><span style="font-size: 12pt; font-family: 宋体;">用宏</span><span style="font-size: 12pt;">Q_EXPORT_PLUGIN2()</span><span style="font-size: 12pt; font-family: 宋体;">导出插件。</span></p>  <p><span style="font-size: 12pt;">&nbsp;&nbsp;Q_EXPORT_PLUGIN2 ( PluginName, ClassName )</span></p>  <p><span style="font-size: 12pt;">&nbsp;4. </span><span style="font-size: 12pt; font-family: 宋体;">用适当的</span><span style="font-size: 12pt;">.pro</span><span style="font-size: 12pt; font-family: 宋体;">文件构建插件。</span></p>  <p><span style="font-size: 12pt; font-family: 宋体;">下面的代码声明了一个接口类：</span></p>  <p>&nbsp;</p>  <p style="text-indent: 6pt;"><span style="font-size: 12pt;">class FilterInterface</span></p>  <p><span style="font-size: 12pt;">&nbsp;{</span></p>  <p><span style="font-size: 12pt;">&nbsp;public:</span></p>  <p><span style="font-size: 12pt;">&nbsp;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>virtual ~FilterInterface() {}</span></p>  <p><span style="font-size: 12pt;">&nbsp;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>virtual QStringList filters() const = 0;</span></p>  <p><span style="font-size: 12pt;">&nbsp;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>virtual QImage filterImage(const QString &amp;filter, const QImage &amp;image, QWidget* parent)=0;</span></p>  <p><span style="font-size: 12pt;">&nbsp;&nbsp;};</span></p>  <p><span style="font-size: 12pt;">Q_DECLARE_INTERFACE(FilterInterface, "com.trolltech.PlugAndPaint.FilterInterface/1.0")</span></p>  <p><span style="font-size: 12pt; font-family: 宋体;">这里是实现该接口的插件类的定义：</span></p>  <p>&nbsp;</p>  <p><span style="font-size: 12pt;">&nbsp;#include &lt;QObject&gt;</span></p>  <p><span style="font-size: 12pt;">&nbsp;#include &lt;QStringList&gt;</span></p>  <p><span style="font-size: 12pt;">&nbsp;#include &lt;QImage&gt;</span></p>  <p><span style="font-size: 12pt;">&nbsp;#include &lt;plugandpaint/interfaces.h&gt;</span></p>  <p><span style="font-size: 12pt;">&nbsp;class ExtraFiltersPlugin : public QObject, public FilterInterface</span></p>  <p><span style="font-size: 12pt;">&nbsp;{</span></p>  <p><span style="font-size: 12pt;">&nbsp;Q_OBJECT</span></p>  <p><span style="font-size: 12pt;">&nbsp;Q_INTERFACES(FilterInterface)</span></p>  <p><span style="font-size: 12pt;">&nbsp;public:</span></p>  <p><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp; QStringList filters() const;</span></p>  <p><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp; QImage filterImage(const QString &amp;filter, const QImage &amp;image,</span></p>  <p><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp; QWidget *parent);</span></p>  <p><span style="font-size: 12pt;">&nbsp;};</span></p>  <p><span style="font-size: 12pt; font-family: 宋体;">根据插件的类型不同，</span><span style="font-size: 12pt;">pro</span><span style="font-size: 12pt; font-family: 宋体;">文件中配置上有不同。下面是</span><span style="font-size: 12pt;">pro</span><span style="font-size: 12pt; font-family: 宋体;">文件分析：</span></p>  <p><span style="font-size: 12pt;">TEMPLATE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = <span style="color: red;">lib</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // </span><span style="font-size: 12pt; font-family: 宋体;">声明为</span><span style="font-size: 12pt;">lib</span><span style="font-size: 12pt; font-family: 宋体;">，动态和静态插件一样。</span></p>  <p><span style="font-size: 12pt;">CONFIG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; += <span style="color: red;">plugin static </span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // </span><span style="font-size: 12pt; font-family: 宋体;">声明为</span><span style="font-size: 12pt;">plugin</span><span style="font-size: 12pt; font-family: 宋体;">，带</span><span style="font-size: 12pt;">static</span><span style="font-size: 12pt; font-family: 宋体;">表面为静态，否则为动态。</span></p>  <p><span style="font-size: 12pt;">INCLUDEPATH&nbsp;+= ../..</span></p>  <p><span style="font-size: 12pt;">HEADERS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = basictoolsplugin.h</span></p>  <p><span style="font-size: 12pt;">SOURCES&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = basictoolsplugin.cpp</span></p>  <p><span style="font-size: 12pt;">TARGET&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = $$qtLibraryTarget(<span style="color: red;">pnp_basictools</span>)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // </span><span style="font-size: 12pt; font-family: 宋体;">指明插件的名称</span></p>  <p><span style="font-size: 12pt;">DESTDIR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = ../../plugandpaint/plugins</span></p>  <p><span style="font-size: 12pt; font-family: 宋体;">加载插件的主应用程序默认在当前目录下的</span><span style="font-size: 12pt;">plugins</span><span style="font-size: 12pt; font-family: 宋体;">文件夹中寻找可用插件，如果是动态插件，则直接放在</span><span style="font-size: 12pt;">plugins</span><span style="font-size: 12pt; font-family: 宋体;">文件夹中便可，如果是静态，则需要在主应用程序的</span><span style="font-size: 12pt;">main</span><span style="font-size: 12pt; font-family: 宋体;">函数的开始的地方用宏：</span><span style="font-size: 11pt; font-family: Fixedsys; color: green;">Q_IMPORT_PLUGIN(pluginname(</span><span style="font-size: 11pt; font-family: Fixedsys; color: green;">和pro文件中声明的一致))</span><span style="font-size: 11pt; font-family: Fixedsys;">声明需要加载的插件并在工程配置中指明插件的lib位置。</span></p>  <p><strong><span style="font-size: 15pt; font-family: 宋体;">三：基于</span></strong><strong><span style="font-size: 15pt;">qt plugin </span></strong><strong><span style="font-size: 15pt; font-family: 宋体;">技术的框架结构设想</span></strong></p>  <p style="margin-left: 39pt; text-indent: -18pt;"><span style="font-size: 12pt;"><span>1.<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-size: 12pt; font-family: 宋体;">愿景</span></p>  <p style="margin-left: 42pt;"><span style="font-size: 12pt; font-family: 宋体;">由于我们目前系统功能多，模块多，缺乏系统的整体性。我们想借助</span><span style="font-size: 12pt;">Qt Plugin</span><span style="font-size: 12pt; font-family: 宋体;">技术，把各个独立的功能模块实现为一个个插件，统一在主体框架中，并能根据不同地方的用户的不同需求，在主框架中加载不同的功能模块，以实现整个系统的功能集中，体现出系统的整体性。</span></p>  <p style="margin-left: 39pt; text-indent: -18pt;"><span style="font-size: 12pt;"><span>2.<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-size: 12pt;">plugin </span><span style="font-size: 12pt; font-family: 宋体;">接口</span></p>  <p style="margin-left: 42pt; text-align: left; text-indent: 21pt;" align="left"><span style="font-size: 11pt; font-family: Fixedsys;">通过技术验证得出，目前我们采用动态插件，各个功能的插件实现定义的统一接口，具体功能放在插件界面中实现，此部分就像开发独立的应用程序，只是需要注意的是：</span></p>  <p style="margin-left: 81pt; text-align: left; text-indent: -18pt;" align="left"><span style="font-size: 11pt; font-family: Fixedsys;">&#9312; </span><span style="font-size: 11pt; font-family: Fixedsys;">功能部分的主界面需要继承至插件界面基类：<span style="color: black;">PluginWidget</span><span style="color: black;">，插件接口中用具体的实现类指针给插件界面基类指针赋值，在加载插件的主框架中通过插件接口中定义的基类指针统一调用，利用C++动态技术动态识别具体指向的实现类。</span></span></p>  <p style="margin-left: 81pt; text-align: left; text-indent: -18pt;" align="left"><span style="font-size: 11pt; font-family: Fixedsys;">&#9313; </span><span style="font-size: 11pt; font-family: Fixedsys;">插件界面类必须实现基类的虚函数：<span style="color: black;">CreateActions()</span><span style="color: black;">用于创建Action</span></span></p>  <p style="margin-left: 81pt; text-align: left; text-indent: -18pt;" align="left"><span style="font-size: 11pt; font-family: Fixedsys;">&#9314; </span><span style="font-size: 11pt; font-family: Fixedsys; color: black;">创建Action需要使用基类的方法newAction创建，在此函数中加入了保存创建的Action功能。</span></p>  <p style="margin-left: 42pt;" align="left"><span style="font-size: 11pt; font-family: Fixedsys;">插件接口定义如下：</span></p>  <p style="margin-left: 42pt;" align="left"><span style="font-size: 11pt; font-family: Fixedsys; color: blue;">class</span><span style="font-size: 11pt; font-family: Fixedsys;"> <span style="color: black;">QPluginInterface</span></span></p>  <p style="margin-left: 42pt;" align="left"><span style="font-size: 11pt; font-family: Fixedsys;">{</span></p>  <p style="margin-left: 42pt;" align="left"><span style="font-size: 11pt; font-family: Fixedsys; color: blue;">public</span><span style="font-size: 11pt; font-family: Fixedsys;">:</span></p>  <p style="margin-left: 42pt;" align="left"><span style="font-size: 11pt; font-family: Fixedsys;">&nbsp;&nbsp;&nbsp; <span style="color: green;">// </span></span><span style="font-size: 11pt; font-family: Fixedsys; color: green;">析构函数</span></p>  <p style="margin-left: 42pt;" align="left"><span style="font-size: 11pt; font-family: Fixedsys;">&nbsp;&nbsp;&nbsp; <span style="color: blue;">virtual</span> ~<span style="color: black;">QPluginInterface</span>() {}</span></p>  <p style="margin-left: 42pt;" align="left"><span style="font-size: 11pt; font-family: Fixedsys;">&nbsp;&nbsp;&nbsp; </span></p>  <p style="margin-left: 42pt;" align="left"><span style="font-size: 11pt; font-family: Fixedsys;">&nbsp;&nbsp;&nbsp; <span style="color: green;">// </span></span><span style="font-size: 11pt; font-family: Fixedsys; color: green;">插件名称</span></p>  <p style="margin-left: 42pt;" align="left"><span style="font-size: 11pt; font-family: Fixedsys;">&nbsp;&nbsp;&nbsp; <span style="color: blue;">virtual</span>&nbsp;&nbsp;&nbsp; <span style="color: black;">QString</span>&nbsp;&nbsp;&nbsp; <span style="color: black;">PluginName</span>() = 0;</span></p>  <p style="margin-left: 42pt;" align="left"><span style="font-size: 11pt; font-family: Fixedsys;">&nbsp;&nbsp;&nbsp; </span></p>  <p style="margin-left: 42pt;" align="left"><span style="font-size: 11pt; font-family: Fixedsys;">&nbsp;&nbsp;&nbsp; <span style="color: green;">// </span></span><span style="font-size: 11pt; font-family: Fixedsys; color: green;">插件显示在主框架中的图标文件路径</span></p>  <p style="margin-left: 42pt;" align="left"><span style="font-size: 11pt; font-family: Fixedsys;">&nbsp;&nbsp;&nbsp; <span style="color: blue;">virtual</span>&nbsp;&nbsp;&nbsp; <span style="color: black;">QString</span> <span style="color: black;">PluginIconurl</span>() = 0;</span></p>  <p style="margin-left: 42pt;" align="left"><span style="font-size: 11pt; font-family: Fixedsys;">&nbsp;&nbsp;&nbsp; </span></p>  <p style="margin-left: 42pt;" align="left"><span style="font-size: 11pt; font-family: Fixedsys;">&nbsp;&nbsp;&nbsp; <span style="color: green;">//</span></span><span style="font-size: 11pt; font-family: Fixedsys; color: green;">　插件提供的对外操作接口集</span></p>  <p style="margin-left: 42pt;" align="left"><span style="font-size: 11pt; font-family: Fixedsys;">&nbsp;&nbsp;&nbsp; <span style="color: blue;">virtual</span> <span style="color: black;">QList</span>&lt;<span style="color: black;">QAction</span>*&gt;* <span style="color: black;">Actions</span>() = 0;</span></p>  <p style="margin-left: 42pt;" align="left">&nbsp;</p>  <p style="margin-left: 42pt;" align="left"><span style="font-size: 11pt; font-family: Fixedsys;">&nbsp;&nbsp;&nbsp; <span style="color: green;">// </span></span><span style="font-size: 11pt; font-family: Fixedsys; color: green;">创建插件提供的操作方法</span></p>  <p style="margin-left: 42pt;" align="left"><span style="font-size: 11pt; font-family: Fixedsys;">&nbsp;&nbsp;&nbsp; <span style="color: blue;">virtual</span>&nbsp;&nbsp;&nbsp; <span style="color: blue;">void</span> <span style="color: black;">CreateActions</span>()=0;</span></p>  <p style="margin-left: 42pt;" align="left">&nbsp;</p>  <p style="margin-left: 42pt;" align="left"><span style="font-size: 11pt; font-family: Fixedsys;">&nbsp;&nbsp;&nbsp; <span style="color: green;">// </span></span><span style="font-size: 11pt; font-family: Fixedsys; color: green;">插件的主界面</span></p>  <p style="margin-left: 42pt;" align="left"><span style="font-size: 11pt; font-family: Fixedsys;">&nbsp;&nbsp;&nbsp; <span style="color: blue;">virtual</span> <span style="color: black;">QWidget</span>* <span style="color: black;">Widget</span>() = 0;</span></p>  <p style="margin-left: 42pt;" align="left"><span style="font-size: 11pt; font-family: Fixedsys; color: blue;">protected</span><span style="font-size: 11pt; font-family: Fixedsys;">:</span></p>  <p style="margin-left: 42pt;" align="left"><span style="font-size: 11pt; font-family: Fixedsys;">&nbsp;&nbsp;&nbsp; <span style="color: green;">// </span></span><span style="font-size: 11pt; font-family: Fixedsys; color: green;">插件的主界面基类</span></p>  <p style="margin-left: 42pt;" align="left"><span style="font-size: 11pt; font-family: Fixedsys;">&nbsp;&nbsp;&nbsp; <span style="color: black;">PluginWidget</span> *<span style="color: black;">pluginWidget</span>;</span></p>  <p style="margin-left: 42pt;"><span style="font-size: 11pt; font-family: Fixedsys;">};</span></p>  <p style="margin-left: 42pt;"><span style="font-size: 11pt; font-family: Fixedsys;">插件界面基类定义如下：</span></p>  <p style="margin-left: 42pt;" align="left"><span style="font-size: 11pt; font-family: Fixedsys; color: blue;">class</span><span style="font-size: 11pt; font-family: Fixedsys;"> <span style="color: black;">PluginWidget</span> :<span style="color: blue;">public</span> <span style="color: black;">QMainWindow</span></span></p>  <p style="margin-left: 42pt;" align="left"><span style="font-size: 11pt; font-family: Fixedsys;">{</span></p>  <p style="margin-left: 42pt;" align="left"><span style="font-size: 11pt; font-family: Fixedsys;">&nbsp;&nbsp;&nbsp; <span style="color: black;">Q_OBJECT</span></span></p>  <p style="margin-left: 42pt;" align="left"><span style="font-size: 11pt; font-family: Fixedsys; color: blue;">public</span><span style="font-size: 11pt; font-family: Fixedsys;">:</span></p>  <p style="margin-left: 42pt;" align="left"><span style="font-size: 11pt; font-family: Fixedsys;">&nbsp;&nbsp;&nbsp; <span style="color: black;">PluginWidget</span>(<span style="color: black;">QWidget</span>*<span style="color: black;">parent</span>=0);</span></p>  <p style="margin-left: 42pt;" align="left"><span style="font-size: 11pt; font-family: Fixedsys;">&nbsp;&nbsp;&nbsp; ~<span style="color: black;">PluginWidget</span>();</span></p>  <p style="margin-left: 42pt;" align="left"><span style="font-size: 11pt; font-family: Fixedsys;">&nbsp;&nbsp;&nbsp; <span style="color: black;">QList</span>&lt;<span style="color: black;">QAction</span>*&gt;*&nbsp;<span style="color: black;">Actions</span>();</span></p>  <p style="margin-left: 42pt;" align="left"><span style="font-size: 11pt; font-family: Fixedsys;">&nbsp;&nbsp;&nbsp; <span style="color: blue;">virtual</span> <span style="color: blue;">void</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: black;">CreateActions</span>(){}</span></p>  <p style="margin-left: 42pt;" align="left"><span style="font-size: 11pt; font-family: Fixedsys;">&nbsp;&nbsp;&nbsp; <span style="color: black;">QAction</span> *&nbsp;<span style="color: black;">newAction</span>(<span style="color: blue;">const</span> <span style="color: black;">QIcon</span> &amp;<span style="color: black;">icon</span>,<span style="color: blue;">const</span> <span style="color: black;">QString</span> &amp;<span style="color: black;">text</span>,<span style="color: black;">QObject</span>*<span style="color: black;">parent</span>);</span></p>  <p style="margin-left: 42pt;" align="left"><span style="font-size: 11pt; font-family: Fixedsys;">&nbsp;&nbsp;&nbsp; <span style="color: black;">QAction</span> *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: black;">newAction</span>(<span style="color: blue;">const</span> <span style="color: black;">QString</span> &amp;<span style="color: black;">text</span>,<span style="color: black;">QObject</span>*<span style="color: black;">parent</span>);</span></p>  <p style="margin-left: 42pt;" align="left"><span style="font-size: 11pt; font-family: Fixedsys;">&nbsp;&nbsp;&nbsp; <span style="color: blue;">void</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: black;">AppendAction</span>(<span style="color: black;">QAction</span>*<span style="color: black;">act</span>);</span></p>  <p style="margin-left: 42pt;" align="left"><span style="font-size: 11pt; font-family: Fixedsys; color: blue;">protected</span><span style="font-size: 11pt; font-family: Fixedsys;">:</span></p>  <p style="margin-left: 42pt;" align="left"><span style="font-size: 11pt; font-family: Fixedsys;">&nbsp;&nbsp;&nbsp; <span style="color: green;">// action</span></span><span style="font-size: 11pt; font-family: Fixedsys; color: green;">链表</span></p>  <p style="margin-left: 42pt;" align="left"><span style="font-size: 11pt; font-family: Fixedsys;">&nbsp;&nbsp;&nbsp; <span style="color: black;">QList</span>&lt;<span style="color: black;">QAction</span>*&gt; *<span style="color: black;">m_actlist</span>;</span></p>  <p style="margin-left: 18pt; text-indent: 21pt;"><span style="font-size: 11pt; font-family: Fixedsys;">};</span></p>  <p style="margin-left: 39pt;"><span style="font-size: 12pt; font-family: 宋体;">下图是一个实现案例中各类之间的关系图：</span></p>  <p style="margin-left: 39pt;"><a href="http://image45.360doc.com/DownloadImg/2011/12/0114/19702023_1.jpg" target="_blank"><img alt="基于QT Plugin框架结构  - yleesun - 与青春有关的日子..." src="http://image45.360doc.com/DownloadImg/2011/12/0114/19702023_1.jpg" /></a><br /></p>  <p style="margin-left: 39pt; text-indent: -18pt;"><span style="font-size: 12pt;"><span>3.<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-size: 12pt; font-family: 宋体;">插件调用</span></p>  <p style="margin-left: 42pt;"><span style="font-size: 12pt; font-family: 宋体;">插件在主框架中动态加载，目前考虑主框架基本结构是继承至</span><span style="font-size: 12pt;">QMainWindow</span><span style="font-size: 12pt; font-family: 宋体;">，工具栏上显示当前加载的插件的功能键，并留有返回键可以回退到上一级。主工作区是一个</span><span style="font-size: 12pt;">QStackWidget,</span><span style="font-size: 12pt; font-family: 宋体;">保存插件的界面，并把插件序号和插件对应的界面建立映射，保存在</span><span style="font-size: 12pt;">QMap&lt;int,QWidget&gt;</span><span style="font-size: 12pt; font-family: 宋体;">中。通过序号到</span><span style="font-size: 12pt;">QStackWidget</span><span style="font-size: 12pt; font-family: 宋体;">中切换界面。</span></p>  <p style="margin-left: 42pt;"><span style="font-size: 12pt; font-family: 宋体;">下图是把</span><span style="font-size: 12pt;">DBManager</span><span style="font-size: 12pt; font-family: 宋体;">做成插件加载到主框架的运行界面：</span></p>  <p align="center"><a href="http://image45.360doc.com/DownloadImg/2011/12/0114/19702023_2.jpg" target="_blank"><img alt="基于QT Plugin框架结构  - yleesun - 与青春有关的日子..." src="http://image45.360doc.com/DownloadImg/2011/12/0114/19702023_2.jpg" /></a><br /></p>  <p style="margin-left: 42pt;"><span style="font-size: 12pt; font-family: 宋体;">下图是把一个简单的绘图程序做成了插件，加载到主框架的运行界面：</span></p>  <p><a href="http://image45.360doc.com/DownloadImg/2011/12/0114/19702023_3.jpg" target="_blank"><img alt="基于QT Plugin框架结构  - yleesun - 与青春有关的日子..." style="text-align: center; display: block;" src="http://image45.360doc.com/DownloadImg/2011/12/0114/19702023_3.jpg" /></a></p>  <p><strong><span style="font-size: 15pt; font-family: 宋体;">四：总结</span></strong></p>  <p><strong><span style="font-size: 15pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span></strong><span style="font-size: 12pt; font-family: 宋体;">目前只是通过实现两个动态插件在主框架中运行，基本算是功能性的验证，离具体实施还有很多工作需要进一步的研究，比如主框架的风格，插件的管理等等。由于本人的能力有限，可能有很多认识不够的地方，请指正。</span></p>                                                                          </span></div><img src ="http://www.cppblog.com/zhonghua/aggbug/198000.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhonghua/" target="_blank">米米</a> 2013-02-22 15:10 <a href="http://www.cppblog.com/zhonghua/archive/2013/02/22/198000.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> QT图形视图体系 (The Graphics View Framework) </title><link>http://www.cppblog.com/zhonghua/archive/2013/02/06/197752.html</link><dc:creator>米米</dc:creator><author>米米</author><pubDate>Wed, 06 Feb 2013 02:38:00 GMT</pubDate><guid>http://www.cppblog.com/zhonghua/archive/2013/02/06/197752.html</guid><wfw:comment>http://www.cppblog.com/zhonghua/comments/197752.html</wfw:comment><comments>http://www.cppblog.com/zhonghua/archive/2013/02/06/197752.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhonghua/comments/commentRss/197752.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhonghua/services/trackbacks/197752.html</trackback:ping><description><![CDATA[<div><h2>概念</h2> <div> <table border="0"> <tbody> <tr> <th>名称 </th><th>含义</th> </tr> <tr> <td>View</td> <td>视图 视觉化一个场景</td> </tr> <tr> <td>Scene</td> <td>场景 用于管理图形项</td> </tr> <tr> <td>Item</td> <td>图形项 具体的图形对象</td> </tr> </tbody> </table> </div> <p>&nbsp;</p> <p>QT的图形视图架构采用Model-View模型，Scence里面包含多个Item，可以用多个View以不同的方式观察一个Scence </p> <h2><a name="t2"></a>功能<br />Scene(QGraphicsScene) </h2> <p> </p><ul><li> <p>添加，删除，查询图项</p> </li><li> <p>事件分发</p> </li><li> <p>管理图项的选择状态和焦点</p> </li></ul>  <h3><a name="t3"></a><strong>View （QGraphicsView)</strong> </h3> <ul><li>为Scene提供一个视图接口</li><li>接收鼠标键盘事件，转换后发给Scene</li><li>负责View和Scence之间的坐标变换&nbsp;</li></ul> <p>可以为View设置不同的ViewPort控件，比如QGLWidget来支持OpenGL，Read More!</p> <h3><a name="t4"></a><strong>Item （QGraphicsItem)</strong> </h3> <p>&nbsp;</p> <p>图形项的基类是QGraphicItem </p> <p>基础的Feature包括： </p> <ul><li> <div>处理鼠标键盘事件</div> </li><li> <div>拖放</div> </li><li> <div>分组</div> </li><li> <div>碰撞检测</div> </li></ul> <p>每个图形项都有自己的本例坐标系统，并提供它和场景坐标的转换函数。所以可以单独旋转或缩放某个一图形项 </p> <p><br />除了pos等很少的几个函数，图形项的多数函数所处理的坐标都是它的本地坐标（例如bounding rect) </p> <h2><a name="t5"></a>坐标系统</h2> <p>如上所述视图体系采用三种坐标系统：</p> <ul><li> <div>视口坐标： 对应物理坐标/设备坐标</div> </li><li> <div>场景坐标： 对应逻辑坐标</div> </li><li> <div>项坐标： 本地坐标</div> </li></ul> <h3><a name="t6"></a><strong>window-viewport概念</strong></h3> <p>window指定了逻辑坐标的矩形范围，viewport指定了设备坐标的矩形范围，和WorldTransform（世界转换矩阵）一起，决定了逻辑坐标和设备坐标之间的转换</p> <p>&nbsp;</p> <p>可以使用QGraphicsItemAnimation来动画一个Item，使用QTimeLine来控制时间进度</p> <p>&nbsp;</p> <h2><a name="t7"></a>其它特性</h2> <h3><a name="t8"></a>Animation动画</h3> <p>一个Item只能有效的和一个Animation对象关联(by  QGraphicsItemAnimation::setItem)，因为Animation对象设置图项Item的转换矩阵时，会替换对象现有的矩阵。 所以你不能通过绑定多个Animation对象来做多重动画，但是你可以在一个Animation对象中设置多种变换效果（或者用分组的方法，分级控 制？）</p> <p><br />QGraphicsItemAnimation直接继承自QObject，和普通的QAbstractAnimation没有关系，所以没法只用用QAnimationGroup来组装，然后串行/并行使用多个动画。</p> <p>&nbsp;</p> <h3><a name="t9"></a>图形控件和布局管理</h3> <p>QGraphicsWidget的目的是在图形对象的功能基础上提供类似QWidget的功能。（从QGraphicsObject和 QGraphicsLayoutItem继承来），从而可以使用完整的Widget控件属性，设置字体，Style，提供size  hints，以及信号槽机制等。 </p> <p>&nbsp;</p> <p>QGraphicsLayout是专门用来布局QGraphicsWidget的布局控件。你可以通过多重继承QGraphicsLayoutItem来定制QGraphicsItem使其能被QGraphicsLayout所管理 </p> <h3><a name="t10"></a>嵌入普通控件</h3> <p>你可以通过QGraphicsScene::addWidget来将一个普通QWidget嵌入到视图体系中来使用，本质是通过创建一个代理控件 （QGraphicsProxyWidget)来在QWidget和QGraphicsItem之间传递事件。需要注意的是，这只是一个特殊的实现方式， 对性能有要求的程序不宜使用这个机制。（没有太看出哪里对性能有很大影响） </p> <p>&nbsp;</p> <p>QGraphicsProxyWidget能够处理复杂的控件嵌套，甚至能自动对被嵌套控件的子Popup Window控件创建代理控件。 <br />&nbsp;</p> <p>QGraphicsView本身也是一个普通QWidget控件，所以可以被添加到Scene中，创建复杂的嵌套视图体系 </p></div><img src ="http://www.cppblog.com/zhonghua/aggbug/197752.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhonghua/" target="_blank">米米</a> 2013-02-06 10:38 <a href="http://www.cppblog.com/zhonghua/archive/2013/02/06/197752.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>子窗口 停靠 </title><link>http://www.cppblog.com/zhonghua/archive/2013/02/06/197751.html</link><dc:creator>米米</dc:creator><author>米米</author><pubDate>Wed, 06 Feb 2013 02:00:00 GMT</pubDate><guid>http://www.cppblog.com/zhonghua/archive/2013/02/06/197751.html</guid><wfw:comment>http://www.cppblog.com/zhonghua/comments/197751.html</wfw:comment><comments>http://www.cppblog.com/zhonghua/archive/2013/02/06/197751.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhonghua/comments/commentRss/197751.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhonghua/services/trackbacks/197751.html</trackback:ping><description><![CDATA[<div>&nbsp;QRect rectWorkArea = qApp-&gt;desktop()-&gt;availableGeometry();<br /> &nbsp;QPoint ptLeftTop = geometry().topRight() + QPoint(2, 0);<br /> &nbsp;QSize sizeSettingsWindow = m_pSettingsWindow-&gt;size();<br /> &nbsp;if(ptLeftTop.x() + sizeSettingsWindow.width() &gt; rectWorkArea.right())<br /> &nbsp;&nbsp;ptLeftTop.setX(rectWorkArea.right() - sizeSettingsWindow.width());<br /> &nbsp;m_pSettingsWindow-&gt;move(ptLeftTop);  </div><img src ="http://www.cppblog.com/zhonghua/aggbug/197751.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhonghua/" target="_blank">米米</a> 2013-02-06 10:00 <a href="http://www.cppblog.com/zhonghua/archive/2013/02/06/197751.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>正则表达式语法</title><link>http://www.cppblog.com/zhonghua/archive/2012/10/23/193715.html</link><dc:creator>米米</dc:creator><author>米米</author><pubDate>Tue, 23 Oct 2012 03:03:00 GMT</pubDate><guid>http://www.cppblog.com/zhonghua/archive/2012/10/23/193715.html</guid><wfw:comment>http://www.cppblog.com/zhonghua/comments/193715.html</wfw:comment><comments>http://www.cppblog.com/zhonghua/archive/2012/10/23/193715.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhonghua/comments/commentRss/193715.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhonghua/services/trackbacks/193715.html</trackback:ping><description><![CDATA[<div><p>一个正则表达式就是由普通字符（例如字符 a 到 z）以及特殊字符（称为<em>元字符</em>）组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板，将某个字符模式与所搜索的字符串进行匹配。</p><p>这里有一些可能会遇到的正则表达式示例：</p><table frame="box" rules="all" border="1" cellspacing="0" cols="3"><tbody><tr valign="top"> <th width="30%">Visual Basic Scripting Edition</th> <th width="30%">VBScript</th> <th width="40%">匹配</th> </tr><tr valign="top"> <td width="30%">/^\[ \t]*$/</td> <td width="30%">"^\[ \t]*$"</td> <td width="40%">匹配一个空白行。</td> </tr><tr valign="top"> <td width="30%">/\d{2}-\d{5}/</td> <td width="30%">"\d{2}-\d{5}"</td> <td width="40%">验证一个ID 号码是否由一个2位数字，一个连字符以及一个5位数字组成。</td> </tr><tr valign="top"> <td width="30%">/&lt;(.*)&gt;.*&lt;\/\1&gt;/</td> <td width="30%">"&lt;(.*)&gt;.*&lt;\/\1&gt;"</td> <td width="40%">匹配一个 HTML 标记。</td> </tr> </tbody></table><br /><p>下表是元字符及其在正则表达式上下文中的行为的一个完整列表：</p><table frame="box" rules="all" border="1" cellspacing="0" cols="2"><tbody><tr valign="top"> <th width="16%">字符</th> <th width="84%">描述</th> </tr><tr valign="top"> <td width="16%">\</td> <td width="84%">将下一个字符标记为一个特殊字符、或一个原义字符、或一个 后向引用、或一个八进制转义符。例如，'n' 匹配字符 "n"。'\n' 匹配一个换行符。序列 '\\' 匹配 "\" 而 "\(" 则匹配 "("。</td> </tr><tr valign="top"> <td width="16%">^</td> <td width="84%">匹配输入字符串的开始位置。如果设置了 <strong>RegExp</strong> 对象的 <strong>Multiline</strong> 属性，^ 也匹配 '\n' 或 '\r' 之后的位置。</td> </tr><tr valign="top"> <td width="16%">$</td> <td width="84%">匹配输入字符串的结束位置。如果设置了<strong>RegExp</strong> 对象的 <strong>Multiline</strong> 属性，$ 也匹配 '\n' 或 '\r' 之前的位置。</td> </tr><tr valign="top"> <td width="16%">*</td> <td width="84%">匹配前面的子表达式零次或多次。例如，zo* 能匹配 "z" 以及 "zoo"。 * 等价于{0,}。</td> </tr><tr valign="top"> <td width="16%">+</td> <td width="84%">匹配前面的子表达式一次或多次。例如，'zo+' 能匹配 "zo" 以及 "zoo"，但不能匹配 "z"。+ 等价于 {1,}。</td> </tr><tr valign="top"> <td width="16%">?</td> <td width="84%">匹配前面的子表达式零次或一次。例如，"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。</td> </tr><tr valign="top"> <td width="16%">{<em>n</em>}</td> <td width="84%"><em>n</em> 是一个非负整数。匹配确定的 <em>n</em> 次。例如，'o{2}' 不能匹配 "Bob" 中的 'o'，但是能匹配 "food" 中的两个 o。</td> </tr><tr valign="top"> <td width="16%">{<em>n</em>,}</td> <td width="84%"><em>n</em> 是一个非负整数。至少匹配<em>n</em> 次。例如，'o{2,}' 不能匹配 "Bob" 中的 'o'，但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。</td> </tr><tr valign="top"> <td width="16%">{<em>n</em>,<em>m</em>}</td> <td width="84%"><em>m</em> 和 <em>n</em> 均为非负整数，其中<em>n</em> &lt;= <em>m</em>。最少匹配 <em>n</em> 次且最多匹配 <em>m</em> 次。刘， "o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。</td> </tr><tr valign="top"> <td width="16%">?</td> <td width="84%">当该字符紧跟在任何一个其他限制符 (*, +, ?, {<em>n</em>}, {<em>n</em>,}, {<em>n</em>,<em>m</em>}) 后面时，匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串，而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如，对于字符串 "oooo"，'o+?' 将匹配单个 "o"，而 'o+' 将匹配所有 'o'。</td> </tr><tr valign="top"> <td width="16%">.</td> <td width="84%">匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符，请使用象 '[.\n]' 的模式。</td> </tr><tr valign="top"> <td width="16%">(<em>pattern</em>)</td> <td width="84%">匹配<em>pattern</em> 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到，在VBScript 中使用 <strong>SubMatches</strong> 集合，在Visual Basic Scripting Edition 中则使用 <strong>$0</strong>&#8230;<strong>$9</strong> 属性。要匹配圆括号字符，请使用 '\(' 或 '\)'。</td> </tr><tr valign="top"> <td width="16%">(?:<em>pattern</em>)</td> <td width="84%">匹配 <em>pattern</em> 但不获取匹配结果，也就是说这是一个非获取匹配，不进行存储供以后使用。这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。例如， 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。</td> </tr><tr valign="top"> <td width="16%">(?=<em>pattern</em>)</td> <td width="84%">正向预查，在任何匹配 <em>pattern</em>  的字符串开始处匹配查找字符串。这是一个非获取匹配，也就是说，该匹配不需要获取供以后使用。例如， 'Windows  (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ，但不能匹配 "Windows 3.1"  中的  "Windows"。预查不消耗字符，也就是说，在一个匹配发生后，在最后一次匹配之后立即开始下一次匹配的搜索，而不是从包含预查的字符之后开始。</td> </tr><tr valign="top"> <td width="16%">(?!<em>pattern</em>)</td> <td width="84%">负向预查，在任何不匹配Negative lookahead matches the search string at any point where a string not matching <em>pattern</em>  的字符串开始处匹配查找字符串。这是一个非获取匹配，也就是说，该匹配不需要获取供以后使用。例如'Windows  (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows"，但不能匹配 "Windows 2000"  中的 "Windows"。预查不消耗字符，也就是说，在一个匹配发生后，在最后一次匹配之后立即开始下一次匹配的搜索，而不是从包含预查的字符之后开始  </td> </tr><tr valign="top"> <td width="16%"><em>x</em>|<em>y</em></td> <td width="84%">匹配 <em>x</em> 或 <em>y</em>。例如，'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。 </td> </tr><tr valign="top"> <td width="16%">[<em>xyz</em>]</td> <td width="84%">字符集合。匹配所包含的任意一个字符。例如， '[abc]' 可以匹配 "plain" 中的 'a'。 </td> </tr><tr valign="top"> <td width="16%">[^<em>xyz</em>]</td> <td width="84%">负值字符集合。匹配未包含的任意字符。例如， '[^abc]' 可以匹配 "plain" 中的'p'。 </td> </tr><tr valign="top"> <td width="16%">[<em>a-z</em>]</td> <td width="84%">字符范围。匹配指定范围内的任意字符。例如，'[a-z]' 可以匹配 'a' 到 'z' 范围内的任意小写字母字符。 </td> </tr><tr valign="top"> <td width="16%">[^<em>a-z</em>]</td> <td width="84%">负值字符范围。匹配任何不在指定范围内的任意字符。例如，'[^a-z]' 可以匹配任何不在 'a' 到 'z' 范围内的任意字符。 </td> </tr><tr valign="top"> <td width="16%">\b</td> <td width="84%">匹配一个单词边界，也就是指单词和空格间的位置。例如， 'er\b' 可以匹配"never" 中的 'er'，但不能匹配 "verb" 中的 'er'。 </td> </tr><tr valign="top"> <td width="16%">\B</td> <td width="84%">匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er'，但不能匹配 "never" 中的 'er'。</td> </tr><tr valign="top"> <td width="16%">\c<em>x</em></td> <td width="84%">匹配由<em>x</em>指明的控制字符。例如， \cM 匹配一个 Control-M 或回车符。 <em>x</em> 的值必须为 A-Z 或 a-z 之一。否则，将 c 视为一个原义的 'c' 字符。 </td> </tr><tr valign="top"> <td width="16%">\d</td> <td width="84%">匹配一个数字字符。等价于 [0-9]。 </td> </tr><tr valign="top"> <td width="16%">\D</td> <td width="84%">匹配一个非数字字符。等价于 [^0-9]。 </td> </tr><tr valign="top"> <td width="16%">\f</td> <td width="84%">匹配一个换页符。等价于 \x0c 和 \cL。</td> </tr><tr valign="top"> <td width="16%">\n</td> <td width="84%">匹配一个换行符。等价于 \x0a 和 \cJ。</td> </tr><tr valign="top"> <td width="16%">\r</td> <td width="84%">匹配一个回车符。等价于 \x0d 和 \cM。</td> </tr><tr valign="top"> <td width="16%">\s</td> <td width="84%">匹配任何空白字符，包括空格、制表符、换页符等等。等价于 [&nbsp;\f\n\r\t\v]。</td> </tr><tr valign="top"> <td width="16%">\S</td> <td width="84%">匹配任何非空白字符。等价于 [^&nbsp;\f\n\r\t\v]。</td> </tr><tr valign="top"> <td width="16%">\t</td> <td width="84%">匹配一个制表符。等价于 \x09 和 \cI。</td> </tr><tr valign="top"> <td width="16%">\v</td> <td width="84%">匹配一个垂直制表符。等价于 \x0b 和 \cK。</td> </tr><tr valign="top"> <td width="16%">\w</td> <td width="84%">匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。 </td> </tr><tr valign="top"> <td width="16%">\W</td> <td width="84%">匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。 </td> </tr><tr valign="top"> <td width="16%">\x<em>n</em></td> <td width="84%">匹配 <em>n</em>，其中 <em>n</em> 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如， '\x41' 匹配 "A"。'\x041' 则等价于 '\x04' &amp; "1"。正则表达式中可以使用 ASCII 编码。.</td> </tr><tr valign="top"> <td width="16%">\<em>num</em></td> <td width="84%">匹配 <em>num</em>，其中 <em>num</em> 是一个正整数。对所获取的匹配的引用。例如，'(.)\1' 匹配两个连续的相同字符。 </td> </tr><tr valign="top"> <td width="16%">\<em>n</em></td> <td width="84%">标识一个八进制转义值或一个后向引用。如果 \<em>n</em> 之前至少 <em>n</em> 个获取的子表达式，则 <em>n</em> 为后向引用。否则，如果 <em>n</em> 为八进制数字 (0-7)，则 <em>n</em> 为一个八进制转义值。</td> </tr><tr valign="top"> <td width="16%">\<em>nm</em></td> <td width="84%">标识一个八进制转义值或一个后向引用。如果 \<em>nm</em> 之前至少有is preceded by at least <em>nm</em> 个获取得子表达式，则 <em>nm</em> 为后向引用。如果 \<em>nm</em> 之前至少有 <em>n</em> 个获取，则 <em>n</em> 为一个后跟文字 <em>m </em>的后向引用。如果前面的条件都不满足，若&nbsp; <em>n</em> 和 <em>m</em> 均为八进制数字 (0-7)，则 \<em>nm</em> 将匹配八进制转义值 <em>nm</em>。</td> </tr><tr valign="top"> <td width="16%">\<em>nml</em></td> <td width="84%">如果 <em>n</em> 为八进制数字 (0-3)，且 <em>m</em> 和 <em>l</em> 均为八进制数字 (0-7)，则匹配八进制转义值 <em>nml。</em></td> </tr><tr valign="top"> <td width="16%">\u<em>n</em></td> <td width="84%">匹配 <em>n</em>，其中 <em>n</em> 是一个用四个十六进制数字表示的 Unicode 字符。例如， \u00A9 匹配版权符号 (?)。</td> </tr> </tbody></table></div><img src ="http://www.cppblog.com/zhonghua/aggbug/193715.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhonghua/" target="_blank">米米</a> 2012-10-23 11:03 <a href="http://www.cppblog.com/zhonghua/archive/2012/10/23/193715.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> QT设置TableView的标题样式 </title><link>http://www.cppblog.com/zhonghua/archive/2012/09/05/189601.html</link><dc:creator>米米</dc:creator><author>米米</author><pubDate>Wed, 05 Sep 2012 13:36:00 GMT</pubDate><guid>http://www.cppblog.com/zhonghua/archive/2012/09/05/189601.html</guid><wfw:comment>http://www.cppblog.com/zhonghua/comments/189601.html</wfw:comment><comments>http://www.cppblog.com/zhonghua/archive/2012/09/05/189601.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhonghua/comments/commentRss/189601.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhonghua/services/trackbacks/189601.html</trackback:ping><description><![CDATA[<div><p><span style="font-size:18px; color:#000099">this-&gt;tableView-&gt;horizontalHeader()-&gt;setStyleSheet("QHeaderView::section {background-color:darkcyan;"<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "color: black;padding-left: 4px;border: 1px solid #6c6c6c;}");</span></p> <p><br /> <span style="font-size:18px; color:#000099">this-&gt;tableView-&gt;verticalHeader()-&gt;setStyleSheet("QHeaderView::section {background-color:darkcyan;"<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "color: black;padding-left: 4px;border: 1px solid #6c6c6c;}");</span></p> <p>&nbsp;</p> <p><span style="font-size:18px"><span style="color:#cc33cc">以下好看的样式来自于</span><a href="http://blog.csdn.net/zenwanxin/article/details/6524559"><span style="color:#cc33cc">http://blog.csdn.net/zenwanxin/article/details/6524559</span></a></span></p> <p><span style="font-size:18px; color:#000099">tableView-&gt;horizontalHeader()-&gt;setStyleSheet</span></p> <p><span style="font-size:18px; color:#000099">("QHeaderView::section {background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1,"</span></p> <p><span style="font-size:18px; color:#000099">"stop:0 #616161, stop: 0.5 yellow,stop: 0.6 green, stop:1 cyan);"<br /> "color: white;padding-left: 4px;border: 1px solid #6c6c6c;}"<br /> "QHeaderView::section:checked{background-color: red;}"<br /> "QHeaderView::down-arrow {image: url(down_arrow.png);}"<br /> "QHeaderView::up-arrow {image: url(up_arrow.png);}");</span></p></div><img src ="http://www.cppblog.com/zhonghua/aggbug/189601.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhonghua/" target="_blank">米米</a> 2012-09-05 21:36 <a href="http://www.cppblog.com/zhonghua/archive/2012/09/05/189601.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转  经典SQL语句大全 </title><link>http://www.cppblog.com/zhonghua/archive/2012/08/30/188707.html</link><dc:creator>米米</dc:creator><author>米米</author><pubDate>Thu, 30 Aug 2012 01:43:00 GMT</pubDate><guid>http://www.cppblog.com/zhonghua/archive/2012/08/30/188707.html</guid><wfw:comment>http://www.cppblog.com/zhonghua/comments/188707.html</wfw:comment><comments>http://www.cppblog.com/zhonghua/archive/2012/08/30/188707.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhonghua/comments/commentRss/188707.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhonghua/services/trackbacks/188707.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 一、基础 1、说明：创建数据库 CREATE DATABASE database-name   2、说明：删除数据库 drop database dbname 3、说明：备份sql server --- 创建 备份数据的 device USE master EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat...&nbsp;&nbsp;<a href='http://www.cppblog.com/zhonghua/archive/2012/08/30/188707.html'>阅读全文</a><img src ="http://www.cppblog.com/zhonghua/aggbug/188707.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhonghua/" target="_blank">米米</a> 2012-08-30 09:43 <a href="http://www.cppblog.com/zhonghua/archive/2012/08/30/188707.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何实现QT窗口背景图片随窗口大小而变化(备忘)</title><link>http://www.cppblog.com/zhonghua/archive/2012/08/28/188505.html</link><dc:creator>米米</dc:creator><author>米米</author><pubDate>Tue, 28 Aug 2012 02:56:00 GMT</pubDate><guid>http://www.cppblog.com/zhonghua/archive/2012/08/28/188505.html</guid><wfw:comment>http://www.cppblog.com/zhonghua/comments/188505.html</wfw:comment><comments>http://www.cppblog.com/zhonghua/archive/2012/08/28/188505.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhonghua/comments/commentRss/188505.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhonghua/services/trackbacks/188505.html</trackback:ping><description><![CDATA[<div><div>方案一：使用paintEvent</div><dl><dt>C/C++ code</dt><dd><pre><div><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> Widget::paintEvent(QPaintEvent </span><span style="color: #000000;">*</span><span style="color: #000000;">e) <br /></span></div></pre></dd><dd><pre><div><span style="color: #000000;">{     QPainter painter(</span><span style="color: #0000FF;">this</span><span style="color: #000000;">); <br /></span></div></pre></dd><dd><pre><div><span style="color: #000000;">&nbsp;painter.drawPixmap(</span><span style="color: #800080;">0</span><span style="color: #000000;">,</span><span style="color: #800080;">0</span><span style="color: #000000;">,</span><span style="color: #0000FF;">this</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">width(),</span><span style="color: #0000FF;">this</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">height(),QPixmap(</span><span style="color: #800000;">"</span><span style="color: #800000;">:/xxx.png</span><span style="color: #800000;">"</span><span style="color: #000000;">));</span></div></pre></dd><dd><pre><div><span style="color: #000000;">&nbsp;} </span></div> </pre></dd></dl><br /><br />方案二：使用setStyleSheet<br /><dl><dt>C/C++ code</dt><dd><pre><div><span style="color: #000000;"> widget</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">setStyleSheet(</span><span style="color: #800000;">"</span><span style="color: #800000;">border-image: url(:/xxx.png)</span><span style="color: #800000;">"</span><span style="color: #000000;">); </span></div> </pre></dd></dl></div><img src ="http://www.cppblog.com/zhonghua/aggbug/188505.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhonghua/" target="_blank">米米</a> 2012-08-28 10:56 <a href="http://www.cppblog.com/zhonghua/archive/2012/08/28/188505.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转 Qt QSqlTableModel 使用心得 </title><link>http://www.cppblog.com/zhonghua/archive/2012/08/20/187749.html</link><dc:creator>米米</dc:creator><author>米米</author><pubDate>Mon, 20 Aug 2012 03:24:00 GMT</pubDate><guid>http://www.cppblog.com/zhonghua/archive/2012/08/20/187749.html</guid><wfw:comment>http://www.cppblog.com/zhonghua/comments/187749.html</wfw:comment><comments>http://www.cppblog.com/zhonghua/archive/2012/08/20/187749.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhonghua/comments/commentRss/187749.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhonghua/services/trackbacks/187749.html</trackback:ping><description><![CDATA[<div><p><strong>Qt&nbsp; QSqlTableModel&nbsp; </strong><strong>使用心得</strong></p> <p><strong>连接数据库</strong></p> <p><strong>执行</strong><strong>sql查询，条件显示，排序</strong></p> <p><strong>获取记录数，列数以及记录内容，字段内容</strong></p> <p><strong>新增，修改，删除，恢复</strong></p> <p><strong>其它</strong></p> <p><strong>&nbsp;</strong></p> <p><strong>&nbsp;</strong></p> <p><strong>1---------------连接数据库（我用的access2003做实验）</strong></p> <p>在.pro文件添加</p> <p>QT&nbsp; +=SQL</p> <p>win32:CONFIG+=console</p> <p>&nbsp;</p> <p>------------------------MAIN.CPP---------------</p> <p>#include &lt;QtGui/QApplication&gt;</p> <p>#include &lt;QSqlDatabase&gt;</p> <p>#include &lt;QSqlQuery&gt;</p> <p>#include &lt;QDebug&gt;</p> <p>#include &lt;QVariant&gt;</p> <p>#include &lt;QString&gt;</p> <p>#include &lt;QSqlTableModel&gt;</p> <p>#include &lt;QTableView&gt;</p> <p>#include "mainwindow.h"</p> <p>int main(intargc, char *argv[])</p> <p>{</p> <p>&nbsp;&nbsp;&nbsp; QApplication a(argc, argv);</p> <p>&nbsp;&nbsp; // MainWindow w;</p> <p>&nbsp;&nbsp;&nbsp; //w.show();</p> <p>&nbsp;&nbsp;&nbsp; QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");</p> <p>&nbsp;&nbsp;&nbsp; db.setDatabaseName("DRIVER={Microsoft AccessDriver (*.mdb)};FIL={MS Access};DBQ=barcode.mdb;UID='';PWD=''");</p> <p>&nbsp;&nbsp;&nbsp; bool&nbsp;ok = db.open();</p> <p>&nbsp;&nbsp;&nbsp; if(ok)</p> <p>&nbsp;&nbsp;&nbsp; {</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; qDebug()&lt;&lt;"connect ok!";</p> <p>&nbsp;&nbsp;&nbsp; }</p> <p>&nbsp;&nbsp;&nbsp; else</p> <p>&nbsp;&nbsp;&nbsp; {</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; qDebug()&lt;&lt;"connect error!";</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;</p> <p>&nbsp;&nbsp;&nbsp; }</p> <p>&nbsp;&nbsp;&nbsp; return a.exec();</p> <p>}</p> <p><strong>2-----执行sql查询，条件显示，排序</strong></p> <p><strong>查询：</strong></p> <p>model = newQSqlTableModel(this);<br /> model-&gt;setTable(&#8220;student&#8221;);<br /> model-&gt;setEditStrategy(QSqlTableModel::OnManualSubmit);<br /> model-&gt;select(); //选取整个表的所有行<br /> // model-&gt;removeColumn(1); //不显示第二列,如果这时添加记录，则该属性的值添加不上</p> <p>QTableView *view= new QTableView;</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; view-&gt;setModel(model);</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; view-&gt;show();</p> <p>//View-&gt;setEditTriggers(QAbstractItemView::NoEditTriggers);&nbsp;&nbsp;使其不可编辑</p> <p><strong>条件：（等价于SQL语句的where）</strong></p> <p>model-&gt;setFilter(QObject::tr(&#8220;name= &#8216;admin&#8217;&#8221;).arg(name)); //根据姓名进行筛选<br /> &nbsp;&nbsp;&nbsp; model-&gt;select(); //显示结果</p> <p><strong>排序:(等价于ORDERBY)</strong><br /> &nbsp;&nbsp;&nbsp;model-&gt;setSort(0,Qt::AscendingOrder); //id属性，即第0列，升序排列<br /> &nbsp;&nbsp;&nbsp;model-&gt;select();</p> <p><br /> &nbsp;&nbsp;&nbsp; model-&gt;setSort(0,Qt::DescendingOrder); //id属性，即第0列，降序排<br /> &nbsp;&nbsp;&nbsp; model-&gt;select();</p> <p><strong>3------获取记录数，列数以及记录内容，字段内容</strong></p> <p><strong>记录数： Model-&gt;rowcount</strong></p> <p><strong>记录值：</strong></p> <p><strong>值=model.record(num).value(1).toString();</strong>&nbsp;</p> <p><strong>Qrecord record= QSqlRecord record = tablemodel.record(记录行数);&nbsp;</strong></p> <p><strong>值=Record.value(&#8220;字段名或索引&#8221;)</strong></p> <p><strong>字段数：</strong></p> <p><strong>字段值：</strong></p> <p><strong>&nbsp;</strong></p> <p><strong>4------新增，修改，删除,提交，撤销</strong></p> <p><strong>新增：</strong></p> <p>&nbsp;&nbsp;&nbsp; int rowNum = model-&gt;rowCount();//获得表的行数<br /> &nbsp;&nbsp; int id = 10;<br /> &nbsp;&nbsp;&nbsp; model-&gt;insertRow(rowNum); //添加一行<br /> &nbsp;&nbsp;&nbsp; model-&gt;setData(model-&gt;index(rowNum,0),id);<br /> &nbsp;&nbsp;&nbsp; //model-&gt;submitAll(); //可以直接提交</p> <p>或者用record添加</p> <p>QSqlRecord record = tablemodel.record(); </p> <p>record.setValue("nam","new"); </p> <p>model.insertRecord(1,record);</p> <p><strong>&nbsp;</strong></p> <p><strong>修改：</strong></p> <p>首先用条件找到某一条记录</p> <p>QSqlRecord record = tablemodel.record(num); </p> <p>record.setValue("name",record.value("name").toString()+"2"); </p> <p>tablemodel.setRecord(num,record); </p> <p>if(tablemodel.submitAll()) </p> <p>"成功！"</p> <p>else</p> <p>"失败！"</p> <p>或者用下面方法<strong>用setData()来修改，代码如下：&nbsp;<br /> model.setData(model.index(1,1),"new");</strong>&nbsp;<br /> if(tablemodel.submitAll())&nbsp;<br /> &nbsp;&nbsp;&nbsp;"成功！"<br /> else&nbsp;<br /> &nbsp;&nbsp;&nbsp;"失败！"</p> <p><br /> </p> <p><strong>删除：</strong><br /> &nbsp;&nbsp;&nbsp; int curRow = ui-&gt;tableView-&gt;currentIndex().row();<br /> &nbsp;&nbsp;&nbsp; //获取选中的行<br /> &nbsp;&nbsp;&nbsp; model-&gt;removeRow(curRow);<br /> &nbsp;&nbsp;&nbsp; //删除该行<br /> &nbsp;&nbsp;&nbsp; int ok = QMessageBox::warning(this,tr(&#8220;删除当前行!&#8221;),tr(&#8220;你确定&#8221;<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8220;删除当前行吗？&#8221;),<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;QMessageBox::Yes,QMessageBox::No);<br /> &nbsp;&nbsp;&nbsp; if(ok == QMessageBox::No)<br /> &nbsp;&nbsp;&nbsp; {<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; model-&gt;revertAll();//如果不删除，则撤销<br /> &nbsp;&nbsp;&nbsp; }<br /> &nbsp;&nbsp;&nbsp; else model-&gt;submitAll(); //否则提交，在数据库中删除该行</p> <p>如果没有table</p> <p><strong>tablemodel.removeRows(起始行, 要删除的总行数);</strong>&nbsp;<br /> model.submitAll();&nbsp;</p> <p><br /> </p> <p><strong>提交&nbsp;&nbsp;</strong></p> <p>&nbsp;&nbsp;&nbsp; model-&gt;database().transaction();//开始事务操作<br /> &nbsp;&nbsp;&nbsp; if (model-&gt;submitAll()) {<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; model-&gt;database().commit();//提交<br /> &nbsp;&nbsp;&nbsp; } else {<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; model-&gt;database().rollback();//回滚<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QMessageBox::warning(this,tr(&#8220;tableModel&#8221;),<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;tr(&#8220;数据库错误: %1&#8243;)<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;.arg(model-&gt;lastError().text()));<br /> &nbsp;&nbsp;&nbsp; }</p> <p>撤销&nbsp;&nbsp; </p> <p>&nbsp;&nbsp;model-&gt;revertAll();<br /> <br /> </p> <p><strong>5------其它</strong></p> <p>&nbsp;</p> <br /> <p><strong><br /> </strong></p> <p><strong></strong></p> <p style="margin-top:0px; margin-bottom:0px; padding-top:5px; padding-right:5px; padding-bottom:5px; padding-left:5px; line-height:20px; color:#363534; font-family:Verdana; font-size:13px; background-color:#e6e7e8"> he QSqlTableModel class provides an editable data model for a single database table.&nbsp;<a href="http://doc.qt.nokia.com/stable/qsqltablemodel.html#details" style="color:#00732f; text-decoration:none">More...</a></p> <div bg_cpp"=""><div><div><strong>[cpp]</strong> <a href="http://blog.csdn.net/liang890319/article/details/7043361#" title="view plain">view plain</a><a href="http://blog.csdn.net/liang890319/article/details/7043361#" title="copy">copy</a><a href="http://blog.csdn.net/liang890319/article/details/7043361#" title="print">print</a><a href="http://blog.csdn.net/liang890319/article/details/7043361#" title="?">?</a></div></div><ol start="1"><li><span>&lt;span&nbsp;class="preprocessor"&nbsp;style="color:#404040"&gt;#include&nbsp;&lt;QSqlTableModel&gt;&lt;/span&gt;&nbsp;&nbsp;</span></li></ol></div> <p style="margin-top:0px; margin-bottom:0px; padding-top:5px; padding-right:5px; padding-bottom:5px; padding-left:5px; line-height:20px; color:#363534; font-family:Verdana; font-size:13px; background-color:#e6e7e8"> <strong>Inherits:&nbsp;</strong><a href="http://doc.qt.nokia.com/stable/qsqlquerymodel.html" style="color:#00732f; text-decoration:none">QSqlQueryModel</a>.</p> <p style="margin-top:0px; margin-bottom:0px; padding-top:5px; padding-right:5px; padding-bottom:5px; padding-left:5px; line-height:20px; color:#363534; font-family:Verdana; font-size:13px; background-color:#e6e7e8"> <strong>Inherited by:&nbsp;</strong><a href="http://doc.qt.nokia.com/stable/qsqlrelationaltablemodel.html" style="color:#00732f; text-decoration:none">QSqlRelationalTableModel</a>.</p> <ul style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:10px; padding-right:0px; padding-bottom:0px; padding-left:25px; color:#363534; font-family:Verdana; font-size:13px; line-height:15px; background-color:#e6e7e8"><li style="margin-top:0px; margin-right:0px; margin-bottom:10px; margin-left:0px; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:12px; list-style-type:none; list-style-position:initial; background-color:initial; font:normal normal 400 10pt/1.2 Verdana"> <a href="http://doc.qt.nokia.com/stable/qsqltablemodel-members.html" style="color:#00732f; text-decoration:none">List of all members, including inherited members</a></li></ul> <a name="public-types" style="color:rgb(0,115,47); text-decoration:none; font-family:Verdana; font-size:13px; line-height:15px; background-color:rgb(230,231,232)"></a> <h2> Public Types</h2> <table "=""> <tbody> <tr> <td rightalign=""  topalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:5px; padding-bottom:3px; padding-left:10px; text-align:right; vertical-align:top"> enum</td> <td bottomalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:15px; padding-bottom:3px; padding-left:0px"> <strong><a href="http://doc.qt.nokia.com/stable/qsqltablemodel.html#EditStrategy-enum" style="color:#00732f; text-decoration:none">EditStrategy</a></strong>&nbsp;{ OnFieldChange, OnRowChange, OnManualSubmit }</td> </tr> </tbody> </table> <a name="public-functions" style="color:rgb(0,115,47); text-decoration:none; font-family:Verdana; font-size:13px; line-height:15px; background-color:rgb(230,231,232)"></a> <h2> Public Functions</h2> <table "=""> <tbody> <tr> <td rightalign=""  topalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:5px; padding-bottom:3px; padding-left:10px; text-align:right; vertical-align:top"> &nbsp;</td> <td bottomalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:15px; padding-bottom:3px; padding-left:0px"> <strong><a href="http://doc.qt.nokia.com/stable/qsqltablemodel.html#QSqlTableModel" style="color:#00732f; text-decoration:none">QSqlTableModel</a></strong>&nbsp;( QObject *&nbsp;<em>parent</em>&nbsp;= 0, QSqlDatabase&nbsp;<em>db</em>&nbsp;= QSqlDatabase() )</td> </tr> <tr> <td rightalign=""  topalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:5px; padding-bottom:3px; padding-left:10px; text-align:right; vertical-align:top"> virtual</td> <td bottomalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:15px; padding-bottom:3px; padding-left:0px"> <strong><a href="http://doc.qt.nokia.com/stable/qsqltablemodel.html#dtor.QSqlTableModel" style="color:#00732f; text-decoration:none">~QSqlTableModel</a></strong>&nbsp;()</td> </tr> <tr> <td rightalign=""  topalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:5px; padding-bottom:3px; padding-left:10px; text-align:right; vertical-align:top"> QSqlDatabase</td> <td bottomalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:15px; padding-bottom:3px; padding-left:0px"> <strong><a href="http://doc.qt.nokia.com/stable/qsqltablemodel.html#database" style="color:#00732f; text-decoration:none">database</a></strong>&nbsp;() const</td> </tr> <tr> <td rightalign=""  topalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:5px; padding-bottom:3px; padding-left:10px; text-align:right; vertical-align:top"> EditStrategy</td> <td bottomalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:15px; padding-bottom:3px; padding-left:0px"> <strong><a href="http://doc.qt.nokia.com/stable/qsqltablemodel.html#editStrategy" style="color:#00732f; text-decoration:none">editStrategy</a></strong>&nbsp;() const</td> </tr> <tr> <td rightalign=""  topalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:5px; padding-bottom:3px; padding-left:10px; text-align:right; vertical-align:top"> int</td> <td bottomalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:15px; padding-bottom:3px; padding-left:0px"> <strong><a href="http://doc.qt.nokia.com/stable/qsqltablemodel.html#fieldIndex" style="color:#00732f; text-decoration:none">fieldIndex</a></strong>&nbsp;( const QString &amp;&nbsp;<em>fieldName</em>&nbsp;) const</td> </tr> <tr> <td rightalign=""  topalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:5px; padding-bottom:3px; padding-left:10px; text-align:right; vertical-align:top"> QString</td> <td bottomalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:15px; padding-bottom:3px; padding-left:0px"> <strong><a href="http://doc.qt.nokia.com/stable/qsqltablemodel.html#filter" style="color:#00732f; text-decoration:none">filter</a></strong>&nbsp;() const</td> </tr> <tr> <td rightalign=""  topalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:5px; padding-bottom:3px; padding-left:10px; text-align:right; vertical-align:top"> bool</td> <td bottomalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:15px; padding-bottom:3px; padding-left:0px"> <strong><a href="http://doc.qt.nokia.com/stable/qsqltablemodel.html#insertRecord" style="color:#00732f; text-decoration:none">insertRecord</a></strong>&nbsp;( int&nbsp;<em>row</em>, const QSqlRecord &amp;&nbsp;<em>record</em>&nbsp;)</td> </tr> <tr> <td rightalign=""  topalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:5px; padding-bottom:3px; padding-left:10px; text-align:right; vertical-align:top"> bool</td> <td bottomalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:15px; padding-bottom:3px; padding-left:0px"> <strong><a href="http://doc.qt.nokia.com/stable/qsqltablemodel.html#isDirty" style="color:#00732f; text-decoration:none">isDirty</a></strong>&nbsp;( const QModelIndex &amp;&nbsp;<em>index</em>&nbsp;) const</td> </tr> <tr> <td rightalign=""  topalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:5px; padding-bottom:3px; padding-left:10px; text-align:right; vertical-align:top"> QSqlIndex</td> <td bottomalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:15px; padding-bottom:3px; padding-left:0px"> <strong><a href="http://doc.qt.nokia.com/stable/qsqltablemodel.html#primaryKey" style="color:#00732f; text-decoration:none">primaryKey</a></strong>&nbsp;() const</td> </tr> <tr> <td rightalign=""  topalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:5px; padding-bottom:3px; padding-left:10px; text-align:right; vertical-align:top"> virtual void</td> <td bottomalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:15px; padding-bottom:3px; padding-left:0px"> <strong><a href="http://doc.qt.nokia.com/stable/qsqltablemodel.html#revertRow" style="color:#00732f; text-decoration:none">revertRow</a></strong>&nbsp;( int&nbsp;<em>row</em>&nbsp;)</td> </tr> <tr> <td rightalign=""  topalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:5px; padding-bottom:3px; padding-left:10px; text-align:right; vertical-align:top"> virtual bool</td> <td bottomalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:15px; padding-bottom:3px; padding-left:0px"> <strong><a href="http://doc.qt.nokia.com/stable/qsqltablemodel.html#select" style="color:#00732f; text-decoration:none">select</a></strong>&nbsp;()</td> </tr> <tr> <td rightalign=""  topalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:5px; padding-bottom:3px; padding-left:10px; text-align:right; vertical-align:top"> virtual void</td> <td bottomalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:15px; padding-bottom:3px; padding-left:0px"> <strong><a href="http://doc.qt.nokia.com/stable/qsqltablemodel.html#setEditStrategy" style="color:#00732f; text-decoration:none">setEditStrategy</a></strong>&nbsp;( EditStrategy&nbsp;<em>strategy</em>&nbsp;)</td> </tr> <tr> <td rightalign=""  topalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:5px; padding-bottom:3px; padding-left:10px; text-align:right; vertical-align:top"> virtual void</td> <td bottomalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:15px; padding-bottom:3px; padding-left:0px"> <strong><a href="http://doc.qt.nokia.com/stable/qsqltablemodel.html#setFilter" style="color:#00732f; text-decoration:none">setFilter</a></strong>&nbsp;( const QString &amp;&nbsp;<em>filter</em>&nbsp;)</td> </tr> <tr> <td rightalign=""  topalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:5px; padding-bottom:3px; padding-left:10px; text-align:right; vertical-align:top"> bool</td> <td bottomalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:15px; padding-bottom:3px; padding-left:0px"> <strong><a href="http://doc.qt.nokia.com/stable/qsqltablemodel.html#setRecord" style="color:#00732f; text-decoration:none">setRecord</a></strong>&nbsp;( int&nbsp;<em>row</em>, const QSqlRecord &amp;&nbsp;<em>record</em>&nbsp;)</td> </tr> <tr> <td rightalign=""  topalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:5px; padding-bottom:3px; padding-left:10px; text-align:right; vertical-align:top"> virtual void</td> <td bottomalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:15px; padding-bottom:3px; padding-left:0px"> <strong><a href="http://doc.qt.nokia.com/stable/qsqltablemodel.html#setSort" style="color:#00732f; text-decoration:none">setSort</a></strong>&nbsp;( int&nbsp;<em>column</em>, Qt::SortOrder&nbsp;<em>order</em>&nbsp;)</td> </tr> <tr> <td rightalign=""  topalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:5px; padding-bottom:3px; padding-left:10px; text-align:right; vertical-align:top"> virtual void</td> <td bottomalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:15px; padding-bottom:3px; padding-left:0px"> <strong><a href="http://doc.qt.nokia.com/stable/qsqltablemodel.html#setTable" style="color:#00732f; text-decoration:none">setTable</a></strong>&nbsp;( const QString &amp;&nbsp;<em>tableName</em>&nbsp;)</td> </tr> <tr> <td rightalign=""  topalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:5px; padding-bottom:3px; padding-left:10px; text-align:right; vertical-align:top"> QString</td> <td bottomalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:15px; padding-bottom:3px; padding-left:0px"> <strong><a href="http://doc.qt.nokia.com/stable/qsqltablemodel.html#tableName" style="color:#00732f; text-decoration:none">tableName</a></strong>&nbsp;() const</td> </tr> </tbody> </table> <a name="reimplemented-public-functions" style="color:rgb(0,115,47); text-decoration:none; font-family:Verdana; font-size:13px; line-height:15px; background-color:rgb(230,231,232)"></a> <h2> Reimplemented Public Functions</h2> <table "=""> <tbody> <tr> <td rightalign=""  topalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:5px; padding-bottom:3px; padding-left:10px; text-align:right; vertical-align:top"> virtual void</td> <td bottomalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:15px; padding-bottom:3px; padding-left:0px"> <strong><a href="http://doc.qt.nokia.com/stable/qsqltablemodel.html#clear" style="color:#00732f; text-decoration:none">clear</a></strong>&nbsp;()</td> </tr> <tr> <td rightalign=""  topalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:5px; padding-bottom:3px; padding-left:10px; text-align:right; vertical-align:top"> virtual QVariant</td> <td bottomalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:15px; padding-bottom:3px; padding-left:0px"> <strong><a href="http://doc.qt.nokia.com/stable/qsqltablemodel.html#data" style="color:#00732f; text-decoration:none">data</a></strong>&nbsp;( const QModelIndex &amp;&nbsp;<em>index</em>, int&nbsp;<em>role</em>&nbsp;= Qt::DisplayRole ) const</td> </tr> <tr> <td rightalign=""  topalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:5px; padding-bottom:3px; padding-left:10px; text-align:right; vertical-align:top"> virtual Qt::ItemFlags</td> <td bottomalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:15px; padding-bottom:3px; padding-left:0px"> <strong><a href="http://doc.qt.nokia.com/stable/qsqltablemodel.html#flags" style="color:#00732f; text-decoration:none">flags</a></strong>&nbsp;( const QModelIndex &amp;&nbsp;<em>index</em>&nbsp;) const</td> </tr> <tr> <td rightalign=""  topalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:5px; padding-bottom:3px; padding-left:10px; text-align:right; vertical-align:top"> virtual QVariant</td> <td bottomalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:15px; padding-bottom:3px; padding-left:0px"> <strong><a href="http://doc.qt.nokia.com/stable/qsqltablemodel.html#headerData" style="color:#00732f; text-decoration:none">headerData</a></strong>&nbsp;( int&nbsp;<em>section</em>, Qt::Orientation&nbsp;<em>orientation</em>, int&nbsp;<em>role</em>&nbsp;= Qt::DisplayRole ) const</td> </tr> <tr> <td rightalign=""  topalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:5px; padding-bottom:3px; padding-left:10px; text-align:right; vertical-align:top"> virtual bool</td> <td bottomalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:15px; padding-bottom:3px; padding-left:0px"> <strong><a href="http://doc.qt.nokia.com/stable/qsqltablemodel.html#insertRows" style="color:#00732f; text-decoration:none">insertRows</a></strong>&nbsp;( int&nbsp;<em>row</em>, int&nbsp;<em>count</em>, const QModelIndex &amp;&nbsp;<em>parent</em>&nbsp;= QModelIndex() )</td> </tr> <tr> <td rightalign=""  topalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:5px; padding-bottom:3px; padding-left:10px; text-align:right; vertical-align:top"> virtual bool</td> <td bottomalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:15px; padding-bottom:3px; padding-left:0px"> <strong><a href="http://doc.qt.nokia.com/stable/qsqltablemodel.html#removeColumns" style="color:#00732f; text-decoration:none">removeColumns</a></strong>&nbsp;( int&nbsp;<em>column</em>, int&nbsp;<em>count</em>, const QModelIndex &amp;&nbsp;<em>parent</em>&nbsp;= QModelIndex() )</td> </tr> <tr> <td rightalign=""  topalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:5px; padding-bottom:3px; padding-left:10px; text-align:right; vertical-align:top"> virtual bool</td> <td bottomalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:15px; padding-bottom:3px; padding-left:0px"> <strong><a href="http://doc.qt.nokia.com/stable/qsqltablemodel.html#removeRows" style="color:#00732f; text-decoration:none">removeRows</a></strong>&nbsp;( int&nbsp;<em>row</em>, int&nbsp;<em>count</em>, const QModelIndex &amp;&nbsp;<em>parent</em>&nbsp;= QModelIndex() )</td> </tr> <tr> <td rightalign=""  topalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:5px; padding-bottom:3px; padding-left:10px; text-align:right; vertical-align:top"> virtual int</td> <td bottomalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:15px; padding-bottom:3px; padding-left:0px"> <strong><a href="http://doc.qt.nokia.com/stable/qsqltablemodel.html#rowCount" style="color:#00732f; text-decoration:none">rowCount</a></strong>&nbsp;( const QModelIndex &amp;&nbsp;<em>parent</em>&nbsp;= QModelIndex() ) const</td> </tr> <tr> <td rightalign=""  topalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:5px; padding-bottom:3px; padding-left:10px; text-align:right; vertical-align:top"> virtual bool</td> <td bottomalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:15px; padding-bottom:3px; padding-left:0px"> <strong><a href="http://doc.qt.nokia.com/stable/qsqltablemodel.html#setData" style="color:#00732f; text-decoration:none">setData</a></strong>&nbsp;( const QModelIndex &amp;&nbsp;<em>index</em>, const QVariant &amp;&nbsp;<em>value</em>, int&nbsp;<em>role</em>&nbsp;= Qt::EditRole )</td> </tr> <tr> <td rightalign=""  topalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:5px; padding-bottom:3px; padding-left:10px; text-align:right; vertical-align:top"> virtual void</td> <td bottomalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:15px; padding-bottom:3px; padding-left:0px"> <strong><a href="http://doc.qt.nokia.com/stable/qsqltablemodel.html#sort" style="color:#00732f; text-decoration:none">sort</a></strong>&nbsp;( int&nbsp;<em>column</em>, Qt::SortOrder&nbsp;<em>order</em>&nbsp;)</td> </tr> </tbody> </table> <ul style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:10px; padding-right:0px; padding-bottom:0px; padding-left:25px; color:#363534; font-family:Verdana; font-size:13px; line-height:15px; background-color:#e6e7e8"><li style="margin-top:0px; margin-right:0px; margin-bottom:10px; margin-left:0px; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:12px; list-style-type:none; list-style-position:initial; background-color:initial; font:normal normal 400 10pt/1.2 Verdana"> 16 public functions inherited from&nbsp;<a href="http://doc.qt.nokia.com/stable/qsqlquerymodel.html#public-functions" style="color:#00732f; text-decoration:none">QSqlQueryModel</a></li><li style="margin-top:0px; margin-right:0px; margin-bottom:10px; margin-left:0px; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:12px; list-style-type:none; list-style-position:initial; background-color:initial; font:normal normal 400 10pt/1.2 Verdana"> 2 public functions inherited from&nbsp;<a href="http://doc.qt.nokia.com/stable/qabstracttablemodel.html#public-functions" style="color:#00732f; text-decoration:none">QAbstractTableModel</a></li><li style="margin-top:0px; margin-right:0px; margin-bottom:10px; margin-left:0px; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:12px; list-style-type:none; list-style-position:initial; background-color:initial; font:normal normal 400 10pt/1.2 Verdana"> 35 public functions inherited from&nbsp;<a href="http://doc.qt.nokia.com/stable/qabstractitemmodel.html#public-functions" style="color:#00732f; text-decoration:none">QAbstractItemModel</a></li><li style="margin-top:0px; margin-right:0px; margin-bottom:10px; margin-left:0px; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:12px; list-style-type:none; list-style-position:initial; background-color:initial; font:normal normal 400 10pt/1.2 Verdana"> 29 public functions inherited from&nbsp;<a href="http://doc.qt.nokia.com/stable/qobject.html#public-functions" style="color:#00732f; text-decoration:none">QObject</a></li></ul> <a name="public-slots" style="color:rgb(0,115,47); text-decoration:none; font-family:Verdana; font-size:13px; line-height:15px; background-color:rgb(230,231,232)"></a> <h2> Public Slots</h2> <table "=""> <tbody> <tr> <td rightalign=""  topalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:5px; padding-bottom:3px; padding-left:10px; text-align:right; vertical-align:top"> virtual void</td> <td bottomalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:15px; padding-bottom:3px; padding-left:0px"> <strong><a href="http://doc.qt.nokia.com/stable/qsqltablemodel.html#revert" style="color:#00732f; text-decoration:none">revert</a></strong>&nbsp;()</td> </tr> <tr> <td rightalign=""  topalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:5px; padding-bottom:3px; padding-left:10px; text-align:right; vertical-align:top"> void</td> <td bottomalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:15px; padding-bottom:3px; padding-left:0px"> <strong><a href="http://doc.qt.nokia.com/stable/qsqltablemodel.html#revertAll" style="color:#00732f; text-decoration:none">revertAll</a></strong>&nbsp;()</td> </tr> <tr> <td rightalign=""  topalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:5px; padding-bottom:3px; padding-left:10px; text-align:right; vertical-align:top"> virtual bool</td> <td bottomalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:15px; padding-bottom:3px; padding-left:0px"> <strong><a href="http://doc.qt.nokia.com/stable/qsqltablemodel.html#submit" style="color:#00732f; text-decoration:none">submit</a></strong>&nbsp;()</td> </tr> <tr> <td rightalign=""  topalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:5px; padding-bottom:3px; padding-left:10px; text-align:right; vertical-align:top"> bool</td> <td bottomalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:15px; padding-bottom:3px; padding-left:0px"> <strong><a href="http://doc.qt.nokia.com/stable/qsqltablemodel.html#submitAll" style="color:#00732f; text-decoration:none">submitAll</a></strong>&nbsp;()</td> </tr> </tbody> </table> <ul style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:10px; padding-right:0px; padding-bottom:0px; padding-left:25px; color:#363534; font-family:Verdana; font-size:13px; line-height:15px; background-color:#e6e7e8"><li style="margin-top:0px; margin-right:0px; margin-bottom:10px; margin-left:0px; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:12px; list-style-type:none; list-style-position:initial; background-color:initial; font:normal normal 400 10pt/1.2 Verdana"> 2 public slots inherited from&nbsp;<a href="http://doc.qt.nokia.com/stable/qabstractitemmodel.html#public-slots" style="color:#00732f; text-decoration:none">QAbstractItemModel</a></li><li style="margin-top:0px; margin-right:0px; margin-bottom:10px; margin-left:0px; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:12px; list-style-type:none; list-style-position:initial; background-color:initial; font:normal normal 400 10pt/1.2 Verdana"> 1 public slot inherited from&nbsp;<a href="http://doc.qt.nokia.com/stable/qobject.html#public-slots" style="color:#00732f; text-decoration:none">QObject</a></li></ul> <a name="signals" style="color:rgb(0,115,47); text-decoration:none; font-family:Verdana; font-size:13px; line-height:15px; background-color:rgb(230,231,232)"></a> <h2> Signals</h2> <table "=""> <tbody> <tr> <td rightalign=""  topalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:5px; padding-bottom:3px; padding-left:10px; text-align:right; vertical-align:top"> void</td> <td bottomalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:15px; padding-bottom:3px; padding-left:0px"> <strong><a href="http://doc.qt.nokia.com/stable/qsqltablemodel.html#beforeDelete" style="color:#00732f; text-decoration:none">beforeDelete</a></strong>&nbsp;( int&nbsp;<em>row</em>&nbsp;)</td> </tr> <tr> <td rightalign=""  topalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:5px; padding-bottom:3px; padding-left:10px; text-align:right; vertical-align:top"> void</td> <td bottomalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:15px; padding-bottom:3px; padding-left:0px"> <strong><a href="http://doc.qt.nokia.com/stable/qsqltablemodel.html#beforeInsert" style="color:#00732f; text-decoration:none">beforeInsert</a></strong>&nbsp;( QSqlRecord &amp;&nbsp;<em>record</em>&nbsp;)</td> </tr> <tr> <td rightalign=""  topalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:5px; padding-bottom:3px; padding-left:10px; text-align:right; vertical-align:top"> void</td> <td bottomalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:15px; padding-bottom:3px; padding-left:0px"> <strong><a href="http://doc.qt.nokia.com/stable/qsqltablemodel.html#beforeUpdate" style="color:#00732f; text-decoration:none">beforeUpdate</a></strong>&nbsp;( int&nbsp;<em>row</em>, QSqlRecord &amp;&nbsp;<em>record</em>&nbsp;)</td> </tr> <tr> <td rightalign=""  topalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:5px; padding-bottom:3px; padding-left:10px; text-align:right; vertical-align:top"> void</td> <td bottomalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:15px; padding-bottom:3px; padding-left:0px"> <strong><a href="http://doc.qt.nokia.com/stable/qsqltablemodel.html#primeInsert" style="color:#00732f; text-decoration:none">primeInsert</a></strong>&nbsp;( int&nbsp;<em>row</em>, QSqlRecord &amp;&nbsp;<em>record</em>&nbsp;)</td> </tr> </tbody> </table> <ul style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:10px; padding-right:0px; padding-bottom:0px; padding-left:25px; color:#363534; font-family:Verdana; font-size:13px; line-height:15px; background-color:#e6e7e8"><li style="margin-top:0px; margin-right:0px; margin-bottom:10px; margin-left:0px; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:12px; list-style-type:none; list-style-position:initial; background-color:initial; font:normal normal 400 10pt/1.2 Verdana"> 18 signals inherited from&nbsp;<a href="http://doc.qt.nokia.com/stable/qabstractitemmodel.html#signals" style="color:#00732f; text-decoration:none">QAbstractItemModel</a></li><li style="margin-top:0px; margin-right:0px; margin-bottom:10px; margin-left:0px; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:12px; list-style-type:none; list-style-position:initial; background-color:initial; font:normal normal 400 10pt/1.2 Verdana"> 1 signal inherited from&nbsp;<a href="http://doc.qt.nokia.com/stable/qobject.html#signals" style="color:#00732f; text-decoration:none">QObject</a></li></ul> <a name="protected-functions" style="color:rgb(0,115,47); text-decoration:none; font-family:Verdana; font-size:13px; line-height:15px; background-color:rgb(230,231,232)"></a> <h2> Protected Functions</h2>   <table "=""><tbody><tr> <td rightalign=""  topalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:5px; padding-bottom:3px; padding-left:10px; text-align:right; vertical-align:top"> virtual bool</td> <td bottomalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:15px; padding-bottom:3px; padding-left:0px"> <strong><a href="http://doc.qt.nokia.com/stable/qsqltablemodel.html#deleteRowFromTable" style="color:#00732f; text-decoration:none">deleteRowFromTable</a></strong>&nbsp;( int&nbsp;<em>row</em>&nbsp;)</td> </tr> <tr> <td rightalign=""  topalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:5px; padding-bottom:3px; padding-left:10px; text-align:right; vertical-align:top"> QModelIndex</td> <td bottomalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:15px; padding-bottom:3px; padding-left:0px"> <strong><a href="http://doc.qt.nokia.com/stable/qsqltablemodel.html#indexInQuery" style="color:#00732f; text-decoration:none">indexInQuery</a></strong>&nbsp;( const QModelIndex &amp;&nbsp;<em>item</em>&nbsp;) const</td> </tr> <tr> <td rightalign=""  topalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:5px; padding-bottom:3px; padding-left:10px; text-align:right; vertical-align:top"> virtual bool</td> <td bottomalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:15px; padding-bottom:3px; padding-left:0px"> <strong><a href="http://doc.qt.nokia.com/stable/qsqltablemodel.html#insertRowIntoTable" style="color:#00732f; text-decoration:none">insertRowIntoTable</a></strong>&nbsp;( const QSqlRecord &amp;&nbsp;<em>values</em>&nbsp;)</td> </tr> <tr> <td rightalign=""  topalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:5px; padding-bottom:3px; padding-left:10px; text-align:right; vertical-align:top"> virtual QString</td> <td bottomalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:15px; padding-bottom:3px; padding-left:0px"> <strong><a href="http://doc.qt.nokia.com/stable/qsqltablemodel.html#orderByClause" style="color:#00732f; text-decoration:none">orderByClause</a></strong>&nbsp;() const</td> </tr> <tr> <td rightalign=""  topalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:5px; padding-bottom:3px; padding-left:10px; text-align:right; vertical-align:top"> virtual QString</td> <td bottomalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:15px; padding-bottom:3px; padding-left:0px"> <strong><a href="http://doc.qt.nokia.com/stable/qsqltablemodel.html#selectStatement" style="color:#00732f; text-decoration:none">selectStatement</a></strong>&nbsp;() const</td> </tr> <tr> <td rightalign=""  topalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:5px; padding-bottom:3px; padding-left:10px; text-align:right; vertical-align:top"> void</td> <td bottomalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:15px; padding-bottom:3px; padding-left:0px"> <strong><a href="http://doc.qt.nokia.com/stable/qsqltablemodel.html#setPrimaryKey" style="color:#00732f; text-decoration:none">setPrimaryKey</a></strong>&nbsp;( const QSqlIndex &amp;&nbsp;<em>key</em>&nbsp;)</td> </tr> <tr> <td rightalign=""  topalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:5px; padding-bottom:3px; padding-left:10px; text-align:right; vertical-align:top"> void</td> <td bottomalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:15px; padding-bottom:3px; padding-left:0px"> <strong><a href="http://doc.qt.nokia.com/stable/qsqltablemodel.html#setQuery" style="color:#00732f; text-decoration:none">setQuery</a></strong>&nbsp;( const QSqlQuery &amp;&nbsp;<em>query</em>&nbsp;)</td> </tr> <tr> <td rightalign=""  topalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:5px; padding-bottom:3px; padding-left:10px; text-align:right; vertical-align:top"> virtual bool</td> <td bottomalign"="" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:3px; padding-right:15px; padding-bottom:3px; padding-left:0px"> <strong><a href="http://doc.qt.nokia.com/stable/qsqltablemodel.html#updateRowInTable" style="color:#00732f; text-decoration:none">updateRowInTable</a></strong>&nbsp;( int&nbsp;<em>row</em>, const QSqlRecord &amp;&nbsp;<em>values</em>&nbsp;)</td></tr></tbody></table></div><img src ="http://www.cppblog.com/zhonghua/aggbug/187749.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhonghua/" target="_blank">米米</a> 2012-08-20 11:24 <a href="http://www.cppblog.com/zhonghua/archive/2012/08/20/187749.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转 Template+=fakelib 小记 </title><link>http://www.cppblog.com/zhonghua/archive/2012/08/17/187480.html</link><dc:creator>米米</dc:creator><author>米米</author><pubDate>Fri, 17 Aug 2012 06:01:00 GMT</pubDate><guid>http://www.cppblog.com/zhonghua/archive/2012/08/17/187480.html</guid><wfw:comment>http://www.cppblog.com/zhonghua/comments/187480.html</wfw:comment><comments>http://www.cppblog.com/zhonghua/archive/2012/08/17/187480.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhonghua/comments/commentRss/187480.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhonghua/services/trackbacks/187480.html</trackback:ping><description><![CDATA[<div>可能大家或多或少都在qmake的.pro/.pri文件中见过这种代码<br /><br />TEMPLATE += fakelib<br />MY_NAME = $$qtLibraryTarget(dbzhang800)<br />TEMPLATE -= fakelib<br /><br />如果真的没见过，或许可以从这儿入手分析与学习Qt Solution对qmake的使用<br />$$qtLibraryTarget 有什么用<br /><br />我们知道，在Window下，动态库的 Debug 和 Release 版不能通用，所以要放置在不同的路径下或者取不同的名字。在Qt下，我们经常见到<br /><br />&nbsp;&nbsp;&nbsp; QtCore4.dll<br /><br />&nbsp;&nbsp;&nbsp; QtCored4.dll<br /><br />而当我们自己的工程中需要动态库时，要想在兼顾各个平台下，给它取个合适的名字还是有点小小的挑战的。<br /><br />既然Qt已经能处理自己的动态库，我们不妨直接借用它提供的机制，这便是<br /><br />$$qtLibraryTarget<br /><br />&nbsp;&nbsp;&nbsp; 作用：为各个平台下的库生成合适的名字<br />&nbsp;&nbsp;&nbsp; 位置：$QTDIR/mkspecs/features/qt_functions.prf<br />&nbsp;&nbsp;&nbsp; 具体代码：<br /><br />defineReplace(qtLibraryTarget) {<br />&nbsp;&nbsp; unset(LIBRARY_NAME)<br />&nbsp;&nbsp; LIBRARY_NAME = $$1<br />&nbsp;&nbsp; mac:!static:contains(QT_CONFIG, qt_framework) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QMAKE_FRAMEWORK_BUNDLE_NAME = $$LIBRARY_NAME<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; export(QMAKE_FRAMEWORK_BUNDLE_NAME)<br />&nbsp;&nbsp; }<br />&nbsp;&nbsp; contains(TEMPLATE, .*lib):CONFIG(debug, debug|release) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; !debug_and_release|build_pass {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mac:RET = $$member(LIBRARY_NAME, 0)_debug<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else:win32:RET = $$member(LIBRARY_NAME, 0)d<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp; }<br />&nbsp;&nbsp; isEmpty(RET):RET = $$LIBRARY_NAME<br />&nbsp;&nbsp; return($$RET)<br />}<br /><br />注：这是Qt4.8下的文件，Qt5.0下与此小有不同。<br /><br />从这儿你可以看到，在windows下它何时会添加一个d，何时不会。<br />fakelib 干嘛用的<br /><br />从前面的代码中，我们看到有这么一句<br /><br />&nbsp;&nbsp; contains(TEMPLATE, .*lib)<br /><br />可是，当构建动态库时，不是TEMPLATE确实就是 lib/vclib这些了么？<br /><br />恩，构建时没有问题，可是当使用时呢？比如<br /><br />TEMPLATE = app<br />SOURCES += main.cpp<br /><br />LIBS += $$qtLibraryTarget(dbzhang800)<br /><br />还能工作么？<br /><br />恩，所以了。就需要随便取一个 xxxxxlib 作为模板来哄骗一下它。<br />还没结束？<br /><br />自从认识它以后，一直在自己的程序中大量使用这个东西。但是有一件事情总是让人感觉不爽。<br /><br />使用它以后：<br /><br />qmake -tp vc<br /><br />生成的MSVC的工程文件中，总是不能得到正确库文件的名字（具体一点，就是Debug模式下没有那个d）<br /><br />自己用也没什么，反正也不是什么大问题。只是没想到解决方案竟是这样<br /><br />SAVE_TEMPLATE = $$TEMPLATE<br />TEMPLATE = fakelib<br />MY_NAME = $$qtLibraryTarget(dbzhang800)<br />TEMPLATE = $$SAVE_TEMPLATE<br /><br />原因<br /><br />当qmake使用了 -tp 选项后，对TEMPLATE处理时，只接受一个值。也就是 += 操作对其无效。<br /><br />具体一点，位于qmake源码 project.cpp 的3043行<br /><br />&nbsp;&nbsp;&nbsp; } else if(var == QLatin1String("TEMPLATE")) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!Option::user_template.isEmpty()) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var = ".BUILTIN.USER." + var;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; place[var] =&nbsp; QStringList(Option::user_template);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QString orig_template, real_template;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!place[var].isEmpty())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; orig_template = place[var].first();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; real_template = orig_template.isEmpty() ? "app" : orig_template;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!Option::user_template_prefix.isEmpty() &amp;&amp; !orig_template.startsWith(Option::user_template_prefix))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; real_template.prepend(Option::user_template_prefix);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(real_template != orig_template) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var = ".BUILTIN." + var;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; place[var] = QStringList(real_template);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</div><img src ="http://www.cppblog.com/zhonghua/aggbug/187480.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhonghua/" target="_blank">米米</a> 2012-08-17 14:01 <a href="http://www.cppblog.com/zhonghua/archive/2012/08/17/187480.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转 正确收到Qt属性控件中输入框消息</title><link>http://www.cppblog.com/zhonghua/archive/2012/08/17/187479.html</link><dc:creator>米米</dc:creator><author>米米</author><pubDate>Fri, 17 Aug 2012 05:52:00 GMT</pubDate><guid>http://www.cppblog.com/zhonghua/archive/2012/08/17/187479.html</guid><wfw:comment>http://www.cppblog.com/zhonghua/comments/187479.html</wfw:comment><comments>http://www.cppblog.com/zhonghua/archive/2012/08/17/187479.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhonghua/comments/commentRss/187479.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhonghua/services/trackbacks/187479.html</trackback:ping><description><![CDATA[<div><p>QtPropertyBrowser2.5中的字符串属性对应的修改方式是一个输入框,OnValueChange是在每次键入字符时发送一次.这个对于编辑器需要的逻辑来说是一种灾难. Ogitor修改了其源码,解决了这个问题:</p><div><p>&nbsp;</p></div><div>qteditorfactory.h 中<br /><br />QtLineEditFactory类添加如下代码,红色标识<br /><br />class QT_QTPROPERTYBROWSER_EXPORT QtLineEditFactory : public QtAbstractEditorFactory&lt;QtStringPropertyManager&gt;<br />{<br />&nbsp;&nbsp;&nbsp; Q_OBJECT<br />public:<br />&nbsp;&nbsp;&nbsp; QtLineEditFactory(QObject *parent = 0);<br />&nbsp;&nbsp;&nbsp; ~QtLineEditFactory();<br />protected:<br />&nbsp;&nbsp;&nbsp; void connectPropertyManager(QtStringPropertyManager *manager);<br />&nbsp;&nbsp;&nbsp; QWidget *createEditor(QtStringPropertyManager *manager, QtProperty *property,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QWidget *parent);<br />&nbsp;&nbsp;&nbsp; void disconnectPropertyManager(QtStringPropertyManager *manager);<br />private:<br />&nbsp;&nbsp;&nbsp; QtLineEditFactoryPrivate *d_ptr;<br />&nbsp;&nbsp;&nbsp; Q_DECLARE_PRIVATE(QtLineEditFactory)<br />&nbsp;&nbsp;&nbsp; Q_DISABLE_COPY(QtLineEditFactory)<br />&nbsp;&nbsp;&nbsp; Q_PRIVATE_SLOT(d_func(), void slotPropertyChanged(QtProperty *, const QString &amp;))<br />&nbsp;&nbsp;&nbsp; Q_PRIVATE_SLOT(d_func(), void slotRegExpChanged(QtProperty *, const QRegExp &amp;))<br />&nbsp;&nbsp;&nbsp; Q_PRIVATE_SLOT(d_func(), void slotSetValue(const QString &amp;))<br />&nbsp;&nbsp;&nbsp; Q_PRIVATE_SLOT(d_func(), void slotEditingFinished())<br />&nbsp;&nbsp;&nbsp; Q_PRIVATE_SLOT(d_func(), void slotEditorDestroyed(QObject *))<br />};<br /><br />&nbsp;<br /><br />qteditorfactory.cpp中<br /><br />class QtLineEditFactoryPrivate : public EditorFactoryPrivate&lt;QLineEdit&gt;<br />{<br />&nbsp;&nbsp;&nbsp; QtLineEditFactory *q_ptr;<br />&nbsp;&nbsp;&nbsp; Q_DECLARE_PUBLIC(QtLineEditFactory)<br />public:<br /><br />&nbsp;&nbsp;&nbsp; void slotPropertyChanged(QtProperty *property, const QString &amp;value);<br />&nbsp;&nbsp;&nbsp; void slotRegExpChanged(QtProperty *property, const QRegExp &amp;regExp);<br />&nbsp;&nbsp;&nbsp; void slotSetValue(const QString &amp;value);<br />&nbsp;&nbsp;&nbsp; void slotEditingFinished();<br />};<br /><br />void QtLineEditFactoryPrivate::slotEditingFinished()<br />{<br />&nbsp;&nbsp;&nbsp; QObject *object = q_ptr-&gt;sender();<br />&nbsp;&nbsp;&nbsp; const QMap&lt;QLineEdit *, QtProperty *&gt;::ConstIterator ecend = m_editorToProperty.constEnd();<br />&nbsp;&nbsp;&nbsp; for (QMap&lt;QLineEdit *, QtProperty *&gt;::ConstIterator itEditor = m_editorToProperty.constBegin(); itEditor != ecend; ++itEditor)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (itEditor.key() == object) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QtProperty *property = itEditor.value();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QtStringPropertyManager *manager = q_ptr-&gt;propertyManager(property);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!manager)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QString value = static_cast&lt;QLineEdit*&gt;(itEditor.key())-&gt;text();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; manager-&gt;setValue(property, value);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />}<br /><br />QWidget *QtLineEditFactory::createEditor(QtStringPropertyManager *manager,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QtProperty *property, QWidget *parent)<br />{<br /><br />&nbsp;&nbsp;&nbsp; QLineEdit *editor = d_ptr-&gt;createEditor(property, parent);<br />&nbsp;&nbsp;&nbsp; QRegExp regExp = manager-&gt;regExp(property);<br />&nbsp;&nbsp;&nbsp; if (regExp.isValid()) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QValidator *validator = new QRegExpValidator(regExp, editor);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; editor-&gt;setValidator(validator);<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; editor-&gt;setText(manager-&gt;value(property));<br /><br />&nbsp;&nbsp;&nbsp; connect(editor, SIGNAL(editingFinished()),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this, SLOT(slotEditingFinished()));<br />&nbsp;&nbsp;&nbsp; connect(editor, SIGNAL(destroyed(QObject *)),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this, SLOT(slotEditorDestroyed(QObject *)));<br />&nbsp;&nbsp;&nbsp; return editor;<br />}<br /><br />&nbsp;<br /><br />这样既可在输入回车键,或者输入框失去焦点后产生一个OnValueChange事件</div><br /> </div><img src ="http://www.cppblog.com/zhonghua/aggbug/187479.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhonghua/" target="_blank">米米</a> 2012-08-17 13:52 <a href="http://www.cppblog.com/zhonghua/archive/2012/08/17/187479.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>国际化备忘（多个翻译文件组合）</title><link>http://www.cppblog.com/zhonghua/archive/2012/08/02/186044.html</link><dc:creator>米米</dc:creator><author>米米</author><pubDate>Thu, 02 Aug 2012 08:37:00 GMT</pubDate><guid>http://www.cppblog.com/zhonghua/archive/2012/08/02/186044.html</guid><wfw:comment>http://www.cppblog.com/zhonghua/comments/186044.html</wfw:comment><comments>http://www.cppblog.com/zhonghua/archive/2012/08/02/186044.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhonghua/comments/commentRss/186044.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhonghua/services/trackbacks/186044.html</trackback:ping><description><![CDATA[<div>lrelease&nbsp; zhu_zh.ts 1_zh.ts -qm aaa.qm</div><img src ="http://www.cppblog.com/zhonghua/aggbug/186044.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhonghua/" target="_blank">米米</a> 2012-08-02 16:37 <a href="http://www.cppblog.com/zhonghua/archive/2012/08/02/186044.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转 QT StyleSheet  一个例子</title><link>http://www.cppblog.com/zhonghua/archive/2012/07/20/184345.html</link><dc:creator>米米</dc:creator><author>米米</author><pubDate>Fri, 20 Jul 2012 06:14:00 GMT</pubDate><guid>http://www.cppblog.com/zhonghua/archive/2012/07/20/184345.html</guid><wfw:comment>http://www.cppblog.com/zhonghua/comments/184345.html</wfw:comment><comments>http://www.cppblog.com/zhonghua/archive/2012/07/20/184345.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhonghua/comments/commentRss/184345.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhonghua/services/trackbacks/184345.html</trackback:ping><description><![CDATA[<div>使用setStyleSheet来设置图形界面的外观：<br /> QT Style Sheets是一个很有利的工具，允许定制窗口的外观，<br /> 此外还可以用子类QStyle来完成，他的语法很大比重来源于html的CSS，但是适用于窗口<br /> <strong>概括：</strong><br /> Style Sheets是文字性的设定，对于整个应用程序可以使用QApplication::setStyleSheet() 或者对应一个窗口可以使用QWidget::setStyleSheet()，如果好几个样式表在不同的层次上设定，<br /> QT将会集合所有的样式表来设定外观，这称作级串联<br /> 例如：下面的样式表指定所有的QLineEdit应该用黄色作为他们的背景颜色，所有的核对框应该用红色作为他们的文本颜色<br /> <div><div id="code0"><ol><li>QLineEdit { background: yellow }<br /> </li><li>QCheckBox { color: red }</li></ol></div><em>复制代码</em></div>对于这种定制，样式表比palette调色板更强大，例如使用QPalette::Button role来设定一个按钮为红色可能引起危险<br /> 对于单独使用QPalette很难完成的定制，样式表可以指定样式表作用于当前窗口样式顶部，这意味这应用程序讲看起来尽可能的自然，但是任何样式表系统 参数应该考虑，不像QPalette那样，样式表提供检查，如果你设定了一个按钮的背景颜色为红色，你应该确定在所有的平台按钮将会有一个红色的背景，除 此，Qt Designer提供样式表集成环境，使得在不同的窗口样式中更容易看到样式表的效果<br /> 此外，样式表可以用来为你的应用程序提供一个出众的外观，不需要使用子类QStyle,例如，可以指定任意的图片为单选按钮和核对按钮，来使它们出众，使 用这个技术，也可以获得辅助的定制，这将使用几个子类，例如指定style hint(样式暗示),可以参看例子 Style Sheet。<br /> 当样式表有效时候，使用QWidget::style()可以返回QStyle,<br /> 样式表语法：<br /> 样式表语法基本和HTML CSS语法一致。<br /> 样式表包含了样式规则序列，样式规则有一个&lt;selector&gt;和&lt;declaration&gt;组成，&lt;selector&gt;指定哪些窗口将会被这些规则影响，&lt;declaration&gt;指定哪些属性将会被设定在窗口上，例如<br /> QPushButton{color:red}<br /> 在上面的，规则中，QPushButton是&lt;selector&gt;，{color:red}是&lt;declaration&gt;，这个规则指定QPushButton和他的子类将使用红色作为前景颜色，就是字体颜色，并且对大小写没有分别，对于<br /> color，ColoR,COLOR是一样的。<br /> 几个&lt;selector&gt;可以同时被列出，使用逗号","来分开各个&lt;selector&gt;，例如：<br /> QPushButton, QLineEdit, QComboBox { color: red }<br /> &lt;declaration&gt;部分是一对 属性：值&nbsp;&nbsp;对，用{}来括起来，使用分号来分开各个属性，例如<br /> QPushButton { color: red; background-color: white }<br /> 可以参看Qt Style Sheets Reference来查看部件以及样式表的属性列表<br /> 关于样式表的级联属性<br /> 看下面代码的不同<br /> <div><div id="code1"><ol><li>btn1-&gt;setStyleSheet("QPushButton{color:red}"); //设定前景颜色，就是字体颜色<br /> </li><li> btn1-&gt;setStyleSheet("QPushButton{background:yellow}"); //设定背景颜色为红色</li></ol></div><em>复制代码</em></div>和<br /> <div><div id="code2"><ol><li>btn1-&gt;setStyleSheet("QPushButton{color:red；background:yellow}");</li></ol></div><em>复制代码</em></div>第一个代码只能显示黄色背景，第二个确实红色字体，黄色背景，<br /> 所以当设定一个部件时候，要在同一个&gt;setStyleSheet()中完全写出来。<br /> 源代码示例：<br /> <div id="code3"><ol><li>Dialog::Dialog(QWidget *parent) :<br /> </li><li>&nbsp; &nbsp; QDialog(parent),<br /> </li><li>&nbsp; &nbsp; ui(new Ui::Dialog)<br /> </li><li>{<br /> </li><li>&nbsp; &nbsp; ui-&gt;setupUi(this);<br /> </li><li>&nbsp; &nbsp;  this-&gt;setWindowFlags(this-&gt;windowFlags()&amp;Qt::WindowMaximizeButtonHint&amp;Qt::WindowMinimizeButtonHint);  //为对话框添加上最大化和最小化按钮<br /> </li><li>//&nbsp; &nbsp; layout=new QBoxLayout(this);<br /> </li><li>&nbsp; &nbsp; layout1=new QGridLayout(this);<br /> </li><li>&nbsp; &nbsp; btn1=new QPushButton(this);<br /> </li><li>&nbsp; &nbsp; btn1-&gt;setStyleSheet("QPushButton{color:red;background:yellow}"); //设定前景颜色，就是字体颜色<br /> </li><li>//&nbsp; &nbsp; btn1-&gt;setStyleSheet("QPushButton{background:yellow}");<br /> </li><li>&nbsp; &nbsp; btn1-&gt;setText("Button1");<br /> </li><li>&nbsp; &nbsp; btn2=new QPushButton(this);<br /> </li><li>&nbsp; &nbsp; btn2-&gt;setStyleSheet("QPushButton{color:red;background-color:#c89b64}"); //使用rgb来设定背景颜色<br /> </li><li>&nbsp; &nbsp; btn2-&gt;setText("Button2");<br /> </li><li>&nbsp; &nbsp;&nbsp;&nbsp;btn3=new QPushButton(this);<br /> </li><li>&nbsp;  &nbsp;&nbsp;&nbsp;btn3-&gt;setStyleSheet("QPushButton{background-image:url(image/1.png);background-repeat:  repeat-xy;background-position: center;background-attachment:  fixed;background-attachment: fixed;background-attachment:  fixed;;background-clip: padding}");<br /> </li><li>&nbsp; &nbsp;&nbsp;&nbsp;//设定按钮的背景图片,background-repeat可以设定背景图片的重复规则，这里设定仅在xy方向都重复，所以图片会被重复一次<br /> </li><li>&nbsp; &nbsp;&nbsp;&nbsp;//background-position用来设定图片的位置，是左(left)还是右(right)，还是在中间(center),是上(top)还是底部(bottom)<br /> </li><li>&nbsp; &nbsp;&nbsp;&nbsp;//background-attachment用来这定背景图片是否卷动或者和窗口大小相匹配，默认是卷动的<br /> </li><li>&nbsp; &nbsp;&nbsp;&nbsp;btn3-&gt;setText("Button3");<br /> </li><li>&nbsp; &nbsp;&nbsp;&nbsp;btn4=new QPushButton(this);<br /> </li><li>&nbsp; &nbsp;&nbsp;&nbsp;btn4-&gt;setStyleSheet("QPushButton{border: 3px solid red;border-radius:8px}"); //设定边框宽度以及颜色<br /> </li><li>&nbsp; &nbsp;&nbsp;&nbsp;//可以使用border-top，border-right，border-bottom，border-left分别设定按钮的上下左右边框，<br /> </li><li>&nbsp; &nbsp;&nbsp;&nbsp;//同样有border-left-color, border-left-style, border-left-width.等分别来设定他们的颜色，样式和宽度<br /> </li><li>&nbsp; &nbsp;&nbsp;&nbsp;//border-image用来设定边框的背景图片。<br /> </li><li>&nbsp; &nbsp;&nbsp;&nbsp;//border-radius用来设定边框的弧度。可以设定圆角的按钮<br /> </li><li>&nbsp; &nbsp;&nbsp;&nbsp;btn4-&gt;setText("Button4");<br /> </li><li>&nbsp; &nbsp;&nbsp;&nbsp;//字体设定<br /> </li><li>&nbsp; &nbsp;&nbsp;&nbsp;//font-family来设定字体所属家族，<br /> </li><li>&nbsp; &nbsp;&nbsp;&nbsp;//font-size来设定字体大小<br /> </li><li>&nbsp; &nbsp;&nbsp;&nbsp;//font-style来设定字体样式<br /> </li><li>&nbsp; &nbsp;&nbsp;&nbsp;//font-weight来设定字体深浅<br /> </li><li>&nbsp; &nbsp;&nbsp;&nbsp;//height用来设定其高低<br /> </li><li>&nbsp; &nbsp;&nbsp;&nbsp;//selection-color用来设定选中时候的颜色<br /> </li><li>&nbsp; &nbsp;&nbsp;&nbsp;edit1=new QLineEdit(this);<br /> </li><li>&nbsp; &nbsp;&nbsp;&nbsp;edit1-&gt;setStyleSheet("QLineEdit{font: bold italic large  \"Times New  Roman\";font-size:25px;color:#3764ff;height:50px;border:4px  solid #9bc821;border-radius:15px;selection-color:pink}");<br /> </li><li>&nbsp; &nbsp;&nbsp;&nbsp;//父窗口的设定<br /> </li><li>&nbsp; &nbsp;&nbsp;&nbsp;//icon-size来设定图片大小<br /> </li><li>&nbsp; &nbsp;&nbsp;&nbsp;this-&gt;setWindowIcon(QIcon("image/1.png"));<br /> </li><li>&nbsp; &nbsp;&nbsp; &nbsp;this-&gt;setStyleSheet("QWidget{background:write url(image/2.png);icon-size:20px 5px}");&nbsp;&nbsp;//设定整个对话框的背景颜色<br /> </li><li>//&nbsp; &nbsp;&nbsp; &nbsp;this-&gt;setStyleSheet("QWidget{icon-size:20px 5px}");<br /> </li><li>&nbsp; &nbsp; layout1-&gt;addWidget(btn1,0,0);<br /> </li><li>&nbsp; &nbsp; layout1-&gt;addWidget(btn2,0,1);<br /> </li><li>&nbsp; &nbsp; layout1-&gt;addWidget(btn3,1,0);<br /> </li><li>&nbsp; &nbsp; layout1-&gt;addWidget(btn4,1,1);<br /> </li><li>&nbsp; &nbsp;&nbsp;&nbsp;layout1-&gt;addWidget(edit1,2,0);<br /> </li><li>}</li></ol></div></div><img src ="http://www.cppblog.com/zhonghua/aggbug/184345.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhonghua/" target="_blank">米米</a> 2012-07-20 14:14 <a href="http://www.cppblog.com/zhonghua/archive/2012/07/20/184345.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> QTreeview 选中后 branch区域背景为高亮的橙色. </title><link>http://www.cppblog.com/zhonghua/archive/2012/07/20/184321.html</link><dc:creator>米米</dc:creator><author>米米</author><pubDate>Fri, 20 Jul 2012 04:13:00 GMT</pubDate><guid>http://www.cppblog.com/zhonghua/archive/2012/07/20/184321.html</guid><wfw:comment>http://www.cppblog.com/zhonghua/comments/184321.html</wfw:comment><comments>http://www.cppblog.com/zhonghua/archive/2012/07/20/184321.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhonghua/comments/commentRss/184321.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhonghua/services/trackbacks/184321.html</trackback:ping><description><![CDATA[<div><p>//如果设置 show-decoration-selected:1会导致点击选中后,前面branch区域背景为高亮的橙色.</p> <p>&nbsp;&nbsp;&nbsp; ui-&gt;treeView-&gt;setVerticalScrollBarPolicy ( Qt::ScrollBarAlwaysOff ) ;</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ui-&gt;treeView-&gt;setStyleSheet(&nbsp;&nbsp; \<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; " QTreeView { \<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color:#ff0000">show-decoration-selected: 0</span>; \<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } \<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QTreeView::item { \<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#ff0000"> show-decoration-selected: 0; \<br /> </span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; background-image:url(image/list_bg02.png); \<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } \<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QTreeView::item:selected{ \<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; background-image:url(image/list_bg01a.png); \<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp; \<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QTreeView::branch { \<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; selection-color: transparent; \<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } \<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QTreeView::branch:closed:has-children:has-siblings { \<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; image: url(image/icon_add.png); \<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } \<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QTreeView::branch:has-children:!has-siblings:closed { \<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; image: url(image/icon_add.png); \<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } \<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QTreeView::branch:open:has-children:has-siblings { \<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; image: url(image/icon_reduce.png); \<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } \<br /> \<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QTreeView::branch:open:has-children:!has-siblings { \<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; image: url(image/icon_reduce.png); \<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }");</p> <p>&nbsp;</p> <br /> &nbsp;&nbsp;&nbsp; ui-&gt;treeView-&gt;setAttribute(Qt::WA_MacShowFocusRect, 0);<br /> &nbsp;&nbsp;&nbsp; ui-&gt;treeView-&gt;setFocusPolicy(Qt::NoFocus);<br /> &nbsp;&nbsp;&nbsp; ui-&gt;treeView-&gt;setEditTriggers(QAbstractItemView::NoEditTriggers);  </div><img src ="http://www.cppblog.com/zhonghua/aggbug/184321.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhonghua/" target="_blank">米米</a> 2012-07-20 12:13 <a href="http://www.cppblog.com/zhonghua/archive/2012/07/20/184321.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转  QT控制选中item的文字颜色(HighlightedText) </title><link>http://www.cppblog.com/zhonghua/archive/2012/07/20/184320.html</link><dc:creator>米米</dc:creator><author>米米</author><pubDate>Fri, 20 Jul 2012 04:12:00 GMT</pubDate><guid>http://www.cppblog.com/zhonghua/archive/2012/07/20/184320.html</guid><wfw:comment>http://www.cppblog.com/zhonghua/comments/184320.html</wfw:comment><comments>http://www.cppblog.com/zhonghua/archive/2012/07/20/184320.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhonghua/comments/commentRss/184320.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhonghua/services/trackbacks/184320.html</trackback:ping><description><![CDATA[<div><h3><span style="font-size:18px"><strong>&nbsp; 默认</strong></span>的情况下，QTableView,QTableWidget等控件，当item选中后其背景色为蓝色的，文字颜色(前景色)为白色的，如图：</h3> <div id="article_content"> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img alt="默认的item选中后的背景色(白色)" src="http://hi.csdn.net/attachment/201104/4/0_1301926257VyYy.gif" style="border-bottom:black 1px solid; border-left:black 1px solid; vertical-align:middle; border-top:black 1px solid; border-right:black 1px solid" height="91" width="203" /></p> <p>&nbsp;</p> <p><span style="font-size:18px"><strong>&nbsp;&nbsp;&nbsp; 如果</strong></span>我们想动态的更改item的前景色（例如值大于零显示红色，小于零显示绿色），并且选中后文字颜色不变(这个是我想实现的，其实就是模仿一般的股票价格图表)，怎么办呢？ 首先在添加或者修改item的时候，可以使用:</p> <p><strong>&nbsp;model-&gt;item(row, column)-&gt;setForeground<span style="color:#000000">(</span><span style="color:#800080">QBrush</span><span style="color:#000000">(</span><span style="color:#800080">QColor</span><span style="color:#000000">(</span><span style="color:#000080">255</span><span style="color:#000000">,</span><span style="color:#c0c0c0"> </span><span style="color:#000080">0</span><span style="color:#000000">,</span><span style="color:#c0c0c0"> </span><span style="color:#000080">0</span><span style="color:#000000">)));&nbsp; //把表格的item的文字颜色设置为红色</span></strong></p> <p>但是只这样还是不够的，这样只能保证在不选中的情况下显示为红色， 若不做其他设置，选中后item的颜色照样变成白色的了。 </p> <p>&nbsp;</p> <p><span style="font-size:18px"><strong>&nbsp;&nbsp;&nbsp;&nbsp;对此</strong></span>我找到了使用代理的方法，使选中后的文字颜色和选中前的文字颜色一致（也可以灵活修改），效果如下图，代码随后。</p> <p>&nbsp;</p> <p><span style="font-size:18px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img alt="" src="http://hi.csdn.net/attachment/201104/4/0_13019271492i8R.gif" />&nbsp;<span style="font-size:10px">//黄色的那行为选中行</span></span></p> <p>&nbsp;</p> <p>&nbsp;</p> <p><span style="font-size:18px"><span style="font-size:10px">&nbsp;&nbsp;&nbsp;</span></span><span style="font-size:18px"><span style="font-size:10px"> </span></span></p> <div bg_cpp"=""> <div> <div><strong>[cpp]</strong> <a title="view plain" href="http://blog.csdn.net/ilvu999/article/details/7206665#"> view plain</a><a title="copy" href="http://blog.csdn.net/ilvu999/article/details/7206665#">copy</a></div> </div> <ol><li><span>//委托(代理) &nbsp;&nbsp;</span></li><li>class&nbsp;ItemDelegate&nbsp;:&nbsp;public&nbsp;QItemDelegate&nbsp;&nbsp;</li><li>{&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;Q_OBJECT&nbsp;&nbsp;</li><li>public:&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;ItemDelegate()&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;paint(QPainter&nbsp;*painter,&nbsp;const&nbsp;QStyleOptionViewItem&nbsp;&amp;option,&nbsp;const&nbsp;QModelIndex&nbsp;&amp;index)&nbsp;const&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QStyleOptionViewItem&nbsp;&nbsp;viewOption(option);&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>//高亮显示与普通显示时的前景色一致（即选中行和为选中时候的文字颜色一样） </span>&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;viewOption.palette.setColor(QPalette::HighlightedText,&nbsp;index.data(Qt::ForegroundRole).value&lt;QColor&gt;());&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QItemDelegate::paint(painter,&nbsp;viewOption,&nbsp;index);&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li>};&nbsp;&nbsp;</li></ol> </div> <div bg_cpp"=""><div><div><strong>[cpp]</strong> <a href="http://blog.csdn.net/ilvu999/article/details/7206665#" title="view plain">view plain</a><a href="http://blog.csdn.net/ilvu999/article/details/7206665#" title="copy">copy</a></div></div><ol start="1"><li><span>//委托(代理)&nbsp;&nbsp;</span></li><li><span>class&nbsp;ItemDelegate&nbsp;:&nbsp;public&nbsp;QItemDelegate&nbsp;&nbsp;</span></li><li>{&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;Q_OBJECT&nbsp;&nbsp;</li><li><span>public:&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;ItemDelegate()&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>void&nbsp;paint(QPainter&nbsp;*painter,&nbsp;const&nbsp;QStyleOptionViewItem&nbsp;&amp;option,&nbsp;const&nbsp;QModelIndex&nbsp;&amp;index)&nbsp;const&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QStyleOptionViewItem&nbsp;&nbsp;viewOption(option);&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>//高亮显示与普通显示时的前景色一致（即选中行和为选中时候的文字颜色一样）&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;viewOption.palette.setColor(QPalette::HighlightedText,&nbsp;index.data(Qt::ForegroundRole).value&lt;QColor&gt;());&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QItemDelegate::paint(painter,&nbsp;viewOption,&nbsp;index);&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li>};&nbsp;&nbsp;</li></ol></div>    <p>&nbsp;</p> <p><span style="font-size:18px"><span style="font-size:10px">&nbsp; &nbsp;<span style="font-size:18px"><span style="font-size:10px"> </span></span></span></span></p> <div bg_cpp"=""> <div> <div><strong>[cpp]</strong> <a title="view plain" href="http://blog.csdn.net/ilvu999/article/details/7206665#"> view plain</a><a title="copy" href="http://blog.csdn.net/ilvu999/article/details/7206665#">copy</a></div> </div> <ol><li><span>view&nbsp;=&nbsp;new&nbsp;QTableView;&nbsp;&nbsp;</span> </li><li>model&nbsp;=&nbsp;new&nbsp;QStandardItemModel;&nbsp;&nbsp; </li><li>view-&gt;setModel(model);&nbsp;&nbsp; </li><li>view-&gt;setItemDelegate(new&nbsp;ItemDelegate);&nbsp;&nbsp;</li></ol> </div> <div bg_cpp"=""><div><div><strong>[cpp]</strong> <a href="http://blog.csdn.net/ilvu999/article/details/7206665#" title="view plain">view plain</a><a href="http://blog.csdn.net/ilvu999/article/details/7206665#" title="copy">copy</a></div></div><ol start="1"><li><span>view&nbsp;=&nbsp;new&nbsp;QTableView;&nbsp;&nbsp;</span></li><li>model&nbsp;=&nbsp;<span>new&nbsp;QStandardItemModel;&nbsp;&nbsp;</span></li><li>view-&gt;setModel(model);&nbsp;&nbsp;</li><li>view-&gt;setItemDelegate(<span>new&nbsp;ItemDelegate);&nbsp;&nbsp;</span></li></ol></div>    <p>&nbsp;</p> <p><span style="font-size:18px"><span style="font-size:10px">&nbsp;&nbsp; </span></span></p> <div bg_cpp"=""> <div> <div><strong>[cpp]</strong> <a title="view plain" href="http://blog.csdn.net/ilvu999/article/details/7206665#"> view plain</a><a title="copy" href="http://blog.csdn.net/ilvu999/article/details/7206665#">copy</a></div> </div> <ol><li><span>if&nbsp;(strList[2].toDouble()&nbsp;&gt;=&nbsp;strList[3].toDouble())&nbsp;&nbsp;</span> </li><li>&nbsp;&nbsp;&nbsp;&nbsp;model-&gt;item(row,&nbsp;2)-&gt;setForeground(QBrush(QColor(255,&nbsp;0,&nbsp;0)));&nbsp;&nbsp; </li><li>else&nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;model-&gt;item(row,&nbsp;2)-&gt;setForeground(QBrush(QColor(0,&nbsp;127,&nbsp;0)));&nbsp;&nbsp; </li><li>if&nbsp;(strList[4].toDouble()&nbsp;&gt;=&nbsp;strList[3].toDouble())&nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;model-&gt;item(row,&nbsp;4)-&gt;setForeground(QBrush(QColor(255,&nbsp;0,&nbsp;0)));&nbsp;&nbsp; </li><li>else&nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;model-&gt;item(row,&nbsp;4)-&gt;setForeground(QBrush(QColor(0,&nbsp;127,&nbsp;0)));&nbsp;&nbsp;</li></ol> </div> <div bg_cpp"=""><div><div><strong>[cpp]</strong> <a href="http://blog.csdn.net/ilvu999/article/details/7206665#" title="view plain">view plain</a><a href="http://blog.csdn.net/ilvu999/article/details/7206665#" title="copy">copy</a></div></div><ol start="1"><li><span>if&nbsp;(strList[2].toDouble()&nbsp;&gt;=&nbsp;strList[3].toDouble())&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;model-&gt;item(row,&nbsp;2)-&gt;setForeground(QBrush(QColor(255,&nbsp;0,&nbsp;0)));&nbsp;&nbsp;</li><li><span>else&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;model-&gt;item(row,&nbsp;2)-&gt;setForeground(QBrush(QColor(0,&nbsp;127,&nbsp;0)));&nbsp;&nbsp;</li><li><span>if&nbsp;(strList[4].toDouble()&nbsp;&gt;=&nbsp;strList[3].toDouble())&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;model-&gt;item(row,&nbsp;4)-&gt;setForeground(QBrush(QColor(255,&nbsp;0,&nbsp;0)));&nbsp;&nbsp;</li><li><span>else&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;model-&gt;item(row,&nbsp;4)-&gt;setForeground(QBrush(QColor(0,&nbsp;127,&nbsp;0)));&nbsp; <br /></li></ol></div></div></div><img src ="http://www.cppblog.com/zhonghua/aggbug/184320.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhonghua/" target="_blank">米米</a> 2012-07-20 12:12 <a href="http://www.cppblog.com/zhonghua/archive/2012/07/20/184320.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> QTreeView 行高亮 ,图标 </title><link>http://www.cppblog.com/zhonghua/archive/2012/07/20/184316.html</link><dc:creator>米米</dc:creator><author>米米</author><pubDate>Fri, 20 Jul 2012 03:23:00 GMT</pubDate><guid>http://www.cppblog.com/zhonghua/archive/2012/07/20/184316.html</guid><wfw:comment>http://www.cppblog.com/zhonghua/comments/184316.html</wfw:comment><comments>http://www.cppblog.com/zhonghua/archive/2012/07/20/184316.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhonghua/comments/commentRss/184316.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhonghua/services/trackbacks/184316.html</trackback:ping><description><![CDATA[<div>&nbsp;&nbsp; // 样式 <p>&nbsp;&nbsp;&nbsp; ui-&gt;treeView-&gt;setStyleSheet(</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "QTreeView::item{height: 60px;show-decoration-selected: 0;background-image:url(image/list_content_bg.png);}"</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "QTreeView::item:selected{background-image:url(image/list_select_bg.png);}"</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );</p> <p>&nbsp;</p> <p>//设置图标</p> <p>QVariant data(const QModelIndex &amp;index, int role)<br /> {</p> <p>if (!index.isValid())<br /> &nbsp;&nbsp;&nbsp; return QVariant();</p> <p>if(role == Qt::UserRole)<br /> {<br /> <br /> }<br /> &nbsp;if(role ==Qt::BackgroundRole)<br /> {<br /> &nbsp;&nbsp;&nbsp; QImage&nbsp; image("image/list_bg02.png");<br /> &nbsp;&nbsp;&nbsp; return QBrush(image);<br /> }</p> <p>if(index.column()==0)<br /> {</p> <p>&nbsp;</p> <p>&nbsp;&nbsp;&nbsp; if(role == Qt::DecorationRole)<br /> &nbsp;&nbsp;&nbsp; {<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QImage image;<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; image.load("image/icon_user.png");<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return image;//QIcon("image/icon_user.png");<br /> &nbsp;&nbsp;&nbsp; }</p> <p>}</p> <p>图标大小&nbsp; :属性 iconSize</p> ui-&gt;treeView-&gt;setIconSize(QSize(32,32));  </div><img src ="http://www.cppblog.com/zhonghua/aggbug/184316.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhonghua/" target="_blank">米米</a> 2012-07-20 11:23 <a href="http://www.cppblog.com/zhonghua/archive/2012/07/20/184316.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转 qt4 StyleSheet的总结</title><link>http://www.cppblog.com/zhonghua/archive/2012/07/09/182430.html</link><dc:creator>米米</dc:creator><author>米米</author><pubDate>Mon, 09 Jul 2012 09:18:00 GMT</pubDate><guid>http://www.cppblog.com/zhonghua/archive/2012/07/09/182430.html</guid><wfw:comment>http://www.cppblog.com/zhonghua/comments/182430.html</wfw:comment><comments>http://www.cppblog.com/zhonghua/archive/2012/07/09/182430.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhonghua/comments/commentRss/182430.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhonghua/services/trackbacks/182430.html</trackback:ping><description><![CDATA[<div><div>QApplication::setStyleSheet(QString);<br />QWidget::setStyleSheet(QString);</div> <div><br />1. 程序级的外观：（作用于整个程序的器件）<br />如：</div> <div><br />QLineEdit { background: yellow }<br />QCheckBox { color: red }</div> <div><br />2. 器件级的外观：（作用于本器件及其子器件）<br />如：</div> <div><br />textViewer-&gt;<br />setStyleSheet("background-color: #FFFFBB;"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "color: #000099;"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "margin: 10px;"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "padding: 5px;"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "padding-left: 15px;"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "padding-right: 15px;"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "border-radius: 5px;" // 圆角边框(只用IE的人就不知道了吧:D)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "border: 3px solid #abc;");</div> <div>&nbsp;</div> <div>&nbsp;</div> <div><br />"background-color: #FFFFBB;"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "color: #000099;"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "margin: 10px;"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "padding: 5px;"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "padding-left: 15px;"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "padding-right: 15px;"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "border-radius: 5px;" // 圆角边框(只用IE的人就不知道了吧:D)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "border: 3px solid #abc;"</div> <div>&nbsp;</div> <div>&nbsp;</div> <div>这只是基础，其他的可根据实际情况，按帮助asstiant上的说明写</div></div><img src ="http://www.cppblog.com/zhonghua/aggbug/182430.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhonghua/" target="_blank">米米</a> 2012-07-09 17:18 <a href="http://www.cppblog.com/zhonghua/archive/2012/07/09/182430.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转 QScopedPointer介绍</title><link>http://www.cppblog.com/zhonghua/archive/2012/07/03/181227.html</link><dc:creator>米米</dc:creator><author>米米</author><pubDate>Tue, 03 Jul 2012 02:19:00 GMT</pubDate><guid>http://www.cppblog.com/zhonghua/archive/2012/07/03/181227.html</guid><wfw:comment>http://www.cppblog.com/zhonghua/comments/181227.html</wfw:comment><comments>http://www.cppblog.com/zhonghua/archive/2012/07/03/181227.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhonghua/comments/commentRss/181227.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhonghua/services/trackbacks/181227.html</trackback:ping><description><![CDATA[<div><h3>QScopedPointer介绍</h3>  <p><a href="http://www.thisisqt.com/tag.php?name=QScopedPointer">QScopedPointer</a></p>  <p>就分配空间和释放空间而言，Qt的处理有点乏味，要不然是通过隐式共享的containers，要不然就是通过QObject的父子关系模式。但总有些时候我们需要在堆上分配一些空间，问题来了，我们该在哪里delete它，如何能够确保不产生内存泄露呢？   <br />QScopedPointer就为了解决这个问题而生的，哈哈<img alt="" src="http://www.thisisqt.com/forum/images/smilies/default/lol.gif" border="0" /> QScopedPointer在其生命期结束后会自动删除它所指的对象。 </p>  <ol><li>void foo()</li><li>{</li><li>QScopedPointer&lt;int&gt; i(new int(42));</li><li>&nbsp;&nbsp;&nbsp; &#8230;</li><li>&nbsp;&nbsp;&nbsp; if (someCondition)</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return; // 我们在堆上构造的整数这时会在这里删除或者是在下面</li><li>&nbsp;&nbsp;&nbsp; &#8230;</li><li>} // &#8230; 也可能在这里</li></ol>  <p><em>复制代码</em></p>  <p>这样就可以确保我们在堆上为整数42分配的空间不会产生内存泄露，同时我们也不用手动delete它，哈哈。   <br />那我们如何访问QScopedPointer 所指的对象呢？QScopedPointer重新实现了operator* 和operator-&gt;，因此我们可以像下面这样使用它： </p>  <ol><li>QScopedPointer&lt;int&gt; i(new int(42));</li><li>&nbsp;&nbsp;&nbsp; *i = 43; </li></ol>  <p><em>复制代码</em></p>  <p>有些运算符是不支持的，如赋值运算符： </p>  <ol><li>QScopedPointer&lt;int&gt; i(new int(42));</li><li>&nbsp;&nbsp;&nbsp; i = new int(43); // 编译不通过</li><li>&nbsp;&nbsp;&nbsp; i.reset(new int(43)); // 正确 </li></ol>  <p><em>复制代码</em></p>  <p>operator T*()也是没有的： </p>  <ol><li>int *foo()</li><li>{</li><li>QScopedPointer&lt;int&gt; i(new int(42));</li><li>&nbsp;&nbsp;&nbsp; &#8230;</li><li>&nbsp;&nbsp;&nbsp; return i; // thankfully, this does not compile.</li><li>} </li></ol>  <p><em>复制代码</em></p>  <p>看到错误没？在上面的代码中一旦我们return，我们构造的对象将被删除因为i的生命期已经结束，我们将会返回一个野指针，这可能会导致崩溃。如果真要返回我们应该像下面这样： </p>  <ol><li>int *foo()</li><li>{</li><li>QScopedPointer&lt;int&gt; i(new int(42));</li><li>&nbsp;&nbsp;&nbsp; &#8230;</li><li>&nbsp;&nbsp;&nbsp; if (someError)</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0; // our integer is deleted here</li><li>&nbsp;&nbsp;&nbsp; return i.take(); // from now on, our heap object is on its own.</li><li>} </li></ol>  <p><em>复制代码</em></p>  <p>通过调用take()方法，我们告诉QScopedPointer它的工作已经做完，现在由我们来接管在堆上分配对象的所有权，哈哈<img alt="" src="http://www.thisisqt.com/forum/images/smilies/default/lol.gif" border="0" />    <br />上面的只是针对new而言的，那么如果是malloc或者operator new[]构造数组呢？这里我们需要使用QScopedPointer的第二个参数： </p>  <ol><li>QScopedPointer&lt;int, QScopedPointerPodDeleter&gt; pod(static_cast&lt;int *&gt;(malloc(sizeof int))); </li></ol>  <p><em>复制代码</em></p>  <p>但QScopedPointer生命期结束后QScopedPointerPodDeleter (pod 是 &#8220;plain old data&#8221;的缩写) 会调用free来释放我们分配的空间。   <br />为了方便我们有一个专门针对数组的类，QScopedArrayPointer，在其生命期结束后会自动调用delete[]方法： </p>  <ol><li>void foo()</li><li>{</li><li>&nbsp;&nbsp;&nbsp; QScopedArrayPointer&lt;int&gt; i(new int[10]);</li><li>&nbsp;&nbsp;&nbsp; i[2] = 42;</li><li>&nbsp;&nbsp;&nbsp; &#8230;</li><li>&nbsp;&nbsp;&nbsp; return; // our integer array is now deleted using delete[]</li><li>} </li></ol>  <p><em>复制代码</em></p>  <p>注意如果你有一个引用计数的对象，可以使用QExplicitlySharedDataPointer来确保当其引用计数为0时正确删除。   <br />在 Qt的S60分支中，QScopedPointe  和QExplicitlySharedDataPointer已经得到了广泛的使用。相信不久就可以加入Qt的总分支中。通过使用Qt的这些智能指针，我 们可以让我们的程序更易读同时也不用过于担心，因为这些方法都是inline内联的。</p>  <p>&nbsp;</p>  <p>&nbsp;</p>  <p>经常这么用</p>  <p>class MyPrivateClass; // forward declare MyPrivateClass </p>  <p>class MyClass   <br />{    <br />private:    <br />&nbsp;&nbsp;&nbsp; QScopedPointer&lt;MyPrivateClass&gt; privatePtr; // QScopedPointer to forward declared class </p>  <p>public:   <br />&nbsp;&nbsp;&nbsp; MyClass(); // OK    <br />&nbsp;&nbsp;&nbsp; inline ~MyClass() {} // VIOLATION - Destructor must not be inline </p>  <p>private:   <br />&nbsp;&nbsp;&nbsp; Q_DISABLE_COPY(MyClass) // OK - copy constructor and assignment operators    <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; // are now disabled, so the compiler won't implicitely    <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; // generate them.    <br />};</p></div><img src ="http://www.cppblog.com/zhonghua/aggbug/181227.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhonghua/" target="_blank">米米</a> 2012-07-03 10:19 <a href="http://www.cppblog.com/zhonghua/archive/2012/07/03/181227.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>常用正则</title><link>http://www.cppblog.com/zhonghua/archive/2012/06/21/179588.html</link><dc:creator>米米</dc:creator><author>米米</author><pubDate>Thu, 21 Jun 2012 02:55:00 GMT</pubDate><guid>http://www.cppblog.com/zhonghua/archive/2012/06/21/179588.html</guid><wfw:comment>http://www.cppblog.com/zhonghua/comments/179588.html</wfw:comment><comments>http://www.cppblog.com/zhonghua/archive/2012/06/21/179588.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhonghua/comments/commentRss/179588.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhonghua/services/trackbacks/179588.html</trackback:ping><description><![CDATA[<div>设置正则表达式.<br />类似下面的<br />QRegExp <br />这里的用法就是用来检测QString等字符串错误的,例如文件名里面最好就不出现&lt;&gt;|/\:等,所以可以如下定义QRegExp rx("[a-zA-Z0-9\-\\\_]{25}"); 25就是所输入的字符串个数!a-z当然就是a-z,你也可以abcdefghijklm....等等.\- 就是-<br /><br />好了,现在可以把这个rx绑入QRegExpValidator.<br /><br />QRegExpValidator *pRevalidotor = new QRegExpValidator(regExp, this);<br /><br />绑入lineEdit :<br /><br />pEditWell-&gt;setValidator(new QRegExpValidator(regExp, this)); <br /><br />常用的:<br />"^\d+$"　　//非负整数（正整数 + 0） &lt;br&gt;<br /><br />"^[0-9]*[1-9][0-9]*$"　　//正整数 &lt;br&gt;<br /><br />"^((-\d+)|(0+))$"　　//非正整数（负整数 + 0） &lt;br&gt;<br /><br />"^-[0-9]*[1-9][0-9]*$"　　//负整数 &lt;br&gt;<br /><br />"^-?\d+$"　　　　//整数 &lt;br&gt;<br /><br />"^\d+(\.\d+)?$"　　//非负浮点数（正浮点数 + 0） &lt;br&gt;<br /><br />"^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$"　　//正浮点数 &lt;br&gt;<br /><br />"^((-\d+(\.\d+)?)|(0+(\.0+)?))$"　　//非正浮点数（负浮点数 + 0） &lt;br&gt;<br /><br />"^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$"　　//负浮点数 &lt;br&gt;<br /><br />"^(-?\d+)(\.\d+)?$"　　//浮点数 &lt;br&gt;<br /><br />"^[A-Za-z]+$"　　//由26个英文字母组成的字符串 &lt;br&gt;<br /><br />"^[A-Z]+$"　　//由26个英文字母的大写组成的字符串 &lt;br&gt;<br /><br />"^[a-z]+$"　　//由26个英文字母的小写组成的字符串 &lt;br&gt;<br /><br />"^[A-Za-z0-9]+$"　　//由数字和26个英文字母组成的字符串 &lt;br&gt;<br /><br />"^\w+$"　　//由数字、26个英文字母或者下划线组成的字符串 &lt;br&gt;<br /><br />"^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$"　　　　//email地址 &lt;br&gt;<br /><br />"^[a-zA-z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$"　　//url &lt;br&gt;<br /><br />"^(d{2}|d{4})-((0([1-9]{1}))|(1[1|2]))-(([0-2]([1-9]{1}))|(3[0|1]))$" // 年-月-日 &lt;br&gt;<br /><br />"^((0([1-9]{1}))|(1[1|2]))/(([0-2]([1-9]{1}))|(3[0|1]))/(d{2}|d{4})$" // 月/日/年 &lt;br&gt;<br /><br />"^([w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$"&nbsp;&nbsp;&nbsp; //Email &lt;br&gt;<br /><br />"(d+-)?(d{4}-?d{7}|d{3}-?d{8}|^d{7,8})(-d+)?"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //电话号码 &lt;br&gt;<br /><br />"^(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5])$" &nbsp;<br /><br />//IP地址&lt;/font&gt;&lt;/p&gt;<br /><br />&lt;p&gt;&lt;font size="3" color="#ff9900"&gt;^([0-9A-F]{2})(-[0-9A-F]{2}){5}$&nbsp;&nbsp;&nbsp; //MAC地址的正则表达式 &lt;br&gt;<br /><br />^[-+]?\d+(\.\d+)?$ //值类型正则表达式&lt;/font&gt;&lt;/p&gt;<br /><br />&lt;/font&gt;&lt;br&gt;<br /><br />&lt;br&gt;<br /><br />&lt;font size="3"&gt;QRegExp是Qt的正则表达式类.&lt;br&gt;<br /><br />Qt中有两个不同类的正则表达式.&lt;br&gt;<br /><br />第一类为元字符.它表示一个或多个常量表达式.&lt;br&gt;<br /><br />令一类为 转义字符,它代表一个特殊字符.&lt;br&gt;<br /><br />&lt;br&gt;<br /><br />一.元字符&lt;br&gt;<br /><br />. 匹配任意单个字符.例如, 1.3 可能是1. 后面跟任意字符,再跟3&lt;br&gt;<br /><br />^ 匹配字符串首. 例如, ^12可能是123,但不能是312&lt;br&gt;<br /><br />$ 配字符串尾. 例如, 12$可以是312, 当不能是 123&lt;br&gt;<br /><br />[] 匹配括号内输入的任意字符.[123]可以为1, 2 或3&lt;br&gt;<br /><br />* 匹配任意数量的前导字符. 例如, 1*2可以为任意数量个1(甚至没有), 后面跟一个2&lt;br&gt;<br /><br />+ 匹配至少一个前导字符. 例如, 1+2必须为一个或多个1, 后跟一个2&lt;br&gt;<br /><br />? 匹配一个前导字符或为空. 例如 1?2可以为2或这12&lt;br&gt;<br /><br />&lt;br&gt;<br /><br />二.统配模式&lt;br&gt;<br /><br />通过 QRegExp::setPatternSyntax(QRegExp::Wildcard);可以将元字符设置为统配模式.在统配模式下,只有3个元字 符可以使用.他们的功能没有变化.&lt;br&gt;<br /><br />? 匹配任意单个字符, 例如, 1?2可以为1,后面跟任意单个字符, 再跟2&lt;br&gt;<br /><br />* 匹配任意一个字符序列. 例如, 1*2, 可以为1, 后面跟任意数量的字符, 再跟一个2&lt;br&gt;<br /><br />[] 匹配一个定义的字符集合. 例如, [a-zA-Z\.]可以匹配 a到z之间任意一个字符和. [^a]匹配出小写a以外的字符.&lt;br&gt;<br /><br />&lt;br&gt;<br /><br />三.转义序列&lt;br&gt;<br /><br />\. 匹配"."&lt;br&gt;<br /><br />\^ 匹配"^"&lt;br&gt;<br /><br />\$ 匹配"$"&lt;br&gt;<br /><br />\[ 匹配"["&lt;br&gt;<br /><br />\] 匹配"]"&lt;br&gt;<br /><br />\* 匹配"*"&lt;br&gt;<br /><br />\+ 匹配"+"&lt;br&gt;<br /><br />\? 匹配"?"&lt;br&gt;<br /><br />\b 匹配响铃字符,使计算机发出嘟的一声.&lt;br&gt;<br /><br />\t 制表符号&lt;br&gt;<br /><br />\n 换行符号&lt;br&gt;<br /><br />\r 回车符铪&lt;br&gt;<br /><br />\s 任意空格&lt;br&gt;<br /><br />\xnn 匹配16进制为nn的字符&lt;br&gt;<br /><br />\0nn 匹配8进制的nn字符&lt;br&gt;<br /><br />这些表达式均以\开始, 与C++的转义字符相同,所以为了定义QRegExp中的一个转义序列,&lt;br&gt;<br /><br />需要在前面添加两个\\</div><img src ="http://www.cppblog.com/zhonghua/aggbug/179588.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhonghua/" target="_blank">米米</a> 2012-06-21 10:55 <a href="http://www.cppblog.com/zhonghua/archive/2012/06/21/179588.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>QT 定时器使用</title><link>http://www.cppblog.com/zhonghua/archive/2012/06/20/179477.html</link><dc:creator>米米</dc:creator><author>米米</author><pubDate>Wed, 20 Jun 2012 02:27:00 GMT</pubDate><guid>http://www.cppblog.com/zhonghua/archive/2012/06/20/179477.html</guid><wfw:comment>http://www.cppblog.com/zhonghua/comments/179477.html</wfw:comment><comments>http://www.cppblog.com/zhonghua/archive/2012/06/20/179477.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhonghua/comments/commentRss/179477.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhonghua/services/trackbacks/179477.html</trackback:ping><description><![CDATA[<div><pre>1.<div><pre> QTimer *timer = new QTimer( myObject );<br />&nbsp;<a href="http://www.kuqin.com/qtdocument/qobject.html#connect">connect</a>( timer, SIGNAL(<a href="http://www.kuqin.com/qtdocument/qtimer.html#timeout">timeout</a>()), myObject, SLOT(timerDone()) );<br />&nbsp;timer-&gt;<a href="http://www.kuqin.com/qtdocument/qtimer.html#start">start</a>( 2000, TRUE ); // 2秒单触发定时器</pre></div> QTimer *t = new QTimer( myObject ); <br /><a href="http://www.kuqin.com/qtdocument/qobject.html#connect">connect</a>( t, SIGNAL(<a href="http://www.kuqin.com/qtdocument/qtimer.html#timeout">timeout</a>()), SLOT(processOneThing()) );<br />&nbsp;t-&gt;<a href="http://www.kuqin.com/qtdocument/qtimer.html#start">start</a>( 2000, FALSE ); // 2秒单触发定时器<br /><br />2.void QTimer::singleShot ( int&nbsp;msec, <a href="http://www.kuqin.com/qtdocument/qobject.html">QObject</a>&nbsp;*&nbsp;receiver, const&nbsp;char&nbsp;*&nbsp;member )<tt> [静态]</tt> <br />QTimer::<a href="http://www.kuqin.com/qtdocument/qtimer.html#singleShot">singleShot</a>( 10*60*1000, &amp;a, SLOT(<a href="http://www.kuqin.com/qtdocument/qapplication.html#quit">quit</a>()) );<br /><br /></pre></div><img src ="http://www.cppblog.com/zhonghua/aggbug/179477.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhonghua/" target="_blank">米米</a> 2012-06-20 10:27 <a href="http://www.cppblog.com/zhonghua/archive/2012/06/20/179477.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>QT右键菜单的添加（转帖）</title><link>http://www.cppblog.com/zhonghua/archive/2012/06/01/177082.html</link><dc:creator>米米</dc:creator><author>米米</author><pubDate>Fri, 01 Jun 2012 08:25:00 GMT</pubDate><guid>http://www.cppblog.com/zhonghua/archive/2012/06/01/177082.html</guid><wfw:comment>http://www.cppblog.com/zhonghua/comments/177082.html</wfw:comment><comments>http://www.cppblog.com/zhonghua/archive/2012/06/01/177082.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhonghua/comments/commentRss/177082.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhonghua/services/trackbacks/177082.html</trackback:ping><description><![CDATA[<div><div id="BlogArticleDetail" style="font-size:14px;"><p>QWidget及其子类都可有右键菜单，因为QWidget有以下两个与右键菜单有关的函数：</p> <p>Qt::ContextMenuPolicy contextMenuPolicy () const </p> <p>void setContextMenuPolicy ( Qt::ContextMenuPolicy policy ) </p> <p>Qt::ContextMenuPolicy枚举类型包括：Qt::DefaultContextMenu,  Qt::NoContextMenu, Qt::PreventContextMenu, Qt::ActionsContextMenu, and  Qt::CustomContextMenu。<br /></p> <p>使用方式如下：</p> <p><br /><strong>1）默认是Qt::DefaultContextMenu。</strong><br />它 是利用右键菜单事件contextMenuEvent()来处理（which means the contextMenuEvent()  handler is called)。就是要重写contextMenuEvent( QContextMenuEvent * event )函数。</p> <p><br /><strong>2）使用Qt::CustomContextMenu。</strong><br />它是发出QWidget::customContextMenuRequested信号，注意仅仅只是发信号，意味着要自己写显示右键菜单的slot。<br />这个信号是QWidget唯一与右键菜单有关的信号（也是自有的唯一信号），同时也是很容易被忽略的signal：</p> <p>void customContextMenuRequested ( const QPoint &amp; pos ) </p> <p>该信号的发出条件是：用户请求contextMenu（常规就是鼠标右击啦）且同时被击的widget其contextMenuPolicy又是Qt::CustomContextMenu。<br />注 意：pos是该widget接收右键菜单事件的位置，一般是在该部件的坐标系中。但是对于QAbstratScrollArea及其子类例外，是对应着其 视口viewport()的坐标系。如常用的QTableView、QHeaderView就是QAbstratScrollArea的子类。<br />因为仅发信号，所以需自己写显示右键菜单的slot来响应，例如一个表格（QTableView类型）表头的显示右键菜单槽：<br />datatable-&gt;horizontalHeader()-&gt;setContextMenuPolicy(Qt::CustomContextMenu);<br />connect(datatable-&gt;horizontalHeader(), SIGNAL(customContextMenuRequested(const QPoint&amp;)), <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this, SLOT(show_contextmenu(const QPoint&amp;)));//this是datatable所在窗口<br />QMenu *cmenu = NULL;<br />show_contextmenu(const QPoint&amp; pos)<br />{<br />&nbsp;&nbsp;&nbsp; if(cmenu)//保证同时只存在一个menu，及时释放内存<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delete cmenu;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cmenu = NULL;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; QMenu cmenu = new QMenu(datatable-&gt;horizontalHeader());<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; QAction *ascendSortAction = cmenu-&gt;addAction("升序");<br />&nbsp;&nbsp;&nbsp; QAction *descendSortAction = cmenu-&gt;addAction("降序");<br />&nbsp;&nbsp;&nbsp; QAction *filterAction = cmenu-&gt;addAction("过滤");<br />&nbsp;&nbsp;&nbsp; QAction *reshowAction = cmenu-&gt;addAction("重载");<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; connect(ascendSortAction, SIGNAL(triggered(bool)), this, SLOT(sort_ascend()));<br />&nbsp;&nbsp;&nbsp; connect(descendSortAction, SIGNAL(triggered(bool)), this, SLOT(sort_descend()));<br />&nbsp;&nbsp;&nbsp; connect(filterAction, SIGNAL(triggered(bool)), this, SLOT(show_filter_dlg()));<br />&nbsp;&nbsp;&nbsp; connect(reshowAction, SIGNAL(triggered(bool)), this, SLOT(reshow_data()));<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; cmenu-&gt;exec(QCursor::pos());//在当前鼠标位置显示<br />&nbsp;&nbsp;&nbsp; //cmenu-&gt;exec(pos)是在viewport显示<br />}</p> <p>也可先做好cmenu，好处是始终使用一个：<br />&nbsp;&nbsp;&nbsp; QMenu cmenu = new QMenu(datatable-&gt;horizontalHeader());<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; QAction *ascendSortAction = cmenu-&gt;addAction("升序");<br />&nbsp;&nbsp;&nbsp; QAction *descendSortAction = cmenu-&gt;addAction("降序");<br />&nbsp;&nbsp;&nbsp; QAction *filterAction = cmenu-&gt;addAction("过滤");<br />&nbsp;&nbsp;&nbsp; QAction *reshowAction = cmenu-&gt;addAction("重载");<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; connect(ascendSortAction, SIGNAL(triggered(bool)), this, SLOT(sort_ascend()));<br />&nbsp;&nbsp;&nbsp; connect(descendSortAction, SIGNAL(triggered(bool)), this, SLOT(sort_descend()));<br />&nbsp;&nbsp;&nbsp; connect(filterAction, SIGNAL(triggered(bool)), this, SLOT(show_filter_dlg()));<br />&nbsp;&nbsp;&nbsp; connect(reshowAction, SIGNAL(triggered(bool)), this, SLOT(reshow_data()));<br />show_contextmenu(const QPoint&amp; pos)<br />{<br />&nbsp;&nbsp;&nbsp; if(cmenu)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cmenu-&gt;exec(QCursor::pos());<br />&nbsp;&nbsp;&nbsp; }<br />}</p> <p><br /><strong>3）使用Qt::ActionsContextMenu。<br /></strong>把部件的所有action即QWidget::actions()作为context menu显示出来。<br />还是上面的例子，要在表格（QTableView类型）表头显示右键菜单：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QAction *ascendSortAction = new QAction("升序", this);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QAction *descendSortAction = new QAction("降序", this);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QAction *filterAction = new QAction("过滤", this);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QAction *unfilterAction = new QAction("取消过滤", this);<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; connect(ascendSortAction, SIGNAL(triggered(bool)), this, SLOT(sort_ascend()));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; connect(descendSortAction, SIGNAL(triggered(bool)), this, SLOT(sort_descend()));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; connect(filterAction, SIGNAL(triggered(bool)), this, SLOT(filter_table()));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; connect(unfilterAction, SIGNAL(triggered(bool)), this, SLOT(unfilter_table()));<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; datatable-&gt;horizontalHeader()-&gt;addAction(ascendSortAction);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; datatable-&gt;horizontalHeader()-&gt;addAction(descendSortAction);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; datatable-&gt;horizontalHeader()-&gt;addAction(filterAction);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; datatable-&gt;horizontalHeader()-&gt;addAction(unfilterAction);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; datatable-&gt;horizontalHeader()-&gt;setContextMenuPolicy(Qt::ActionsContextMenu);</p> <p>另外两个就是不显示context menu了：<br />Qt::NoContextMenu<br />&nbsp;&nbsp;&nbsp; the widget does not feature a context menu, context menu handling is deferred to the widget's parent.<br />&nbsp;&nbsp;&nbsp; <br />Qt::PreventContextMenu<br />&nbsp;&nbsp;&nbsp;  the widget does not feature a context menu, and in contrast to  NoContextMenu, the handling is not deferred to the widget's parent. This  means that all right mouse button events are guaranteed to be delivered  to the widget itself through mousePressEvent(), and  mouseReleaseEvent().</p> <p><strong>补充：</strong><br />&nbsp;&nbsp;&nbsp;  使用Qt::ActionsContextMenu比较简洁，但是如果需要根据当前菜单弹出的位置来定义不同菜单，或者像上个例子，在表格 （QTableView类型）表头显示右键菜单时，我需要知道是哪一列表头被点击，从而在后来调用sort_ascend()排序函数时能够根据不同列进 行不同排序策略，那么Qt::ActionsContextMenu就做不到了。<br />&nbsp;&nbsp;&nbsp;  这种需要捕捉弹出位置的情况只好用Qt::ActionsContextMenu了，customContextMenuRequested (  const QPoint &amp; pos  )信号返回点击位置pos（在表头视口坐标系中位置），然后表头即可调用logicalIndexAt(pos)函数得到被点击section对应的 index即被点击部分的列号，然后存下来可供后面action激活的排序槽使用。<br />show_contextmenu(const QPoint&amp; pos)<br />{<br />&nbsp;&nbsp;&nbsp; //get related column of headerview<br />&nbsp;&nbsp;&nbsp; contextmenu_column = datatable-&gt;horizontalHeader()-&gt;logicalIndexAt(pos);</p> <p>&nbsp;&nbsp;&nbsp; //show contextmenu<br />&nbsp;&nbsp;&nbsp; if(cmenu)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cmenu-&gt;exec(QCursor::pos());<br />&nbsp;&nbsp;&nbsp; }<br />}</p></div></div><img src ="http://www.cppblog.com/zhonghua/aggbug/177082.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhonghua/" target="_blank">米米</a> 2012-06-01 16:25 <a href="http://www.cppblog.com/zhonghua/archive/2012/06/01/177082.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转 Qt 常用命令 常用宏</title><link>http://www.cppblog.com/zhonghua/archive/2012/05/30/176710.html</link><dc:creator>米米</dc:creator><author>米米</author><pubDate>Wed, 30 May 2012 01:49:00 GMT</pubDate><guid>http://www.cppblog.com/zhonghua/archive/2012/05/30/176710.html</guid><wfw:comment>http://www.cppblog.com/zhonghua/comments/176710.html</wfw:comment><comments>http://www.cppblog.com/zhonghua/archive/2012/05/30/176710.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhonghua/comments/commentRss/176710.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhonghua/services/trackbacks/176710.html</trackback:ping><description><![CDATA[<div><div> qmake 常用命令：</div> <div>qmake -project //生成pro文件，自动检查c/c++程序文件<br /> 　　 qmake -tp vc //根据pro文件生成vc的工程文件，qt commericial有一个绑定到vs的工具，可以在菜单栏直接打开<br /> 　　 qmake -r xxx.pro "CONFIG+=debug" //递归生成makefile<br /> 　　 moc //包含Q_OBJECT文件转换器<br /> 　　 rcc //Qt resource compiler<br /> 　　 uic //Qt ui file translator,to .h file.</div> &nbsp; <div> Qt 常用宏：</div> <div>　　 平台相关<br /> 　　 Q_WS_WIN //window系统<br /> 　　 Q_WS_X11 //xwindow系统<br /> 　　 Q_WS_MAC //苹果mac系统<br /> 　　 Q_WS_SOL //sun的solaris系统<br /> 　　 其它<br /> 　　 QT_OPENGL_SUPPORT //是否支援opengl<br /> 　　 QT_VERSION　　　　//qt的版本，如 if QT_VERSION &gt; 0x040601(qt &gt; 4.6.1)<br /> 　　 QT_VERSION_STR //qt版本的字符串<br /> 　　 QT_POINTER_SIZE //指针的字节宽度 32bit=4,64bit=8<br /> 　　 QT_REQUIRE_VERSION //用在代码中，比如QT_REQUIRE_VERSION(argc, argv, "4.0.2");</div> <div>    global常用函数</div> <div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;        T qAbs(const T &amp; value) //返回绝对值<br /> 　　 void qCritical(const char * msg, ...) //输出告警信息&nbsp; 参赛类似printf<br /> 　　 void qDebug(const char * msg, ... ) // 输出调试信息<br /> 　　 void qFatal(const char * msg, ... ) //输出错误信息<br /> 　　 qMax(const T &amp; value1,const T &amp; value2 )// 求最大<br /> 　　 qMin(const T &amp; value1,const T &amp; value2 ) // 求最小</div> <div> pro 文件格式</div> <div>#: 表示到行尾均为注视，被忽略<br /> 　　include: 可以包含别的文本文件，一般为*pri 例如 #include "../global.pri"<br /> 　　scope{;;}: 预定义 ，如win32{} 表示在win32平台下的定义，其它忽略<br /> 　　win32/unix/linux-g++/linux-g++-64: 平台宏<br /> 　　DESTDIR: 产生目标文件路径<br /> 　　MOC_DIR: moc转换文件路径<br /> 　　RCC_DIR: 资源文件路径<br /> 　　UI_DIR：ui文件转换的路径<br /> 　　LIBEXT: 产生lib的后缀<br /> 　　QMAKE_CFLAGS_DEBUG:<br /> 　　QMAKE_CXXFLAGS_DEBUG:<br /> 　　QMAKE_CFLAGS_RELEASE:<br /> 　　QMAKE_CXXFLAGS_RELEASE:<br /> 　　TEMPLATE: 决定生成makefile采用的模板，<br /> 　　 =lib 表示库文件<br /> 　　 =app 表示生成可执行文件<br /> 　　 =subdirs 表示处理子目录（在下面用SUBDIRS += **来指定那些子目录）<br /> 　　TARGET: 指定目标文件名<br /> 　　Qt+=: 添加额外的模块支持，例如Qt -= QtCore;Qt += network,phonon,xml，thread<br /> 　　DEFINES: 添加额外的宏定义，如win下需要的export等<br /> 　　DEPENDPATH: 添加以来的路径<br /> 　　INCLUDEPATH： 添加头文件包含路径<br /> 　　HEADERS： 需要包含的头文件<br /> 　　SOURCES： 需要包含的源文件<br /> 　　FORMS： 需要包含的ui文件<br /> 　　RESOURCES：需要包含的资源文件<br /> 　　LIBS：依赖库的路径和名称 -L{xxdirxx} -l{xxnamexx}<br /> 　　CONFIG: 添加配置，如warn_on debug_and_release plugin<br /> 　　TRANSLATIONS: 多国语言支持文件<br /> 　　INSTALLS: 要安装的文件<br /> 　　target.path: 安装的路径<br /> 　　#在pro文件支持environment variables和自定义变量<br /> 　　#如sources.file += $$SOURCES $$HEADERS<br /> 　　#sources.path = $$DESTIN_DIR<br /> 　　#INSTALLS += target source<br /> 　　defineReplace(xxx): xxx为变量 ，此函数可以返回一个变量值如:$$xxx()<br /> exists(file1,file2){error()}:检查文件是否存在</div> &nbsp; </div><img src ="http://www.cppblog.com/zhonghua/aggbug/176710.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhonghua/" target="_blank">米米</a> 2012-05-30 09:49 <a href="http://www.cppblog.com/zhonghua/archive/2012/05/30/176710.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>