??xml version="1.0" encoding="utf-8" standalone="yes"?>久久久久免费精品国产,久久免费国产精品一区二区,人妻少妇久久中文字幕http://www.shnenglu.com/zhonghua/category/18897.htmlzh-cnWed, 11 Dec 2013 09:34:50 GMTWed, 11 Dec 2013 09:34:50 GMT60[转]一U用QThreadU程的新ҎQObject::moveToThreadhttp://www.shnenglu.com/zhonghua/archive/2013/12/11/204717.htmlc米c米Wed, 11 Dec 2013 09:08:00 GMThttp://www.shnenglu.com/zhonghua/archive/2013/12/11/204717.htmlhttp://www.shnenglu.com/zhonghua/comments/204717.htmlhttp://www.shnenglu.com/zhonghua/archive/2013/12/11/204717.html#Feedback0http://www.shnenglu.com/zhonghua/comments/commentRss/204717.htmlhttp://www.shnenglu.com/zhonghua/services/trackbacks/204717.html阅读全文

c米 2013-12-11 17:08 发表评论
]]>
QTableView和QTableWidget页功能实现http://www.shnenglu.com/zhonghua/archive/2013/11/17/204288.htmlc米c米Sun, 17 Nov 2013 09:15:00 GMThttp://www.shnenglu.com/zhonghua/archive/2013/11/17/204288.htmlhttp://www.shnenglu.com/zhonghua/comments/204288.htmlhttp://www.shnenglu.com/zhonghua/archive/2013/11/17/204288.html#Feedback0http://www.shnenglu.com/zhonghua/comments/commentRss/204288.htmlhttp://www.shnenglu.com/zhonghua/services/trackbacks/204288.html

 转自Q?a style="text-decoration: none; color: #084487;">http://indure.chinaunix.com/space.php?uid=25520556&do=blog&id=2211406

       主要使用QTableView和QTableWidget中的三个函数实现

QTableViewQ:verticalScrollBar()->setSliderPosition()Q?span style="word-wrap: normal; word-break: normal; line-height: 18px;">  //讄当前滑动条的位置

QTableViewQ:verticalScrollBar()->maximum();             //滑动条能Ud的最大位|?/span>

QTableViewQ:verticalScrollBar()->value();                   //获得当前滑动条的位置

 

 

  1. static int nCurScroller=0; //页时的当时滑动条位|?br />
  2. static int pageValue = 10; // 一|C条?br />

  3. void SplayHisForm::createHisForm()
  4. {
  5.                 …….
  6.     hisTableWidget = new QTableWidget;
  7.     hisTableWidget->setSelectionMode(QAbstractItemView::SingleSelection);
  8.     hisTableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
  9.             …….
  10. }

  11. /***下一?span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">***/
  12. void SplayHisForm::nextPageHis()
  13. {
  14.     int maxValue = hisTableWidget->verticalScrollBar()->maximum(); // 当前SCROLLER最大显C?5
  15.     nCurScroller = hisTableWidget->verticalScrollBar()->value(); //获得当前scroller?br />

  16.     if(nCurScroller<maxValue)
  17.         hisTableWidget->verticalScrollBar()->setSliderPosition(pageValue+nCurScroller);
  18.     else
  19.         hisTableWidget->verticalScrollBar()->setSliderPosition(0);
  20. }

  21. /***上一?span style="word-wrap: normal; word-break: normal; line-height: 21px; color: #0000cc;">***/
  22. void SplayHisForm::prePageHis()
  23. {
  24.     int maxValue = hisTableWidget->verticalScrollBar()->maximum(); // 当前SCROLLER最大显C?5
  25.     nCurScroller = hisTableWidget->verticalScrollBar()->value();

  26.     if(nCurScroller>0)
  27.         hisTableWidget->verticalScrollBar()->setSliderPosition(nCurScroller-pageValue);
  28.     else
  29.         hisTableWidget->verticalScrollBar()->setSliderPosition(maxValue);
  30. }

 QTableView和QTableWidget页功能实现



c米 2013-11-17 17:15 发表评论
]]>
差点忘了。记录一下。关于QT国际?/title><link>http://www.shnenglu.com/zhonghua/archive/2013/09/12/203192.html</link><dc:creator>c米</dc:creator><author>c米</author><pubDate>Thu, 12 Sep 2013 07:59:00 GMT</pubDate><guid>http://www.shnenglu.com/zhonghua/archive/2013/09/12/203192.html</guid><wfw:comment>http://www.shnenglu.com/zhonghua/comments/203192.html</wfw:comment><comments>http://www.shnenglu.com/zhonghua/archive/2013/09/12/203192.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/zhonghua/comments/commentRss/203192.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/zhonghua/services/trackbacks/203192.html</trackback:ping><description><![CDATA[vs生成的工E??<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 -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;">然后命o行输入lupdate ***.pro<br />打开.ts文gQ一条一条的译是?br />最后lrelease ***.pro</pre></div><br /></span></div><img src ="http://www.shnenglu.com/zhonghua/aggbug/203192.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/zhonghua/" target="_blank">c米</a> 2013-09-12 15:59 <a href="http://www.shnenglu.com/zhonghua/archive/2013/09/12/203192.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Qt Tooltip详解 http://www.shnenglu.com/zhonghua/archive/2013/06/05/200817.htmlc米c米Wed, 05 Jun 2013 08:41:00 GMThttp://www.shnenglu.com/zhonghua/archive/2013/06/05/200817.htmlhttp://www.shnenglu.com/zhonghua/comments/200817.htmlhttp://www.shnenglu.com/zhonghua/archive/2013/06/05/200817.html#Feedback0http://www.shnenglu.com/zhonghua/comments/commentRss/200817.htmlhttp://www.shnenglu.com/zhonghua/services/trackbacks/200817.htmlQt4中的tooltip与win32中的tooltip有很多不一L地方Q下面来ȝ一下?br />
一是不能直在堆或栈中生成QToolTip对象。因为其构造函CؓU有?br />二是从widget获取的tooltip不是tooltip对象Q而是tooltip中的文本?br />三是tooltip跟本不是一个widget。所以不把它当作widget用?br />四是tooltipcL一个静态类Q所以跟本不必生成tooltip对象可以用?br />五是tooltipcM能被定制Q所以不能从它生各UŞ状的tooltipH口?br />
QtoolTip有两U用方式:
一是静态tooltip。比如ؓ一个widget讄一个不变的tooltip文本Q当鼠标UML昄tooltip。此时很单,只需调用widget的setToolTip()讄文本卛_?br />二是动态tooltip。也是一个widget上的tooltip是变化的。此旉要重写QWidget::event()函数Q在里面判断事gcdQ如果是QEvent::ToolTipQ则控制昄的文本的内容Q即可实现动态tooltip?br />

看如下代码示例:

  1. bool SortingBox::event(QEvent *event)  
  2.  {  
  3.      if (event->type() == QEvent::ToolTip) {  
  4.          QHelpEvent *helpEvent = static_cast<QHelpEvent *>(event);  
  5.          int index = itemAt(helpEvent->pos());  
  6.          if (index != -1) {  
  7.              QToolTip::showText(helpEvent->globalPos(), shapeItems[index].toolTip());  
  8.          } else {  
  9.              QToolTip::hideText();  
  10.              event->ignore();  
  11.          }  
  12.   
  13.          return true;  
  14.      }  
  15.      return QWidget::event(event);  
  16.  }  
可以看到Q是调用 QtoolTip::showText()在某个位|显Ctooltip文本?br />
那么Q如果想随时昄tooltipQ该怎么做呢Q其实十分简单:直接调用QToolTip::showText()Q指定要昄的位|就行了。因为tooltipcȝ函数跟本q当于全局函数而已?br />
呵呵Q其实很单,但从win32转过来的人,觉得真别扭?/div>

c米 2013-06-05 16:41 发表评论
]]>
QT4 thread和QObject关系详解 http://www.shnenglu.com/zhonghua/archive/2013/06/05/200816.htmlc米c米Wed, 05 Jun 2013 08:40:00 GMThttp://www.shnenglu.com/zhonghua/archive/2013/06/05/200816.htmlhttp://www.shnenglu.com/zhonghua/comments/200816.htmlhttp://www.shnenglu.com/zhonghua/archive/2013/06/05/200816.html#Feedback0http://www.shnenglu.com/zhonghua/comments/commentRss/200816.htmlhttp://www.shnenglu.com/zhonghua/services/trackbacks/200816.htmlQThread从QObjectz。它发出信号来表明线E开始了或结束了。ƈ且也提供了几个槽?br />
更有的是,QObject可以在多个程中同时用,可以发出信号l另外线E的槽,以及?#8220;zd”另外U程中的对象邮寄事g。以上之所以能发生Q是因ؓ每个初程都被允许拥有它自q事g循环?br />

QObject 重入

QObject 是可重入的。它大多数非界面zc,比如QTimer,QTcpSocket,QFtp,和QProcessQ也都是可重入的Q得在多个U程中同时?q些cL为可能。但是注意这些类被设计ؓ在一个线E中创徏和用;在一个线E中创徏一个对象然后在另一个线E中调用它的Ҏ是不能保证一定能工作的。有?个限制条件要注意Q?br /> QObject的儿子必d创徏它爹的线E中创徏。这表示Q你永远不能QThread对象(this)作ؓparent传给在此thread创徏的对象,因ؓU程对象自己是在另一个线E中创徏的?br /> 事g驱动的对象应该只用于一个线E中。这一条尤其应用于定时器和|络模块。比如,你不能在创徏对象之外的线E中启动一个定时器或连接一个socket?br /> 你必M证在U程中创建的一切对象在QThread被删除之前被删除。这可以通过在你的run()实现中在中创徏对象来轻松搞定?br />
管QObject是可重入的,但GUIc,其是QWidget和它所有的zcMQ都不是可重入的。它们只能在ȝE中使用。QCoreApplication::exec()必须在这个线E中调用?br />
在实际应用中Q最好的方式是把耗时的计放CU程中外q行Q完成后通知ȝE显C结果?br />

Pre-Thread Event循环

?个线E都可以有它自己的事件@环。初始的U程使用QCoreApplication::exec()来开始它的事件@环;其它的线E可以?QThread::exec()来启动@环。就像QCoreApplicationQQThread也提供了一个exit(int)Ҏ和一?quit()槽?br />
U程中的事g循环使得在线E中使用依靠消息循环的非GUI的QTcL为可能(比如QTimer,QTcpSocket,QProcessQ。它也得从MU程q接信号C个线E的槽成为可能。这在下面的“信号和槽I越U程”一节中有详l解释?br />
一个QObject实例在那个线E中创徏Q就叫做“z?#8221;在那个线E中。给q个对象的事件们通过U程的事件@环派发。一个QObject对象所“zd”的线E通过QObject::thread()可以取得?br />
?意在QApplication之前创徏的QObject调用QObject::thread()会返?.q意味着ȝE将只ؓq些对象处理邮寄的事Ӟ 对于没有U程的对象,其它的事件处理跟本不会发生。用QObject::moveToThread()Ҏ来改变对象(和它儿子们)的线E(如果一个对 象有爹,它就不能被移动到另外U程Q?br />
在拥有对象之外的U程中调用删除对象是不安全的Q除非你能保证在被删除时不在处理事g。但可以使用 QObject::deleteLater()Q它会寄出DeferedDelete事gQ对象的U程的事件@环最l会抓住它。默认下Q拥?Qobject的线E就是创建QObject的线E,但在QObject::moveToTread()之后变了?br />
如果没有事g循环Q事件将不能传给对象。比如,如果你在一个线E中创徏一个QTimer对象Q但是没有再调用exec()Q那么QTimer永不能触发timeout()信号。deleteLater()也不再能工作。(q些也同样适用于主U程。)

你可以在MU程中用QCoreApp:postEvent()手动向Q何对象邮寄事件。事件将被对象所在线E的事g循环自动z֏?br />
?件过滤器被所有的U程所支持Q但有个限制条gQ监视对象必M被监视对象位于同一个线E中。同?的,QCoreApplication::sendEvent()Q不同于 QCoreApplication::postEvent()Q只能在同一U程中的对象之间发送事件?br />

从另外线E访问QObject子类


QObject和它所有的子类都不是线E安全的Q这也包含整个事件派送系l。要CQ当你从另外U程讉K对象Ӟ事g循环可能zN事件到你的QObject子类?br />
如果你调用一个非本线E的QObject的子cȝ函数q且q个对象可能接收事gQ你必须用mutex保护所有对你的QObject子类的内部数据的讉KQ否则,你可能体验的什么叫崩溃?br />
像其它对象QQThread对象“z?#8221;在创建它的线E中Q而不是它自己所代表的线E中。通常在你的QThread子类中提供槽是不安全的,除非你用mutex保护成员变量?br />
另一斚wQ你可以从你的QThread tun()中安全的发出信号Q因Z号发是U程安全的?br />

I越U程的信号和槽们


Qt支持如下信号Q槽q接cdQ?br /> 自动q接Q默认)Q 如果信号是从接收对象所在的U程发出的,其行Z“直接q接”相同。否则,其行Z“队列q接”相同?br /> 直接q接Q 当信号发出,槽会被立马调用。此槽在发出者的U程中执行,而不一定是接收者所在的U程?br /> 队列q接Q 当控制返回到接收者所在线E的事g循环时调用。槽在接收者的U程中执行?br /> d的队列连接- 槽像“队列q接”那样被调用,除了一点:当前U程会阻塞住直到槽返回。注Q在同一U程中用此cd的连接将D死锁Q?br /> 唯一q接Q 行ؓ?#8220;自动q接”相同Q但q接必须在无复制品时才能建立。也是Q如果在相同的两个对象之间已l徏立了同一个信号到同一个槽的连接,那么q接׃能徏立,connect()q回false?br />
q接cd可以通过lconnect()传递一个额外的参数来指定。注意当接收者和发送者位于不同的U程中时Q?#8220;直接q接”Q如果事件@环是q行于接收者的U程中,此时是不安全的,同理调用位于另外U程的对象的M函数都是不安全的?br />
QObject::connect()本n是线E安全的?/div>

c米 2013-06-05 16:40 发表评论
]]>
Qt 动画详解?http://www.shnenglu.com/zhonghua/archive/2013/06/05/200815.htmlc米c米Wed, 05 Jun 2013 08:40:00 GMThttp://www.shnenglu.com/zhonghua/archive/2013/06/05/200815.htmlhttp://www.shnenglu.com/zhonghua/comments/200815.htmlhttp://www.shnenglu.com/zhonghua/archive/2013/06/05/200815.html#Feedback0http://www.shnenglu.com/zhonghua/comments/commentRss/200815.htmlhttp://www.shnenglu.com/zhonghua/services/trackbacks/200815.html

动M弄到一?/strong>


一个应用通常包含不止一个动甅R例如,你可能想同时Ud多个囑Şitem也可能顺序的一个接一个的Ud?br />QanimationGroup 的子cM(QSequentialAnimationGroup和QParallelAnimationGroup)是其它动ȝ容器Q所以这些动L?以ƈ行也可以串行。QAnimationGroup是一个非属性动ȝ例子Q但是它定期的收到时间改变的通知。这使得它可以把旉改变传输l所包含的动?们,从而控制何时播N些动M?br />
让我们看一下用QSequentialAnimatoinGroup和QParallelAnimationGroup的代码示例?br />QPushButton *bonnie = new QPushButton("Bonnie");
bonnie->show();
QPushButton *clyde = new QPushButton("Clyde");
clyde->show();
QPropertyAnimation *anim1 = new QPropertyAnimation(bonnie, "geometry");
// Set up anim1
QPropertyAnimation *anim2 = new QPropertyAnimation(clyde, "geometry");
// Set up anim2
QParallelAnimationGroup *group = new QParallelAnimationGroup;
group->addAnimation(anim1);
group->addAnimation(anim2);
group->start();
一个ƈ行group在同一时刻播放多个动画。对start()的调用将启动它所l治的所有的动画?br />
QPushButton button("Animated Button");
button.show();
QPropertyAnimation anim1(&button, "geometry");
anim1.setDuration(3000);
anim1.setStartValue(QRect(0, 0, 100, 30));
anim1.setEndValue(QRect(500, 500, 100, 30));
QPropertyAnimation anim2(&button, "geometry");
anim2.setDuration(3000);
anim2.setStartValue(QRect(500, 500, 100, 30));
anim2.setEndValue(QRect(1000, 500, 100, 30));
QSequentialAnimationGroup group;
group.addAnimation(&anim1);
group.addAnimation(&anim2);
group.start();
QsequentialAnimationGroup序的播攑֮的动M。它在上一个完成时按顺序播放下一个?br />

既然一个动ȝ本就是一个动ȝQ你可以把它d到其它组中。如此,你可以徏立v一个动L?br />


动画和状?/strong>
?使用状态机Q我们可以用一个QSignalTransition或QEventTransitioncd状态{换时q接一个或多个动画。这些类都是?QAbstractTransitionz的,它们定义了简易的函数addAnimation()Q得能够添加一个或多个动画Q在状态{换时启动q些 动画?br />
我们q可能连接属性与状态,而不是手动设|开始与l束倹{下面是完整的代码,演示了动M个QPushButton的geometry属性?br />
QPushButton *button = new QPushButton("Animated Button");
button->show();
QStateMachine *machine = new QStateMachine;
QState *state1 = new QState(machine);
state1->assignProperty(button, "geometry", QRect(0, 0, 100, 30));
machine->setInitialState(state1);
QState *state2 = new QState(machine);
state2->assignProperty(button, "geometry", QRect(250, 250, 100, 30));
QSignalTransition *transition1 = state1->addTransition(button,
SIGNAL(clicked()), state2);
transition1->addAnimation(new QPropertyAnimation(button, "geometry"));
QSignalTransition *transition2 = state2->addTransition(button,
SIGNAL(clicked()), state1);
transition2->addAnimation(new QPropertyAnimation(button, "geometry"));
machine->start();

c米 2013-06-05 16:40 发表评论
]]>
Qt 动画详解一 http://www.shnenglu.com/zhonghua/archive/2013/06/05/200814.htmlc米c米Wed, 05 Jun 2013 08:39:00 GMThttp://www.shnenglu.com/zhonghua/archive/2013/06/05/200814.htmlhttp://www.shnenglu.com/zhonghua/comments/200814.htmlhttp://www.shnenglu.com/zhonghua/archive/2013/06/05/200814.html#Feedback0http://www.shnenglu.com/zhonghua/comments/commentRss/200814.htmlhttp://www.shnenglu.com/zhonghua/services/trackbacks/200814.html

概述

Qt动画架构中的主要cd下图所C:



动画框架由基c?/span>QAbstractAnimation和它的两个儿?/span>QVariantAnimation?/span>QAnimationGroupl成?/span>QAbstractAnimation是所有动ȝ的祖宗。它包含了所有动ȝ基本属性。比如开始,停止和暂停一个动ȝ能力。它也可以接收时间改变通知?/span>


动画框架又进一步提供了QProertyAnimationcR它l承?/span>QVariantAnimationq对某个Qt属性(它须?/span>Qt?#8221;元数据对象系l?#8221;的一部分Q见http://blog.csdn.net/nkmnkm/article/details/8225089Q执行动甅R此cd属性执行一个宽松曲U插倹{所以当你想dM个值时Q你可以把它声明Z个属性,q且让你的类成ؓ一?/span>QObject。这l予我们极大的自由度来动画那些已存在?/span>widget和其?/span>QObject?/span>


复杂的动d以通过建立一?/span>QAbstractAnimation的树来构建。这个树通过使用QAnimationGroups来创建,QAnimationGroups作ؓ其它动画的容器。注意动ȝ也是?/span>QAbstractAnimationz的,所以动ȝ可以再包含其它动ȝ?/span>


动画框架可以单独使用Q同时也被设计ؓ状态机框架的一部分。状态机提供了一个特定的状态可以用来播攑֊甅R在q入或退出某个状态时QState也可以设|属性们Qƈ且这个特定的动画状态将在指?/span>QPropertyAnimation时给予的g间做插D。后面我们要q一步介l此问题?/span>


在场景的背后Q动画被一个全局定时器收集,q个定时器发?/span>update到所有的正在播放的动M?/span>

动画框架中的cM

QAbstractAnimation

所有动ȝ的基c?/span>

QAnimationGroup

动画l的基类

QEasingCurve

控制动画的宽松曲U类

QParallelAnimationGroup

q行动画l类

QPauseAnimation

串行动画l类的暂停类

QPropertyAnimation

动画Qt属性的c?/span>

QSequentialAnimationGroup

串行动画l类

QTimeLine

控制动画的时间线c?/span>

QVariantAnimation

各动ȝ的虚基类


动画Qt属性们

如前面所ԌQPropertyAnimationcd以修?/span>Qt属性们。要动画一个|需要用此cR实际上Q它的父c,QVariantAnimationQ是一个虚拟类Q不能被直接使用?/span>


我们选择动画Qt属性的一个主要理由是Qt属性ؓ我们提供了自己动d存在的类的自由度。尤其是QWidgetc(我们也可以把它嵌入到一?/span>QGraphicsView中)h很多属性表C其bounds,colors{等。让我们看一个小例子Q?/span>

  1. QPushButton button("Animated Button");  
  2. button.show();  
  3. QPropertyAnimation animation(&button, "geometry");  
  4. animation.setDuration(10000);  
  5. animation.setStartValue(QRect(0, 0, 100, 30));  
  6. animation.setEndValue(QRect(250, 250, 100, 30));  
  7. animation.start();  

q段代码把按钮?/span>10U种内从屏幕的左上角Ud?/span>(250,250)处?/span>

上面的例子D在开始值和l束g间做U性插倹{还可以在开始和l束g间设||插D就会经q这些点?/span>


  1. QPushButton button("Animated Button");  
  2. button.show();  
  3. QPropertyAnimation animation(&button, "geometry");  
  4. animation.setDuration(10000);  
  5. animation.setKeyValueAt(0, QRect(0, 0, 100, 30));  
  6. animation.setKeyValueAt(0.8, QRect(250, 250, 100, 30));  
  7. animation.setKeyValueAt(1, QRect(0, 0, 100, 30));  
  8. animation.start();  

在此例中Q动d按钮?U中内弄?250,250)处,然后?U种内又弄回原位。移位是在这些点中间以线性插D行的?/p>


?也有可能动画一个QObject的|虽然q些值ƈ没有被声明ؓQt属性。唯一的要求就是这个值具有一个setter。之后你可以从这个类z子类从而包 含这些值ƈ且声明一个用这个setter的属性。注意每个Qt属性都需要有一个getterQ所以你需要提供一个getterQ如果它不存在的话?/p>

  1. class MyGraphicsRectItem : public QObject, public QGraphicsRectItem  
  2. {  
  3.     Q_OBJECT  
  4.     Q_PROPERTY(QRectF geometry READ geometry WRITE setGeometry)  
  5. };  

在上例中Q我们派生了QGraphicsRectItemq定义了一个geometry属性。我们现在可以动画这个widget的geometry了,即QGraphicsRectItem没有提供geometry属性?/p>

动画和图形视图框?/span>

当你惛_?/span>QGraphicsItemsQ你也要?/span>QPropertyAnimation。然而,QGraphicsItem不是?/span>QObjectz的。一个好的解x案是z要动ȝ囑Şitem。派生类也要?/span>QObjectz。这PQPropertyAnimation可以被用于QGraphicsItems了?/span>

  1. class Pixmap : public QObject, public QGraphicsPixmapItem  
  2. {  
  3.     Q_OBJECT  
  4.     Q_PROPERTY(QPointF pos READ pos WRITE setPos)  
  5.     ...  

如上一节中所讲的Q我们需要定义希望去动画的属性?/span>

注意Q?/span>QObject必须是承中的第一个,因ؓ元数据对象系l需要这样做?/span>

宽松曲线

QPropertyAnimation在属性的开始值和l束g间执行一个插D。除了向动画d更多的关键值外Q你q可以用一个宽松曲Uѝ宽松曲U描qC一个在0?/span>1之间插值的速度变化的函敎ͼ如果你想控制一个动ȝ速度而不改变插值的路径Ӟ非常有用?/span>


  1. QPushButton button("Animated Button");  
  2. button.show();  
  3. QPropertyAnimation animation(&button, "geometry");  
  4. animation.setDuration(3000);  
  5. animation.setStartValue(QRect(0, 0, 100, 30));  
  6. animation.setEndValue(QRect(250, 250, 100, 30));  
  7. animation.setEasingCurve(QEasingCurve::OutBounce);  
  8. animation.start();  

q里Q动d按照一个曲U进行,q个曲线使得动画像一个蟩动的皮球从开始位|蟩到结束位|?/span>QEasingCurveh一个大曲线集合Q你可以从里面选择一个。它们被定义?/span>QEasingCurve::Type枚D。如果你需要不一L曲线Q你也可以自己实C个,然后注册?/span>QEasingCurve?/span>



c米 2013-06-05 16:39 发表评论
]]>
Qt属性系l详?http://www.shnenglu.com/zhonghua/archive/2013/06/05/200808.htmlc米c米Wed, 05 Jun 2013 01:53:00 GMThttp://www.shnenglu.com/zhonghua/archive/2013/06/05/200808.htmlhttp://www.shnenglu.com/zhonghua/comments/200808.htmlhttp://www.shnenglu.com/zhonghua/archive/2013/06/05/200808.html#Feedback0http://www.shnenglu.com/zhonghua/comments/commentRss/200808.htmlhttp://www.shnenglu.com/zhonghua/services/trackbacks/200808.html

Qt提供了一个绝妙的属性系l。跟那些q译器提供的属性差不多。然而,作ؓ一个独立于~译器和q_的库QQt不依赖于非标准的~译Ҏ,比如 __property 或[property]。Qt可以在Q何^C的标准编译器下编译。Qt属性系l基于元数据对象pȝQ-是那个提供了对象内|信号和槽通讯机制的家伙?br />


声明属性需要什?br />


要声明一个属性,需在承自QObject的类中用Q_PROPERTY()宏?br />Q_PROPERTY(type name
   READ getFunction
   [WRITE setFunction]
   [RESET resetFunction]
   [NOTIFY notifySignal]
   [DESIGNABLE bool]
   [SCRIPTABLE bool]
   [STORED bool]
   [USER bool]
   [CONSTANT]
   [FINAL])

下面是一些典型的声明属性的CZQ?/p>

  1. Q_PROPERTY(bool focus READ hasFocus)  
  2. Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled)  
  3. Q_PROPERTY(QCursor cursor READ cursor WRITE setCursor RESET unsetCursor)  
  • 一个属性的行ؓ像cȝ数据成员Q但是它q具有附加的Ҏ,q些Ҏ可以被元数据对象系l操作。这些特性是Q?br />需要一个READ讉K器函数。用于读属性的倹{理x况下Q有一个不变的函数用于此目的,q且它必返回属性的cd的值或指针或引用。例如,QWidget::focus是一个只ȝ属性,它对应一个读函数QQWidget::hasFocus()?/li>
  • 一 个可选的WRITE讉K器函数。它用于讄属性的倹{它必须q回Iƈ且至具有一个参敎ͼ参数是属性类型的值或指针或引用。例 如:QWidget::enabledhWRITE函数QWidget::setEnable()。只d性不需要写函数。例 如,QWidget::focus没有对应的写函数?/li>
  • 一个可选的RESET函数。用于设|属性的值到它的默认倹{例 如:QWidget::cursorh典型的READ和WRITE函数QQWidget::cursor()?QWidget::setCursor()Qƈ且它也具有一个RESET函数QQWidget::unsetCursor()。RESET函数必须q回 voidq且不带有Q何参数?/li>
  • 一个可选的NOTIFY信号。如果被定义了,信号在属性的值改变时发出。信号必d有一个参敎ͼq个参数的类型必M属性相同;参数保存的是属性的新倹{?/li>
  • 一个DESIGNABLE变量表明此属性是否在界面设计器的属性编辑器中出现。大多数属性是可见的,除了个变量传入true或falseQ你q可以指定一个bool型的成员函数?/li>
  • SCRIPTABLE变量表明q个属性是否可以被一个脚本引擎操作(默认是trueQ。你也可以赋予它true或false或bool型函数?/li>
  • STORED 变量表明了属性是否被认ؓ是独立存在还是依赖于其它的D存在。它也表明是否在保存对象状态时保存此属性的倹{大多数属性都是需要保存的Q但是,?QWidget::minimumWidth()是不被保存的,因ؓ它的值是从另一个属性QWidget::minimumSize()得来的?/li>
  • USER变量表明属性是否被设计为面向用L或用户可修改的类属性。通常Q每个类只有一个USER属性。例如,QAbstractButton::checked是按钮类的用户可修改属性。注意QItemDelegate获取和设|widget的USER属性?/li>
  • CONSTANT的出现表明属性的值是不变的。对于一个object实例Q常量属性的READҎ在每ơ被调用时必返回相同的倹{此帔R值可能在不同的object实例中不相同。一个常量属性不能具有WRITEҎ或NOYIFY信号?/li>
  • FINAL变量的出现表明属性不能被zcL重写。有些情况下Q这可以用于效率优化Q但不是被moc强制的。程序员必须永远注意不能重写一个FINAL属性?br />

READQWRITE和RESET函数都可以被l承。它们也可以是虚函数。当它们在被多重l承中被l承Ӟ它们必须出现在第一个被l承的类中?br />
属性的cd可以是被QVariant支持的所有类型,也可以是用户定义的类型。在下面的例子中Q类QDate被当作用戯定义cd?br /> Q_PROPERTY(QDate data READ getDate WRITE setDate)
因ؓQDate是用户定义的Q你必须包含<QDate>头文件?br />
?于QMap,QList和QValueList属性,属性的值是一个QVariantQ它包含整个list或map。注意Q_PROPERTY字符串不?包含逗号Q因为逗号会划分宏的参数。因此,你必M用QMap作ؓ属性的cd而不是QMap<QString,QVariant>。ؓ了保?一致性,也需要用QList和QValueList而不是QList<QVariant>?QValueList<QVariant>?/p>


通过元数据对象系l读写属?br />

一 个属性可以用常规函数QObject::property()和QObject::setProperty()q行dQ不用知道属性所在类的Q何细 节,除了属性的名字。在下面的小代码片段中,调用QAbstractButton::setDown()和QObject::setProperty() 都把属性设|ؓ“down”?/p>

  1. QPushButton *button = new QPushButton;  
  2. QObject *object = button;  
  3. button->setDown(true);  
  4. object->setProperty("down", true);  

?qWRITE操作器来操作一个属性是上面两者中更好的,因ؓ它快q且在编译时l于更好的诊断帮助,但是以这U方式设|属性要求你必须在编译时了解其类。?q名字来操作属性你可以操作在~译器你不了解的cR你可以在运行时发现一个类的属性们Q通过查询它的QObject,QMetaObject?QMetaProerties?/p>

  1. QObject *object = ...  
  2. const QMetaObject *metaobject = object->metaObject();  
  3. int count = metaobject->propertyCount();  
  4. for (int i=0; i<count; ++i) {  
  5.     QMetaProperty metaproperty = metaobject->property(i);  
  6.     const char *name = metaproperty.name();  
  7.     QVariant value = object->property(name);  
  8.     ...  
  9. }  

在上面的代码片段中,QMetaObject::property()被用于获取未知类中的属性的metadata。从metadata中获取属性名然后传给QObject::property()来获?br />

一个简单例?br />


?设我们有一个类MyClassQ它从QObjectzq且在它的privateZ? 了Q_OBJECT宏。我们想在MyClasscM声明一个属性来持箋q踪一个Priorty倹{属性的值叫做priorityQƈ且它的类型是一个在c?MyClass中定义的叫做Priority的枚举?br />
我们在类的privateZ用Q_PROPERTY()来声明属性。READ函数 叫做priority,q且我们包含一个WRITE函数叫做setPriority。枚丄型必M用Q_ENUMS()注册到元数据对象pȝ中。注册一 个枚丄型得枚丄名字可以在调用QObject::setProperty()时用。我们还必须为READ和WRITE函数提供我们自己的声明?MyClass的声明看h应该是这LQ?/p>

  1. class MyClass : public QObject  
  2. {  
  3.     Q_OBJECT  
  4.     Q_PROPERTY(Priority priority READ priority WRITE setPriority)  
  5.     Q_ENUMS(Priority)  
  6. public:  
  7.     MyClass(QObject *parent = 0);  
  8.     ~MyClass();  
  9.     enum Priority { High, Low, VeryHigh, VeryLow };  
  10.     void setPriority(Priority priority);  
  11.     Priority priority() const;  
  12. };  

READ函数是const的ƈ且返回属性的cd。WRITE函数q回voidq且h一个属性类型的参数。元数据对象~译器强制做q些事情?br />
在有了一个指向MyClass实例的指针时Q我们有两种Ҏ来设|priority属性:

  1. MyClass *myinstance = new MyClass;  
  2.  QObject *object = myinstance;  
  3.  myinstance->setPriority(MyClass::VeryHigh);  
  4.  object->setProperty("priority", "VeryHigh");  

?此例子中Q枚丄型在MyClass中声明ƈ被用Q_ENUMS()注册到元数据对象pȝ中。这使得枚D值可以在调用setProperty()时做?字符串用。如果枚丄型是在其它类中声明的Q那么我们就需要用枚D的全名(如OtherClass::Priority)Qƈ且这个其它类也必M QObject中派生ƈ且也要注册枚丄型?br />另一个简单的Q_FLAGS()也是可用的。就像Q_ENUMS()Q它注册一个枚丄型,但是它把 枚Dcd作ؓ一个flag的集合,也就是,值可以用OR操作来合q。一个I/Ocd能具有枚丑րRead和Writeq且 QObject::setProperty()可以接受 Read|Write。此时应使用Q_FLAGS()来注册枚丑ր{?br />

动态属?br />

Qobject::setProperty() 也可以用来在q行时向一个类的实例添加新的属性。当使用一个名字和D用它Ӟ如果一个对应的属性已l存在,q且如果值的cd与属性的cd兼容Q那么值就 被存储到属性中Q然后返回true。如果值类型不兼容Q属性的值就不会发生改变Q就会返回false。但是如果对应名字的属性不存在Q那么一个新的属性就 诞生了,以传入的名字为名Q以传入的gؓ|但是依然会返回false。这表示q回g能用于确定一个属性是否被讄|除非你已l知道这个属性已l存?于QObject中了?br />注意动态属性被d到单个实现的基础中,也就是,被添加到QObjectQ而不是QMetaObject。一个属性可以从 一个实例中删除Q通过传入属性的名字和非法的QVariant值给QObject::setProperty()。默认的QVariant构造器构造一?非法的QVariant?br />动态属性可用QObject::property()来查询,p使用Q_PROPERTY()声明的属性一栗?/p>

属性和自定义类?br />

被属性用的自定义类型需要用Q_DECLARE_METATYPE()宏注册,以它们的D被保存在QVariant对象中。这使得它们可以用于被Q_PROPERTY()声明的静态类型中Q也可以被用于动态类型中?/p>

c米 2013-06-05 09:53 发表评论
]]>
QGrapicsItemc? http://www.shnenglu.com/zhonghua/archive/2013/05/24/200561.htmlc米c米Fri, 24 May 2013 03:08:00 GMThttp://www.shnenglu.com/zhonghua/archive/2013/05/24/200561.htmlhttp://www.shnenglu.com/zhonghua/comments/200561.htmlhttp://www.shnenglu.com/zhonghua/archive/2013/05/24/200561.html#Feedback0http://www.shnenglu.com/zhonghua/comments/commentRss/200561.htmlhttp://www.shnenglu.com/zhonghua/services/trackbacks/200561.htmlQGraphicsItemcL视图框架的一部分Q是在一个QGraphicsScene中最基本的图形类Q它为绘制你
 
 
 
自己的item提供了一个轻量的窗口,包括声明item的位|,撞,l制重蝲和item之间的相
 
 
 
互作用通过事g处理
 
Qt提供了一pd标准的items对一些常见的囑փQ非常的方便Q有下面q些Q?br /> 
QGraphicsEllipseItem  提供一个椭圆item
 
QGraphicsLineItem     提供一条线的item
 
QGraphicsPathItem     提供一个Q意的路径item
 
QGraphicsPixmapItem   提供一个图形item
 
QGraphicsPolygonItem  提供一个多边Şitem
 
QGraphicsRectItem     提供一个矩形item
 
QGraphicsSimpleTextItem 提供一个简单的文本item
 
QGraphicsTextItem     提供一个文本浏览item
 
item 的所有几何位|信息都建立在本地坐标系l上Qitem的位|,使用pos()获得Q是唯一一个不再本地item中实现的。它q回的是item在父亲坐标系 l中的位|,关于坐标pȝ可以详细参看 The Graphics View Coordinate System
 
 
 
?q调用哪个setVisible()Q可以设|item是否可见Q隐藏一个item同时也隐藏了他的孩子Q相似的Q你可以通过调用 setEnabled()来是指item是否可用。如果禁用了itemQ那么它所有的孩子都不可用。默认的Qitems都是可见和可用的。来开关一?item是否被选择Q首先通过讄itemsSelectable flag来能选择。然后调用setSelect()Q通常Q是否可被选择的开x打开?br /> 
 
 
写自qitem囑ŞQ首先应该承QGraphicsItem,然后重写他的两个U虚公共函数Q?

boundingRect()和paint()Q第一个函数返回绘制item大概的区域,W二个函数用来绘制item内容
 
 
 


boundingRect() 函数有很多用处,场景在boundingRect()来徏立它的item的indexQ视图view使用它来剪切可见的itemQ在重新l制item?候,来决定相互重叠的部分Q此外,item的碰撞检机制也使用的boundingRect()来提供一个高效的定点Q在 collidesWithItem()更好的碰撞算法徏立在调用函数shape(),shape()函数以QpainterPathcdq回item的精 准的轮廓?br /> 
一般的Q场景不希望item的boundingRect()和shape()变化Q除非该item被通告Q如果想通过一些方法改变item的ŞӞ首先应该调用QgraphicsScene()来允许场景QgraphicsScene来刷新它的item记录?br /> 
 
 
撞可以通过下面两种Ҏ来完?br /> 
1、重写shape()函数来返回item的精准轮廓,依靠默认的collidesWithItem()来做外Ş交集。如果item轮廓和复杂时候,q个消耗是很大?br /> 
2、重写collidesWithItem()Q提供一个自qitem和轮廓碰撞的法
 
 
 
ContainsQ)函数可以调用Q用来决定一个item是否包含一个点。这个函C可以重写Qcontains()函数默认的方法是通过调用shapeQ)来完成的?br /> 
Items中也可以包含其他的items,也可以被别的items包含Q所有的items可以有一个父亲item和一串孩子items,除非一个item没有父亲Q否则它的位|是在父亲坐标中Q父亲items遗传他的位置和{换给孩子item
 
转换
 
QgraphicsItem 支持投射转换Q有很多Ҏ来改变item的{换,对于单的转换Q可以调用函数setRotation()或者setScale()Q可以传递一个{换矩 늻函数setTransform(),对于一些更复杂的{换,可以通过调用函数setTransformations()来设|一pdl合的{换?br /> 
Item 转换从父亲到孩子q行聚集Q因此如果一个父亲和孩子item都旋?0度,那么孩子旋转了180度,怼的,如果父亲item攑֤?X倍,那么孩子 itempҎ4X倍,一个item的{换不影响他的外观Q所有和外观有关的函敎ͼ例如contains(),update()和所有的映射 mapping函数Q将会在本地坐标中操作,更方便的QQgraphicsItem提供函数sceneTransform()Q将会返回item所有的?换矩阵,scenePos()会q回item在场景坐标中的位|,重新讄item的矩阵,调用函数resetTransform()
 
一 般的转换回生一个不同的l果Q这取决于{换应用的序Q例如,如果你放大一个{换,然后再旋转它Q可能和你先旋{它得到的l果不一P你设|{换属性的 序q不影响转换的结果,Q也是仍旧会按照你的{换命令去转换Q只是最后得到的囑Ş不一栯已Q,QgraphicsIteml常应用一个合适的序?下:
 


l图painting
 
paint()函数被QgrapicsViewc调用来l制item?内容Qitem默认是没有背景或者填充颜色的。在函数中没有被l制的所有区域都会发亮Q可以调用updateQ)来重litemQ可以选择传递需要重l?的矩形区域(不是必须的)。取决于item在view中是否可见,item可能会也可能不会重绘QQgraphicsItem里面没有?Qwidget::repaint()函数{h?br /> 
item通过view来绘Ӟ从父items开始,然后是自itemsQ以上升的栈?序Q可以通过调用setZValue()讄item的栈序Q通过zValue()来测试,h低z-values的item比具有高z-value 的item先绘Ӟ栈顺序应用于兄弟itemsQ父itemsL比子items更早l制?br /> 
 
 
排序sort
 
所有的items都按照一个已l声明的Q稳定的序来绘Ӟq个序也决定了当你在场景中点击鼠标时候,哪个items最先接受鼠标的输入。一般的Q你不需要担心排序问题,因ؓ所有的items都按照一个在场景中声明的自然的顺?br /> 


在一个栈中,子item在父item的上面,兄弟item按照插入场景的顺序来入栈Q如果你先添加了item A Q然后是item BQ然后是item C Q这h中的序从下往上就是A,B,C
 
Drag and Drop Robot例子中展CZ该robot的栈序Q躯q顺序是根itemQ其他所有的item都是w干item的子item或者后代itemQ,然后是头 item被绘Ӟ׃它是w干item的子item列表中的W一个itemQ然后是左臂膀上面的那部分itemQ下面那个臂膀item是上面臂膀item 的子itemQ所以会在和3号item同等U的兄弟iteml制完后被绘Ӟ接着是双上面的的臂膀itemQ就?号item?br /> 
 。可以调用setZvalue()来设|一个item的相对亦另一个向上,向下或者兄弟栈序。默认的Z值是0Q具有同LZ值的item会按照插入的序来入栈?br /> 
。可以调用stackBefore()来备份孩子item的列表,q可以直接更正item的顺序?br /> 
。如果想让孩子item在父item的后面,也就是先l制孩子itemQ然后在l制父itemQ怎么办呢Q可以设|ItemStacksBehindParent属性给q个itemQ利用函数setFlag();
 
两个兄弟item的顺序也军_了他们的子item 和后代item的顺序,如果一个父item的在两个父item的后面,那么他所有的孩子items都在另一个父item的孩子items后面?br /> 
 
 
事gEvent
 
QgraphicsItem从场景中通过sceneEvent()函数来接受事Ӟq个函数通过一些方便的操作分散大部分事?br /> 
ContextMenuEvent()函数接受上下文菜单事?br /> 
FocusInEvent()和focusOutEvent()函数接受焦点q出事g
 
hoverEnterEvent(), hoverMoveEvent(), and hoverLeaveEvent() 接受鼠标悬Q Ud和离开事g
 
inputMethodEvent()函数处理输入法事Ӟ
 
keyPressEvent() and keyReleaseEvent()事g处理键盘按下和松开事g
 
mousePressEvent(), mouseMoveEvent(), mouseReleaseEvent(), and mouseDoubleClickEvent()处理鼠标按下Q移动,村ּQ双M?br /> 
?可以Z些itemqo一些事仉过安装qo器,q个和QT一般的事gqo器不一P一般的qo器只工作在Qobject和它的子c,通过调用 installSceneEventFilter()为item安装了过滤器后,被过滤的事g会被虚函数sceneEventFilter().捕捉 刎ͼ可以通过调用函数removeSceneEventFilter().来去除掉事gqo?br /> 
 
 
Custom Data数据
 
?些时候ؓitem注册一些数值很有用Q做一个普通的item或者标准的itemQ可以调用setData()来ؓM个item讄|q个g?key-value对,Qkey是整形,value是变U数据QvarientQ来得到item的数据,通过调用data(),
 
 
 
 
 
 
 
 
 
 
 
1、QVariant QGraphicsItem::itemChange ( GraphicsItemChange change, const QVariant & value )   [virtual protected]
 
q个函数被QGraphicsItem调用用来标明items的一些状态改变了Q通过重蝲q个函数Q可以对自己定义事g响应Q在一些情况下Q可以做一些调整?br /> 
参数change是改变的那个item的改变状态参敎ͼvalue是一个新的数据,他的cd取决于changeQ?br /> 
 
 
change是QGraphicsItem::GraphicsItemChange的枚丑֏?br /> 
enum      GraphicsItemChange { ItemEnabledChange, ItemEnabledHasChanged,

 
 
ItemMatrixChange, ItemPositionChange, ..., ItemScenePositionHasChanged }
 
例如Q?br /> 
 QVariant Component::itemChange(GraphicsItemChange change, const QVariant &value)
 
 {
 
     if (change == ItemPositionChange && scene()) {
 
         // value is the new position.
 
         QPointF newPos = value.toPointF();
 
         QRectF rect = scene()->sceneRect();
 
         if (!rect.contains(newPos)) {
 
             // Keep the item inside the scene rect.
 
             newPos.setX(qMin(rect.right(), qMax(newPos.x(), rect.left())));
 
             newPos.setY(qMin(rect.bottom(), qMax(newPos.y(), rect.top())));
 
             return newPos;
 
         }
 
     }
 
     return QGraphicsItem::itemChange(change, value);
 
 }
 
默认的函C么都不做Q只q回value
 
?意:在用这个函数时候,在函数内部调用函数时候要心Q因可能D一些意想不到的l果Q例如:你不能再q个函数里面调用setPos()?change是ItemPositionChange时候,׃setPos()函数会再次调用 itemChange(ItemPositionChange)Q如此就一直@环下M?br /> 
2、void QGraphicsItem::setFlag ( GraphicsItemFlag flag, bool enabled = true )
 
void QGraphicsItem::setFlags ( GraphicsItemFlags flags )
 
把flags讄为item的属性,如果item获得了光标,但是flags没有使能ItemsFocusable,q个item
 
 
 
会丢失光标Q同LQ当item被选择刎ͼ但是没有使能ItemsSelectable,q个item会自动的失去
 
 
 
选择?br /> 
默认的,所有的flags都是不可用的。(QGraphicsWidget Z获得位置变化默认使能?br /> 
 
 
ItemSendsGeometryChangesQ?br /> 
相近的函?br /> 
GraphicsItemFlags QGraphicsItem::flags () const
 
q回item的所有能的flagsQ例如,如果flags里面包含了ItemIsFocusableQ这个item可以接受
 
 
 
输入光标
 
3、QPainterPath QGraphicsItem::shape () const   [virtual]
 
以QPainterPathq回item在local坐标中的形状Q这个Ş状可以用来做很多事情Q包括碰撞侦,
 
 
 
打击试Q还有用?QGraphicsScene::items() 函数
 
默认的函数调用boundingRect()q回一个简单的矩Ş形状Q但是子cd以重载这个函敎ͼ为非矩Ş
 
 
 
的itemq回一个更加精准的形状Q例如一个圆形的item可以选择q回一个椭圆ŞQ用来获得更好的
 
 
 
撞侦测效果。代码:
 
QPainterPath RoundItem::shape() const
 
 {
 
     QPainterPath path;
 
     path.addEllipse(boundingRect());
 
     return path;
 
 }
 
形状的轮廓线可以通过l制时候的pen来变?br /> 
4、QRectF QGraphicsItem::boundingRect () const   [pure virtual]
 
q个U虚函数用矩形声明了item的边界轮廓,所有的l制都必限定在item的矩形边框内?br /> 
 
 
QGraphicsView使用q个Ҏ来决定item是否需要重l?br /> 
管item的Ş状可以是L的,但是Ҏ一直都是矩形,不媄响items的变?br /> 
如果x变items的边框,应该首先调用prepareGeometryChange()Q这通知场景scene卛_发生的变化,q样场景可以hitem的位|下标。否则,场景不会察觉到item的变化,l果也未知?br /> 
如果要重litem时候,重蝲q个函数来让QGraphicsView来决定item的边界区域,
 
注意Q由于绘制边界时候的边界轮廓U,在这个矩形区域内包含ȝpen宽度的一半很重要Q不需
 
 
 
要补偿画图走?nbsp; 例如
 
 QRectF CircleItem::boundingRect() const
 
 {
 
     qreal penWidth = 1;
 
     return QRectF(-radius - penWidth / 2, -radius - penWidth / 2,
 
                   diameter + penWidth, diameter + penWidth);
 
 }
 
 
 
同样的一个返回item轮廓的函?br /> 
QRegion QGraphicsItem::boundingRegion ( const QTransform & itemToDeviceTransform ) const
 
q回该item的轮廓区域,q回的区域的坐标pȝ依赖于参数itemToDeviceTransformQ如果你传递一个Qtransform对象作ؓ参数Q那么函数将q回本地坐标pȝ区域
 
q回的区域是item内容可见的一个大概的轮廓Q尽计v来很费I间和时_但是比boundingRectQ)更精准,而且当重l时候,它还能避免不必要的重l。对像线或者简单的多边形来说非常有效?br /> 
也可以调节轮廓区域的_度通过调用setBoundingRegionGranularity()Q默认的_度?Q这时候item的区域和轮廓矩Ş一L?br /> 
itemToDeviceTransform是从item坐标pȝ到设备坐标系l的一个{换。如果你惌q个函数q回一个场景坐标区域,可以用函数sceneTransform()作ؓ参数?br /> 
 
 
相关函数qreal QGraphicsItem::boundingRegionGranularity () const
 
q回item的轮廓区域粒?br /> 
 
 
5、void QGraphicsItem::setPos ( const QPointF & pos )
 
在父对象坐标pȝ中设|item的位|ؓposQ对没有父对象的items,pos使用的场景的坐标pȝQ?br /> 
6、QPointF QGraphicsItem::scenePos () const
 
q回该item在场景中的坐标点Q等价于调用函数mapToScene(0, 0).
 
7、QPointF QGraphicsItem::pos () const
 
q回item在父坐标pM的位|,如果没有父坐标系Q那么返回在场景坐标pM的位|,此时{h于调用scenePos ()Q可以直接调用scenePos ()来获取该item在场景中的位|,从而忽略其父对象?br /> 
 
 
8、enum QGraphicsItem::CacheMode
讄l图的缓冲模式,默认是没有缓Ԍ如果使用~冲区的话,在重l时候,非常?br /> 
讄~冲模式使用函数QGraphicsItem::setCacheMode().
 
 
 
9、bool QGraphicsItem::acceptDrops () const
 
如果item能够接受拖拽事gQ就q回真,否则q回假,默认的不能接受拖拽事?br /> 
 同类函数
 
void QGraphicsItem::setAcceptDrops ( bool on )
 
如果On是真的话Q就讄item可以接受拖拽事gQ否则对拖拽事g是透明的,也就是不能响应拖拽,默认是不响应的?br /> 
10、bool QGraphicsItem::acceptHoverEvents () const
 
如果可以接受鼠标悬Q在他上面的事Ӟp回真Q否则返回假。默认也是不接受该事件的?br /> 
同样的用于设|是否接受该事g的函?br /> 
void QGraphicsItem::setAcceptHoverEvents ( bool enabled )
 
如果enabled为真Q就接受Q否则就不接受?br /> 
11、Qt::MouseButtons QGraphicsItem::acceptedMouseButtons () const
 
q回q个item所能接受的鼠标事g的鼠标键Q默认的是所有的鼠标键事仉能接受?br /> 
?L使用函数void QGraphicsItem:: setAcceptedMouseButtons ( Qt::MouseButtons buttons )来设|接受的鼠标键事Ӟ如果惛_略某个鼠标键事gQ可以用setAcceptedMouseButtonsQ?Q?br /> 
12、void QGraphicsItem::advance ( int phase )   [virtual]
 
q?个虚函数被QGraphicsScene::advance()调用两次Q第一ơ调用,所有的items都调用,使用参数phase=0Q表C场景中所?的items都将advanceQ前q)Q然后所有的items都将调用Q用参数phase=1Q重写这个函敎ͼ可以来刷C的itemQ如果你需要简 单的场景控制动画?br /> 
默认的该函数什么事都不?br /> 
如果惛_动画Q可以用两U方法,一个?QGraphicsItemAnimation,Q或多重l承Qobject和QgraphicsItemQ然后?QObject::startTimer() ?QObject::timerEvent().来item成动甅R?br /> 
 
 
13、QList<QGraphicsItem *> QGraphicsItem::childItems () const
 
q回孩子item的一个链表,q些items按照栈顺序排列,考虑了item的插入顺序和Z-values
 
14、QRectF QGraphicsItem::childrenBoundingRect () const
 
q回q个item的所有子孙items的本地坐标系l轮廓矩形。这个矩形包括了q个item所有的子孙itemQ如果这个item不含有子孙itemQ这个函数将q回一个空的矩形?br /> 
q回的矩形不包括item本n的轮廓矩形,只返回子孙item的矩形轮廓,如果你想包含item本n的矩形区域,可以使用QRectF::operator|()把boundingRect()和hildrenBoundingRect()或v来?br /> 
q个函数很复杂,它决定了q回轮廓的大通过重复所有子孙item
 
 
 
15、void QGraphicsItem::clearFocus ()
 
去除item的光标,如果原来有光标焦点,当焦点失L候,事gfocus out event会发送给q个itemQ提CZ会失去焦点?br /> 
Item只有讄了ItemsFocusable属性,或者widget讄了合适的焦点{略Q才能接受键盘焦炏V?br /> 
 
 
 
 
16?bool QGraphicsItem::collidesWithItem ( const QGraphicsItem * other, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape ) const   [virtual]
 
?果这个item和另一个item撞p回真Qmode是应用于其他item的,默认是Qt::IntersectsItemShapeQ如果其他的 item和这个item怺影响或者包含,被包含于q个item的ŞӞ详见Qt::ItemSelectionModeQ?br /> 
默认的函 数是基于外形相互媄响,它调用两个item的shape()函数Q这会p很大旉Q你可以在QgraphicsItem子类中重写这个函敎ͼ提供一 个简单的法。这样你可以使用自己item的一些参敎ͼq样可以提高撞侦测的效果。例如,两个完全没有转换的圆item的碰撞可以通过Ҏ他们的圆心位 |和半径
 
 
 
17、bool QGraphicsItem::collidesWithPath ( const QPainterPath & path, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape ) const   [virtual]
 
如果item按照path撞p回真Q?br /> 
 
 
18、QList<QGraphicsItem *> QGraphicsItem::collidingItems ( Qt::ItemSelectionMode mode = Qt::IntersectsItemShape ) const
 
q回和这个item怺撞的item的链?br /> 
撞侦测模式取决于mode,
 
 
 
19\ QGraphicsItem * QGraphicsItem::commonAncestorItem ( const QGraphicsItem * other ) const
 
q回item最q的先itemQ如果other?Q或者没有祖先itemQ就q回0
 
 
 
20、bool QGraphicsItem::contains ( const QPointF & point ) const   [virtual]
 
如果item包含了点pointp回TRUEQ否则返回FALSEQ最常用的是在QgraphicsView中调用,来判断这个item是否在光标下面,如果要重写这个函敎ͼ那就可能的单。默认的q个函数调用的shape()函数
 
 
 
21、void QGraphicsItem::contextMenuEvent ( QGraphicsSceneContextMenuEvent * event )   [virtual protected]
 
右键菜单事gQ可以在子类中重写这个函敎ͼevent里面包含了事件要具体处理的数据?br /> 
如果忽略q个事gQ调用函数QEvent::ignore()Q事件event会被传播到M在该item之下的items,如果没有item响应q个事gQ那么场景就忽略q个事gQ传递给view视图
 
通常是响应该事g打开一个右键菜单,例如
 
void CustomItem::contextMenuEvent(QGraphicsSceneContextMenuEvent *event)  {      QMenu menu;      QAction *removeAction = menu.addAction("Remove");      QAction *markAction = menu.addAction("Mark");      QAction *selectedAction = menu.exec(event->screenPos());      // ...  }
 
 
默认是忽略该事g?br /> 
 
 
 
 
22、QVariant QGraphicsItem::data ( int key ) const
 
以Qvariant的格式返回item中的数据Q当前的item数据对存储Q意数据很有用Q例?br /> 
static const int ObjectName = 0;    QGraphicsItem *item = scene.itemAt(100, 50);  if (item->data(ObjectName).toString().isEmpty()) {      if (qgraphicsitem_cast<ButtonItem *>(item))          item->setData(ObjectName, "Button");  }
void QGraphicsItem::setData ( int key, const QVariant & value )
 
用来讄item的数?br /> 
23、QTransform QGraphicsItem::deviceTransform ( const QTransform & viewportTransform ) const
 
q回item讑֤的{换矩阵,使用viewportTransform来从场景到设备媄坐标,q个矩阵可以用来从这个item本地坐标到视囑֏坐标pȝ映射坐标或者几何图形,如果要映视囑֏坐标到本地坐标,首先应该转换q回的这个矩c?br /> 
QGraphicsRectItem rect;  rect.setPos(100, 100);    rect.deviceTransform(view->viewportTransform()).map(QPointF(0, 0));  // returns the item's (0, 0) point in view's viewport coordinates    rect.deviceTransform(view->viewportTransform()).inverted().map(QPointF(100, 100));  // returns view's viewport's (100, 100) coordinate in item coordinates
q个函数是结合了到场景的转换和到视图的{换,讑֤转换可以用来寚w些没有进行{换坐标的item计算撞?br /> 
24、拖拽类函数
 
void QGraphicsItem::dragEnterEvent ( QGraphicsSceneDragDropEvent * event )   [virtual protected]
 
void QGraphicsItem::dragLeaveEvent ( QGraphicsSceneDragDropEvent * event )   [virtual protected]
 
void QGraphicsItem::dragMoveEvent ( QGraphicsSceneDragDropEvent * event )   [virtual protected]
 
void QGraphicsItem::dropEvent ( QGraphicsSceneDragDropEvent * event )   [virtual protected]
 
 
 
25、qreal QGraphicsItem::effectiveOpacity () const
 
q回item的有效透明度,q个数值在0.0~~1.0之间
 
同样的可以用函数void QGraphicsItem::setOpacity ( qreal opacity )来设|透明度,
 
默认的子iteml承父item的透明?br /> 
同样可以讄item的属性QGraphicsItem::ItemIgnoresParentOpacity 来忽略父item的透明度对自己的媄?br /> 
讄子item的属性QGraphicsItem::ItemIgnoresTransformations来忽略视图{换(攑֤Q羃){操作对自己的媄响,在显C文本时候很有用?br /> 
 
 
26、void QGraphicsItem::hoverEnterEvent ( QGraphicsSceneHoverEvent * event )   [virtual protected]
 
void QGraphicsItem::hoverLeaveEvent ( QGraphicsSceneHoverEvent * event )   [virtual protected]
 
void QGraphicsItem::hoverMoveEvent ( QGraphicsSceneHoverEvent * event )   [virtual protected]
 
鼠标悬Q事g
 
 
 
27、void QGraphicsItem::mouseDoubleClickEvent ( QGraphicsSceneMouseEvent * event )   [virtual protected]
 
void QGraphicsItem::mouseMoveEvent ( QGraphicsSceneMouseEvent * event )   [virtual protected]
 
void QGraphicsItem::mousePressEvent ( QGraphicsSceneMouseEvent * event )   [virtual protected]
 
void QGraphicsItem::mouseReleaseEvent ( QGraphicsSceneMouseEvent * event )   [virtual protected]
 
鼠标双击Q移动,释放的事?br /> 
 
 
 
 
 
 
28、QPointF QGraphicsItem::mapFromItem ( const QGraphicsItem * item, const QPointF & point ) const
 
QPolygonF QGraphicsItem::mapFromItem ( const QGraphicsItem * item, const QRectF & rect ) const
 
QPainterPath QGraphicsItem::mapFromItem ( const QGraphicsItem * item, const QPainterPath & path ) const
 
QPolygonF QGraphicsItem::mapFromItem ( const QGraphicsItem * item, qreal x, qreal y, qreal w, qreal h ) const
 
QPointF QGraphicsItem::mapFromItem ( const QGraphicsItem * item, qreal x, qreal y ) const
 
QPointF QGraphicsItem::mapFromParent ( const QPointF & point ) const
 
QPolygonF QGraphicsItem::mapFromParent ( const QRectF & rect ) const
 
QPolygonF QGraphicsItem::mapFromParent ( const QPolygonF & polygon ) const
 
QPainterPath QGraphicsItem::mapFromParent ( const QPainterPath & path ) const
 
QPolygonF QGraphicsItem::mapFromParent ( qreal x, qreal y, qreal w, qreal h ) const
 
QPointF QGraphicsItem::mapFromParent ( qreal x, qreal y ) const
 
QPointF QGraphicsItem::mapFromScene ( const QPointF & point ) const
 
QPolygonF QGraphicsItem::mapFromScene ( const QRectF & rect ) const
 
QPolygonF QGraphicsItem::mapFromScene ( const QPolygonF & polygon ) const
 
QPainterPath QGraphicsItem::mapFromScene ( const QPainterPath & path ) const
 
QPolygonF QGraphicsItem::mapFromScene ( qreal x, qreal y, qreal w, qreal h ) const
 
QPointF QGraphicsItem::mapFromScene ( qreal x, qreal y ) const
 
QRectF QGraphicsItem::mapRectFromItem ( const QGraphicsItem * item, const QRectF & rect ) const
 
QRectF QGraphicsItem::mapRectFromItem ( const QGraphicsItem * item, qreal x, qreal y, qreal w, qreal h ) const
 
。。。。。。。。。。太多了
 
转换矩阵函数
 
 
 
 
 
29、void QGraphicsItem::moveBy ( qreal dx, qreal dy )
 
向x,y方向上移动dx,dy的距,{h于调用setPos(pos()+QpointF(dx,dy))
 
 
 
 
 
30\最重要的一个函?br /> 
void QGraphicsItem::paint ( QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget = 0 )   [pure virtual]
 
q个函数通常被view调用Q然后再本地坐标pȝ中绘制item的内?br /> 
 
 
31、qreal QGraphicsItem::rotation () const
 
q回item的旋转度Q?br /> 
讄旋{度函C用setRotation(),
 
 
 
32、qreal QGraphicsItem::scale () const
 
q回~放pL
 
讄~放使用setScale()
 
 
 
33、bool QGraphicsItem::sceneEvent ( QEvent * event )   [virtual protected]
 
截获事gQ在事g没有分发l各个具体的事g处理函数之前?br /> 
相当于bool QObject::event ( QEvent * e )   [virtual]
 
 
 
34、void QGraphicsItem::scroll ( qreal dx, qreal dy, const QRectF & rect = QRectF() )
 
滚动item
 
 
 
35、在使item能响应一些事件之前,需要先使能q个功能Q例?br /> 
void QGraphicsItem::setAcceptDrops ( bool on ) 

如果on为真Q那么就使能拖拽Q否则将会忽略拖拽事件。默认是不接受的
 
void QGraphicsItem::setAcceptHoverEvents ( bool enabled )
 
如果on为真Q能鼠标悬事件。默认不接受该事件?br /> 
void QGraphicsItem::setAcceptTouchEvents ( bool enabled )
 
在一些支持触摸的讑֤上,q个函数能触怺件?br /> 
 
 
36、void QGraphicsItem::setEnabled ( bool enabled )
 
使该item有效Q如果enabled为假Q则该item不能用了
 
 
 
37、void QGraphicsItem::setGraphicsEffect ( QGraphicsEffect * effect )?br /> 
讄item的效果,可以用模p效果,印象效果Q给定颜色绘制效果,透明效果{?br /> 
详细的可以参见QgraphicsEffectc?br /> 
 
 
38、const int QGraphicsItem::Type
 
q回该item的类型|q个值是自己通过定义Type的|然后使用type()虚函数来q回的,看例?br /> 
class QGraphicsPathItem : public QAbstractGraphicsShapeItem  {   public:    enum { Type = 2 };      int type() const { return Type; }    ...  };
 
 
39、T qgraphicsitem_cast ( QGraphicsItem * item )
 
如果item是Tcd的,把item转换成Tcd的itemQ如果失败,则返?
 
如果惌他正的工作Q需要重新实现函数typeQ)来进行判?/p>

c米 2013-05-24 11:08 发表评论
]]>
QT Plugin框架l构 http://www.shnenglu.com/zhonghua/archive/2013/02/22/198000.htmlc米c米Fri, 22 Feb 2013 07:10:00 GMThttp://www.shnenglu.com/zhonghua/archive/2013/02/22/198000.htmlhttp://www.shnenglu.com/zhonghua/comments/198000.htmlhttp://www.shnenglu.com/zhonghua/archive/2013/02/22/198000.html#Feedback0http://www.shnenglu.com/zhonghua/comments/commentRss/198000.htmlhttp://www.shnenglu.com/zhonghua/services/trackbacks/198000.html

一Q?/span>qt plugin 介绍

      Qt Plugin和其他类型的插g一P是一U计机应用E序Q它和主应用E序(host application)互相交互Q以提供特定的功能。应用程序支?/span>Plugin有许多原因,一些主要原因包括:使得W三方开发者有能力扩展应用E序Q以提供无法先期预料的特Ԍ减小应用E序的大;׃软g版权之间的不兼容性将源代码和应用E序分n?/span>Qt Plugin 分动态插件和静态插件两U?/span>

二:qt plugin 创徏和用方?/span>

Qt有两U与插g有关?/span>API。一U用来扩?/span>Qt本n的功能,如自定义数据库驱动,囑փ格式Q文本编解码Q自定义分格Q等{,UCؓHigher-Level API。另一U用于应用程序的功能扩展Q称?/span>Lower-Level API。前一U是建立在后一U的基础之上的。这里讨论的是后一U,即用来扩展应用程序的Lower-level API?/span>

让应用程序支持插件扩展的步骤Q?/span>

 1. 定义一个接口集(只有U虚函数的类)Q用来与插g交流?/span>

 2. 用宏Q_DECLARE_INTERFACE()该接口告诉Qt元对象系l?/span>

 Q_DECLARE_INTERFACE(BrushInterface,"com.trolltech.PlugAndPaint.BrushInterface/1.0")

 3. 应用E序中用QPluginLoader来装载插件?/span>

 4. 用宏qobject_cast()来确定一个插件是否实C接口?/span>

 QObject *obj = new QTimer; 

 QTimer *timer = qobject_cast<QTimer *>(obj);

写一个插件的步骤Q?/span>

 1. 声明插gc,该类?/span>QObject和该插g希望实现的接口承而来?/span>

 2. 用宏Q_INTERFACES()该接口告诉Qt元对象系l?/span>

  class BasicToolsPlugin : public QObject,

                            public BrushInterface,

                            public ShapeInterface,

                            public FilterInterface

  {

       Q_OBJECT

       Q_INTERFACES(BrushInterface ShapeInterface FilterInterface)

  public:

       ...

   };

 3. 用宏Q_EXPORT_PLUGIN2()导出插g?/span>

  Q_EXPORT_PLUGIN2 ( PluginName, ClassName )

 4. 用适当?/span>.pro文g构徏插g?/span>

下面的代码声明了一个接口类Q?/span>

 

class FilterInterface

 {

 public:

        virtual ~FilterInterface() {}

        virtual QStringList filters() const = 0;

        virtual QImage filterImage(const QString &filter, const QImage &image, QWidget* parent)=0;

  };

Q_DECLARE_INTERFACE(FilterInterface, "com.trolltech.PlugAndPaint.FilterInterface/1.0")

q里是实现该接口的插件类的定义:

 

 #include <QObject>

 #include <QStringList>

 #include <QImage>

 #include <plugandpaint/interfaces.h>

 class ExtraFiltersPlugin : public QObject, public FilterInterface

 {

 Q_OBJECT

 Q_INTERFACES(FilterInterface)

 public:

     QStringList filters() const;

     QImage filterImage(const QString &filter, const QImage &image,

     QWidget *parent);

 };

Ҏ插g的类型不同,pro文g中配|上有不同。下面是pro文g分析Q?/span>

TEMPLATE      = lib                                  // 声明?/span>libQ动态和静态插件一栗?/span>

CONFIG       += plugin static                // 声明?/span>pluginQ带static表面为静态,否则为动态?/span>

INCLUDEPATH += ../..

HEADERS       = basictoolsplugin.h

SOURCES       = basictoolsplugin.cpp

TARGET        = $$qtLibraryTarget(pnp_basictools)           // 指明插g的名U?/span>

DESTDIR       = ../../plugandpaint/plugins

加蝲插g的主应用E序默认在当前目录下?/span>plugins文g夹中L可用插gQ如果是动态插Ӟ则直接放?/span>plugins文g夹中便可Q如果是静态,则需要在d用程序的main函数的开始的地方用宏Q?/span>Q_IMPORT_PLUGIN(pluginname(和pro文g中声明的一?)声明需要加载的插gq在工程配置中指明插件的lib位置?/span>

三:Zqt plugin 技术的框架l构设想

1.      愿景

׃我们目前pȝ功能多,模块多,~Zpȝ的整体性。我们想借助Qt Plugin技术,把各个独立的功能模块实现Z个个插gQ统一在主体框架中Qƈ能根据不同地方的用户的不同需求,在主框架中加载不同的功能模块Q以实现整个pȝ的功能集中,体现出系l的整体性?/span>

2.      plugin 接口

通过技术验证得出,目前我们采用动态插Ӟ各个功能的插件实现定义的l一接口Q具体功能放在插件界面中实现Q此部分像开发独立的应用E序Q只是需要注意的是:

功能部分的主界面需要承至插g界面基类Q?span style="color: black;">PluginWidgetQ插件接口中用具体的实现cL针给插g界面基类指针赋|在加载插件的L架中通过插g接口中定义的基类指针l一调用Q利用C++动态技术动态识别具体指向的实现cR?/span>

插g界面cdd现基cȝ虚函敎ͼCreateActions()用于创徏Action

创徏Action需要用基cȝҎnewAction创徏Q在此函C加入了保存创建的Action功能?/span>

插g接口定义如下Q?/span>

class QPluginInterface

{

public:

    // 析构函数

    virtual ~QPluginInterface() {}

   

    // 插g名称

    virtual    QString    PluginName() = 0;

   

    // 插g昄在主框架中的图标文g路径

    virtual    QString PluginIconurl() = 0;

   

    // 插g提供的对外操作接口集

    virtual QList<QAction*>* Actions() = 0;

 

    // 创徏插g提供的操作方?/span>

    virtual    void CreateActions()=0;

 

    // 插g的主界面

    virtual QWidget* Widget() = 0;

protected:

    // 插g的主界面基类

    PluginWidget *pluginWidget;

};

插g界面基类定义如下Q?/span>

class PluginWidget :public QMainWindow

{

    Q_OBJECT

public:

    PluginWidget(QWidget*parent=0);

    ~PluginWidget();

    QList<QAction*>* Actions();

    virtual void      CreateActions(){}

    QActionnewAction(const QIcon &icon,const QString &text,QObject*parent);

    QAction *         newAction(const QString &text,QObject*parent);

    void       AppendAction(QAction*act);

protected:

    // action链表

    QList<QAction*> *m_actlist;

};

下图是一个实现案例中各类之间的关pdQ?/span>

ZQT Plugin框架l构  - yleesun - 与青春有关的日子...

3.      插g调用

插g在主框架中动态加载,目前考虑L架基本结构是l承?/span>QMainWindowQ工h上显C当前加载的插g的功能键Qƈ留有q回键可以回退C一U。主工作区是一?/span>QStackWidget,保存插g的界面,q把插g序号和插件对应的界面建立映射Q保存在QMap<int,QWidget>中。通过序号?/span>QStackWidget中切换界面?/span>

下图是把DBManager做成插g加蝲C框架的运行界面:

ZQT Plugin框架l构  - yleesun - 与青春有关的日子...

下图是把一个简单的l图E序做成了插Ӟ加蝲C框架的运行界面:

ZQT Plugin框架l构  - yleesun - 与青春有关的日子...

四:ȝ

       目前只是通过实现两个动态插件在L架中q行Q基本算是功能性的验证Q离具体实施q有很多工作需要进一步的研究Q比如主框架的风|插g的管理等{。由于本人的能力有限Q可能有很多认识不够的地方,h正?/span>



c米 2013-02-22 15:10 发表评论
]]>
QT囑Ş视图体系 (The Graphics View Framework) http://www.shnenglu.com/zhonghua/archive/2013/02/06/197752.htmlc米c米Wed, 06 Feb 2013 02:38:00 GMThttp://www.shnenglu.com/zhonghua/archive/2013/02/06/197752.htmlhttp://www.shnenglu.com/zhonghua/comments/197752.htmlhttp://www.shnenglu.com/zhonghua/archive/2013/02/06/197752.html#Feedback0http://www.shnenglu.com/zhonghua/comments/commentRss/197752.htmlhttp://www.shnenglu.com/zhonghua/services/trackbacks/197752.html

概念

名称 含义
View 视图 视觉化一个场?/td>
Scene 场景 用于理囑Ş?/td>
Item 囑Ş?具体的图形对?/td>

 

QT的图形视图架构采用Model-View模型QScence里面包含多个ItemQ可以用多个View以不同的方式观察一个Scence

功能
Scene(QGraphicsScene)

  • dQ删除,查询N

  • 事g分发

  • 理N的选择状态和焦点

View QQGraphicsView)

  • 为Scene提供一个视图接?/li>
  • 接收鼠标键盘事gQ{换后发给Scene
  • 负责View和Scence之间的坐标变?nbsp;

可以为View讄不同的ViewPort控gQ比如QGLWidget来支持OpenGLQRead More!

Item QQGraphicsItem)

 

囑Ş的基类是QGraphicItem

基础的Feature包括Q?

  • 处理鼠标键盘事g
  • 拖放
  • 分组
  • 撞?/div>

每个囑Şw有自q本例坐标pȝQƈ提供它和场景坐标的{换函数。所以可以单独旋转或~放某个一囑Ş?


除了pos{很的几个函数Q图形项的多数函数所处理的坐标都是它的本地坐标(例如bounding rect)

坐标pȝ

如上所q视图体p采用三U坐标系l:

  • 视口坐标Q?对应物理坐标/讑֤坐标
  • 场景坐标Q?对应逻辑坐标
  • 坐标: 本地坐标

window-viewport概念

window指定了逻辑坐标的矩形范_viewport指定了设备坐标的矩Ş范围Q和WorldTransformQ世界{换矩阵)一P军_了逻辑坐标和设备坐标之间的转换

 

可以使用QGraphicsItemAnimation来动M个ItemQ用QTimeLine来控制时间进?/p>

 

其它Ҏ?/h2>

Animation动画

一个Item只能有效的和一个Animation对象兌(by QGraphicsItemAnimation::setItem)Q因为Animation对象讄NItem的{换矩阉|Q会替换对象现有的矩c?所以你不能通过l定多个Animation对象来做多重动画Q但是你可以在一个Animation对象中设|多U变换效果(或者用分组的方法,分?ӞQ?/p>


QGraphicsItemAnimation直接l承自QObjectQ和普通的QAbstractAnimation没有关系Q所以没法只用用QAnimationGroup来组装,然后串行/q行使用多个动画?/p>

 

囑Ş控g和布局理

QGraphicsWidget的目的是在图形对象的功能基础上提供类似QWidget的功能。(从QGraphicsObject?QGraphicsLayoutIteml承来)Q从而可以用完整的Widget控g属性,讄字体QStyleQ提供size hintsQ以及信h机制{?

 

QGraphicsLayout是专门用来布局QGraphicsWidget的布局控g。你可以通过多重l承QGraphicsLayoutItem来定制QGraphicsItem使其能被QGraphicsLayout所理

嵌入普通控?/h3>

你可以通过QGraphicsScene::addWidget来将一个普通QWidget嵌入到视图体pM来用,本质是通过创徏一个代理控?QQGraphicsProxyWidget)来在QWidget和QGraphicsItem之间传递事件。需要注意的是,q只是一个特D的实现方式Q?Ҏ能有要求的E序不宜使用q个机制。(没有太看出哪里对性能有很大媄响)

 

QGraphicsProxyWidget能够处理复杂的控件嵌套,甚至能自动对被嵌套控件的子Popup Window控g创徏代理控g?
 

QGraphicsView本n也是一个普通QWidget控gQ所以可以被d到Scene中,创徏复杂的嵌套视图体p?



c米 2013-02-06 10:38 发表评论
]]>子窗?停靠 http://www.shnenglu.com/zhonghua/archive/2013/02/06/197751.htmlc米c米Wed, 06 Feb 2013 02:00:00 GMThttp://www.shnenglu.com/zhonghua/archive/2013/02/06/197751.htmlhttp://www.shnenglu.com/zhonghua/comments/197751.htmlhttp://www.shnenglu.com/zhonghua/archive/2013/02/06/197751.html#Feedback0http://www.shnenglu.com/zhonghua/comments/commentRss/197751.htmlhttp://www.shnenglu.com/zhonghua/services/trackbacks/197751.html QRect rectWorkArea = qApp->desktop()->availableGeometry();
 QPoint ptLeftTop = geometry().topRight() + QPoint(2, 0);
 QSize sizeSettingsWindow = m_pSettingsWindow->size();
 if(ptLeftTop.x() + sizeSettingsWindow.width() > rectWorkArea.right())
  ptLeftTop.setX(rectWorkArea.right() - sizeSettingsWindow.width());
 m_pSettingsWindow->move(ptLeftTop);

c米 2013-02-06 10:00 发表评论
]]>
正则表达式语?/title><link>http://www.shnenglu.com/zhonghua/archive/2012/10/23/193715.html</link><dc:creator>c米</dc:creator><author>c米</author><pubDate>Tue, 23 Oct 2012 03:03:00 GMT</pubDate><guid>http://www.shnenglu.com/zhonghua/archive/2012/10/23/193715.html</guid><wfw:comment>http://www.shnenglu.com/zhonghua/comments/193715.html</wfw:comment><comments>http://www.shnenglu.com/zhonghua/archive/2012/10/23/193715.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/zhonghua/comments/commentRss/193715.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/zhonghua/services/trackbacks/193715.html</trackback:ping><description><![CDATA[<div><p>一个正则表辑ּ是由普通字W(例如字符 a ?zQ以及特D字W(UCؓ<em>元字W?/em>Q组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符丌Ӏ正则表辑ּ作ؓ一个模板,某个字W模式与所搜烦的字W串q行匚w?/p><p>q里有一些可能会遇到的正则表辑ּCZQ?/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%">匚w</th> </tr><tr valign="top"> <td width="30%">/^\[ \t]*$/</td> <td width="30%">"^\[ \t]*$"</td> <td width="40%">匚w一个空白行?/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 L是否׃?位数字,一个连字符以及一?位数字组成?/td> </tr><tr valign="top"> <td width="30%">/<(.*)>.*<\/\1>/</td> <td width="30%">"<(.*)>.*<\/\1>"</td> <td width="40%">匚w一?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%">下一个字W标Cؓ一个特D字W、或一个原义字W、或一?后向引用、或一个八q制转义W。例如,'n' 匚w字符 "n"?\n' 匚w一个换行符。序?'\\' 匚w "\" ?"\(" 则匹?"("?/td> </tr><tr valign="top"> <td width="16%">^</td> <td width="84%">匚w输入字符串的开始位|。如果设|了 <strong>RegExp</strong> 对象?<strong>Multiline</strong> 属性,^ 也匹?'\n' ?'\r' 之后的位|?/td> </tr><tr valign="top"> <td width="16%">$</td> <td width="84%">匚w输入字符串的l束位置。如果设|了<strong>RegExp</strong> 对象?<strong>Multiline</strong> 属性,$ 也匹?'\n' ?'\r' 之前的位|?/td> </tr><tr valign="top"> <td width="16%">*</td> <td width="84%">匚w前面的子表达式零ơ或多次。例如,zo* 能匹?"z" 以及 "zoo"?* {h于{0,}?/td> </tr><tr valign="top"> <td width="16%">+</td> <td width="84%">匚w前面的子表达式一ơ或多次。例如,'zo+' 能匹?"zo" 以及 "zoo"Q但不能匚w "z"? {h?{1,}?/td> </tr><tr valign="top"> <td width="16%">?</td> <td width="84%">匚w前面的子表达式零ơ或一ơ。例如,"do(es)?" 可以匚w "do" ?"does" 中的"do" ? {h?{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}' 不能匚w "Bob" 中的 'o'Q但是能匚w "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,}' 不能匚w "Bob" 中的 'o'Q但能匹?"foooood" 中的所?o?o{1,}' {h?'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> 均ؓ非负整数Q其?em>n</em> <= <em>m</em>。最匹?<em>n</em> ơ且最多匹?<em>m</em> ơ。刘Q?"o{1,3}" 匹?"fooooood" 中的前三?o?o{0,1}' {h?'o?'。请注意在逗号和两个数之间不能有空根{?/td> </tr><tr valign="top"> <td width="16%">?</td> <td width="84%">当该字符紧跟在Q何一个其他限制符 (*, +, ?, {<em>n</em>}, {<em>n</em>,}, {<em>n</em>,<em>m</em>}) 后面Ӟ匚w模式是非贪婪的。非贪婪模式可能少的匹配所搜烦的字W串Q而默认的贪婪模式则尽可能多的匚w所搜烦的字W串。例如,对于字符?"oooo"Q?o+?' 匹配单?"o"Q?'o+' 匹配所?'o'?/td> </tr><tr valign="top"> <td width="16%">.</td> <td width="84%">匚w?"\n" 之外的Q何单个字W。要匚w包括 '\n' 在内的Q何字W,请用象 '[.\n]' 的模式?/td> </tr><tr valign="top"> <td width="16%">(<em>pattern</em>)</td> <td width="84%">匚w<em>pattern</em> q获取这一匚w。所获取的匹配可以从产生?Matches 集合得到Q在VBScript 中?<strong>SubMatches</strong> 集合Q在Visual Basic Scripting Edition 中则使用 <strong>$0</strong>…<strong>$9</strong> 属性。要匚w圆括号字W,请?'\(' ?'\)'?/td> </tr><tr valign="top"> <td width="16%">(?:<em>pattern</em>)</td> <td width="84%">匚w <em>pattern</em> 但不获取匚wl果Q也是说这是一个非获取匚wQ不q行存储供以后用。这在?"? 字符 (|) 来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 是一个比 'industry|industries' 更简略的表达式?/td> </tr><tr valign="top"> <td width="16%">(?=<em>pattern</em>)</td> <td width="84%">正向预查Q在M匚w <em>pattern</em> 的字W串开始处匚w查找字符丌Ӏ这是一个非获取匚wQ也是_该匹配不需要获取供以后使用。例如, 'Windows (?=95|98|NT|2000)' 能匹?"Windows 2000" 中的 "Windows" Q但不能匚w "Windows 3.1" 中的 "Windows"。预查不消耗字W,也就是说Q在一个匹配发生后Q在最后一ơ匹配之后立卛_始下一ơ匹配的搜烦Q而不是从包含预查的字W之后开始?/td> </tr><tr valign="top"> <td width="16%">(?!<em>pattern</em>)</td> <td width="84%">负向预查Q在M不匹配Negative lookahead matches the search string at any point where a string not matching <em>pattern</em> 的字W串开始处匚w查找字符丌Ӏ这是一个非获取匚wQ也是_该匹配不需要获取供以后使用。例?Windows (?!95|98|NT|2000)' 能匹?"Windows 3.1" 中的 "Windows"Q但不能匚w "Windows 2000" 中的 "Windows"。预查不消耗字W,也就是说Q在一个匹配发生后Q在最后一ơ匹配之后立卛_始下一ơ匹配的搜烦Q而不是从包含预查的字W之后开? </td> </tr><tr valign="top"> <td width="16%"><em>x</em>|<em>y</em></td> <td width="84%">匚w <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%">字符集合。匹配所包含的Q意一个字W。例如, '[abc]' 可以匚w "plain" 中的 'a'?</td> </tr><tr valign="top"> <td width="16%">[^<em>xyz</em>]</td> <td width="84%">负值字W集合。匹配未包含的Q意字W。例如, '[^abc]' 可以匚w "plain" 中的'p'?</td> </tr><tr valign="top"> <td width="16%">[<em>a-z</em>]</td> <td width="84%">字符范围。匹配指定范围内的Q意字W。例如,'[a-z]' 可以匚w 'a' ?'z' 范围内的L写字母字符?</td> </tr><tr valign="top"> <td width="16%">[^<em>a-z</em>]</td> <td width="84%">负值字W范围。匹配Q何不在指定范围内的Q意字W。例如,'[^a-z]' 可以匚wM不在 'a' ?'z' 范围内的L字符?</td> </tr><tr valign="top"> <td width="16%">\b</td> <td width="84%">匚w一个单词边界,也就是指单词和空格间的位|。例如, 'er\b' 可以匚w"never" 中的 'er'Q但不能匚w "verb" 中的 'er'?</td> </tr><tr valign="top"> <td width="16%">\B</td> <td width="84%">匚w非单词边界?er\B' 能匹?"verb" 中的 'er'Q但不能匚w "never" 中的 'er'?/td> </tr><tr valign="top"> <td width="16%">\c<em>x</em></td> <td width="84%">匚w?em>x</em>指明的控制字W。例如, \cM 匚w一?Control-M 或回车符?<em>x</em> 的值必Mؓ A-Z ?a-z 之一。否则,?c 视ؓ一个原义的 'c' 字符?</td> </tr><tr valign="top"> <td width="16%">\d</td> <td width="84%">匚w一个数字字W。等价于 [0-9]?</td> </tr><tr valign="top"> <td width="16%">\D</td> <td width="84%">匚w一个非数字字符。等价于 [^0-9]?</td> </tr><tr valign="top"> <td width="16%">\f</td> <td width="84%">匚w一个换늬。等价于 \x0c ?\cL?/td> </tr><tr valign="top"> <td width="16%">\n</td> <td width="84%">匚w一个换行符。等价于 \x0a ?\cJ?/td> </tr><tr valign="top"> <td width="16%">\r</td> <td width="84%">匚w一个回车符。等价于 \x0d ?\cM?/td> </tr><tr valign="top"> <td width="16%">\s</td> <td width="84%">匚wMI白字符Q包括空根{制表符、换늬{等。等价于 [ \f\n\r\t\v]?/td> </tr><tr valign="top"> <td width="16%">\S</td> <td width="84%">匚wM非空白字W。等价于 [^ \f\n\r\t\v]?/td> </tr><tr valign="top"> <td width="16%">\t</td> <td width="84%">匚w一个制表符。等价于 \x09 ?\cI?/td> </tr><tr valign="top"> <td width="16%">\v</td> <td width="84%">匚w一个垂直制表符。等价于 \x0b ?\cK?/td> </tr><tr valign="top"> <td width="16%">\w</td> <td width="84%">匚w包括下划U的M单词字符。等价于'[A-Za-z0-9_]'?</td> </tr><tr valign="top"> <td width="16%">\W</td> <td width="84%">匚wM非单词字W。等价于 '[^A-Za-z0-9_]'?</td> </tr><tr valign="top"> <td width="16%">\x<em>n</em></td> <td width="84%">匚w <em>n</em>Q其?<em>n</em> 为十六进制{义倹{十六进制{义值必Mؓ定的两个数字长。例如, '\x41' 匚w "A"?\x041' 则等价于 '\x04' & "1"。正则表辑ּ中可以?ASCII ~码?</td> </tr><tr valign="top"> <td width="16%">\<em>num</em></td> <td width="84%">匚w <em>num</em>Q其?<em>num</em> 是一个正整数。对所获取的匹配的引用。例如,'(.)\1' 匚w两个q箋的相同字W?</td> </tr><tr valign="top"> <td width="16%">\<em>n</em></td> <td width="84%">标识一个八q制转义值或一个后向引用。如?\<em>n</em> 之前臛_ <em>n</em> 个获取的子表辑ּQ则 <em>n</em> 为后向引用。否则,如果 <em>n</em> 为八q制数字 (0-7)Q则 <em>n</em> Z个八q制转义倹{?/td> </tr><tr valign="top"> <td width="16%">\<em>nm</em></td> <td width="84%">标识一个八q制转义值或一个后向引用。如?\<em>nm</em> 之前臛_有is preceded by at least <em>nm</em> 个获取得子表辑ּQ则 <em>nm</em> 为后向引用。如?\<em>nm</em> 之前臛_?<em>n</em> 个获取,?<em>n</em> Z个后跟文?<em>m </em>的后向引用。如果前面的条g都不满Q若  <em>n</em> ?<em>m</em> 均ؓ八进制数?(0-7)Q则 \<em>nm</em> 匹配八q制转义?<em>nm</em>?/td> </tr><tr valign="top"> <td width="16%">\<em>nml</em></td> <td width="84%">如果 <em>n</em> 为八q制数字 (0-3)Q且 <em>m</em> ?<em>l</em> 均ؓ八进制数?(0-7)Q则匚w八进制{义?<em>nml?/em></td> </tr><tr valign="top"> <td width="16%">\u<em>n</em></td> <td width="84%">匚w <em>n</em>Q其?<em>n</em> 是一个用四个十六q制数字表示?Unicode 字符。例如, \u00A9 匚w版权W号 (?)?/td> </tr> </tbody></table></div><img src ="http://www.shnenglu.com/zhonghua/aggbug/193715.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/zhonghua/" target="_blank">c米</a> 2012-10-23 11:03 <a href="http://www.shnenglu.com/zhonghua/archive/2012/10/23/193715.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> QT讄TableView的标题样?http://www.shnenglu.com/zhonghua/archive/2012/09/05/189601.htmlc米c米Wed, 05 Sep 2012 13:36:00 GMThttp://www.shnenglu.com/zhonghua/archive/2012/09/05/189601.htmlhttp://www.shnenglu.com/zhonghua/comments/189601.htmlhttp://www.shnenglu.com/zhonghua/archive/2012/09/05/189601.html#Feedback0http://www.shnenglu.com/zhonghua/comments/commentRss/189601.htmlhttp://www.shnenglu.com/zhonghua/services/trackbacks/189601.html

this->tableView->horizontalHeader()->setStyleSheet("QHeaderView::section {background-color:darkcyan;"
                                                       "color: black;padding-left: 4px;border: 1px solid #6c6c6c;}");


this->tableView->verticalHeader()->setStyleSheet("QHeaderView::section {background-color:darkcyan;"
                                                     "color: black;padding-left: 4px;border: 1px solid #6c6c6c;}");

 

以下好看的样式来自于http://blog.csdn.net/zenwanxin/article/details/6524559

tableView->horizontalHeader()->setStyleSheet

("QHeaderView::section {background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1,"

"stop:0 #616161, stop: 0.5 yellow,stop: 0.6 green, stop:1 cyan);"
"color: white;padding-left: 4px;border: 1px solid #6c6c6c;}"
"QHeaderView::section:checked{background-color: red;}"
"QHeaderView::down-arrow {image: url(down_arrow.png);}"
"QHeaderView::up-arrow {image: url(up_arrow.png);}");



c米 2012-09-05 21:36 发表评论
]]>
? l典SQL语句大全 http://www.shnenglu.com/zhonghua/archive/2012/08/30/188707.htmlc米c米Thu, 30 Aug 2012 01:43:00 GMThttp://www.shnenglu.com/zhonghua/archive/2012/08/30/188707.htmlhttp://www.shnenglu.com/zhonghua/comments/188707.htmlhttp://www.shnenglu.com/zhonghua/archive/2012/08/30/188707.html#Feedback0http://www.shnenglu.com/zhonghua/comments/commentRss/188707.htmlhttp://www.shnenglu.com/zhonghua/services/trackbacks/188707.html阅读全文

c米 2012-08-30 09:43 发表评论
]]>
如何实现QTH口背景囄随窗口大而变?备忘)http://www.shnenglu.com/zhonghua/archive/2012/08/28/188505.htmlc米c米Tue, 28 Aug 2012 02:56:00 GMThttp://www.shnenglu.com/zhonghua/archive/2012/08/28/188505.htmlhttp://www.shnenglu.com/zhonghua/comments/188505.htmlhttp://www.shnenglu.com/zhonghua/archive/2012/08/28/188505.html#Feedback0http://www.shnenglu.com/zhonghua/comments/commentRss/188505.htmlhttp://www.shnenglu.com/zhonghua/services/trackbacks/188505.html
Ҏ一Q用paintEvent
C/C++ code
void Widget::paintEvent(QPaintEvent *e)
{ QPainter painter(this);
 painter.drawPixmap(0,0,this->width(),this->height(),QPixmap(":/xxx.png"));
 }


Ҏ二:使用setStyleSheet
C/C++ code
widget->setStyleSheet("border-image: url(:/xxx.png)");


c米 2012-08-28 10:56 发表评论
]]>
?Qt QSqlTableModel 使用心得 http://www.shnenglu.com/zhonghua/archive/2012/08/20/187749.htmlc米c米Mon, 20 Aug 2012 03:24:00 GMThttp://www.shnenglu.com/zhonghua/archive/2012/08/20/187749.htmlhttp://www.shnenglu.com/zhonghua/comments/187749.htmlhttp://www.shnenglu.com/zhonghua/archive/2012/08/20/187749.html#Feedback0http://www.shnenglu.com/zhonghua/comments/commentRss/187749.htmlhttp://www.shnenglu.com/zhonghua/services/trackbacks/187749.html

Qt  QSqlTableModel  使用心得

q接数据?/strong>

执行sql查询Q条件显C,排序

获取记录敎ͼ列数以及记录内容Q字D内?/strong>

新增Q修改,删除Q恢?/strong>

其它

 

 

1---------------q接数据库(我用的access2003做实验)

?pro文gd

QT  +=SQL

win32:CONFIG+=console

 

------------------------MAIN.CPP---------------

#include <QtGui/QApplication>

#include <QSqlDatabase>

#include <QSqlQuery>

#include <QDebug>

#include <QVariant>

#include <QString>

#include <QSqlTableModel>

#include <QTableView>

#include "mainwindow.h"

int main(intargc, char *argv[])

{

    QApplication a(argc, argv);

   // MainWindow w;

    //w.show();

    QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");

    db.setDatabaseName("DRIVER={Microsoft AccessDriver (*.mdb)};FIL={MS Access};DBQ=barcode.mdb;UID='';PWD=''");

    bool ok = db.open();

    if(ok)

    {

        qDebug()<<"connect ok!";

    }

    else

    {

        qDebug()<<"connect error!";

        return false;

    }

    return a.exec();

}

2-----执行sql查询Q条件显C,排序

查询Q?/strong>

model = newQSqlTableModel(this);
model->setTable(“student”);
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
model->select(); //选取整个表的所有行
// model->removeColumn(1); //不显C第二列,如果q时d记录Q则该属性的值添加不?/p>

QTableView *view= new QTableView;

        view->setModel(model);

        view->show();

//View->setEditTriggers(QAbstractItemView::NoEditTriggers);  使其不可~辑

条gQ({h于SQL语句的whereQ?/strong>

model->setFilter(QObject::tr(“name= ‘admin’”).arg(name)); //Ҏ姓名q行{?br />     model->select(); //昄l果

排序:({h于ORDERBY)
   model->setSort(0,Qt::AscendingOrder); //id属性,即第0列,升序排列
   model->select();


    model->setSort(0,Qt::DescendingOrder); //id属性,即第0列,降序?br />     model->select();

3------获取记录敎ͼ列数以及记录内容Q字D内?/strong>

记录敎ͼ Model->rowcount

记录|

?model.record(num).value(1).toString(); 

Qrecord record= QSqlRecord record = tablemodel.record(记录行数); 

?Record.value(“字段名或索引”)

字段敎ͼ

字段|

 

4------新增Q修改,删除,提交Q撤销

新增Q?/strong>

    int rowNum = model->rowCount();//获得表的行数
   int id = 10;
    model->insertRow(rowNum); //d一?br />     model->setData(model->index(rowNum,0),id);
    //model->submitAll(); //可以直接提交

或者用recordd

QSqlRecord record = tablemodel.record();

record.setValue("nam","new");

model.insertRecord(1,record);

 

修改Q?/strong>

首先用条件找到某一条记?/p>

QSqlRecord record = tablemodel.record(num);

record.setValue("name",record.value("name").toString()+"2");

tablemodel.setRecord(num,record);

if(tablemodel.submitAll())

"成功Q?

else

"p|Q?

或者用下面Ҏ用setData()来修改,代码如下Q?nbsp;
model.setData(model.index(1,1),"new");
 
if(tablemodel.submitAll()) 
   "成功Q?
else 
   "p|Q?


删除Q?/strong>
    int curRow = ui->tableView->currentIndex().row();
    //获取选中的行
    model->removeRow(curRow);
    //删除该行
    int ok = QMessageBox::warning(this,tr(“删除当前?”),tr(“你确?#8221;
                                                          “删除当前行吗Q?#8221;),
                        QMessageBox::Yes,QMessageBox::No);
    if(ok == QMessageBox::No)
    {
       model->revertAll();//如果不删除,则撤销
    }
    else model->submitAll(); //否则提交Q在数据库中删除该行

如果没有table

tablemodel.removeRows(起始? 要删除的总行?; 
model.submitAll(); 


提交  

    model->database().transaction();//开始事务操?br />     if (model->submitAll()) {
        model->database().commit();//提交
    } else {
        model->database().rollback();//回滚
        QMessageBox::warning(this,tr(“tableModel”),
                            tr(“数据库错? %1″)
                            .arg(model->lastError().text()));
    }

撤销  

  model->revertAll();

5------其它

 



he QSqlTableModel class provides an editable data model for a single database table. More...

  1. <span class="preprocessor" style="color:#404040">#include <QSqlTableModel></span>  

Inherits: QSqlQueryModel.

Inherited by: QSqlRelationalTableModel.

Public Types

enum EditStrategy { OnFieldChange, OnRowChange, OnManualSubmit }

Public Functions

  QSqlTableModel ( QObject * parent = 0, QSqlDatabase db = QSqlDatabase() )
virtual ~QSqlTableModel ()
QSqlDatabase database () const
EditStrategy editStrategy () const
int fieldIndex ( const QString & fieldName ) const
QString filter () const
bool insertRecord ( int row, const QSqlRecord & record )
bool isDirty ( const QModelIndex & index ) const
QSqlIndex primaryKey () const
virtual void revertRow ( int row )
virtual bool select ()
virtual void setEditStrategy ( EditStrategy strategy )
virtual void setFilter ( const QString & filter )
bool setRecord ( int row, const QSqlRecord & record )
virtual void setSort ( int column, Qt::SortOrder order )
virtual void setTable ( const QString & tableName )
QString tableName () const

Reimplemented Public Functions

virtual void clear ()
virtual QVariant data ( const QModelIndex & index, int role = Qt::DisplayRole ) const
virtual Qt::ItemFlags flags ( const QModelIndex & index ) const
virtual QVariant headerData ( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const
virtual bool insertRows ( int row, int count, const QModelIndex & parent = QModelIndex() )
virtual bool removeColumns ( int column, int count, const QModelIndex & parent = QModelIndex() )
virtual bool removeRows ( int row, int count, const QModelIndex & parent = QModelIndex() )
virtual int rowCount ( const QModelIndex & parent = QModelIndex() ) const
virtual bool setData ( const QModelIndex & index, const QVariant & value, int role = Qt::EditRole )
virtual void sort ( int column, Qt::SortOrder order )

Public Slots

virtual void revert ()
void revertAll ()
virtual bool submit ()
bool submitAll ()

Signals

void beforeDelete ( int row )
void beforeInsert ( QSqlRecord & record )
void beforeUpdate ( int row, QSqlRecord & record )
void primeInsert ( int row, QSqlRecord & record )

Protected Functions

virtual bool deleteRowFromTable ( int row )
QModelIndex indexInQuery ( const QModelIndex & item ) const
virtual bool insertRowIntoTable ( const QSqlRecord & values )
virtual QString orderByClause () const
virtual QString selectStatement () const
void setPrimaryKey ( const QSqlIndex & key )
void setQuery ( const QSqlQuery & query )
virtual bool updateRowInTable ( int row, const QSqlRecord & values )


c米 2012-08-20 11:24 发表评论
]]>
?Template+=fakelib 记 http://www.shnenglu.com/zhonghua/archive/2012/08/17/187480.htmlc米c米Fri, 17 Aug 2012 06:01:00 GMThttp://www.shnenglu.com/zhonghua/archive/2012/08/17/187480.htmlhttp://www.shnenglu.com/zhonghua/comments/187480.htmlhttp://www.shnenglu.com/zhonghua/archive/2012/08/17/187480.html#Feedback0http://www.shnenglu.com/zhonghua/comments/commentRss/187480.htmlhttp://www.shnenglu.com/zhonghua/services/trackbacks/187480.html可能大家或多或少都在qmake?pro/.pri文g中见q这U代?br />
TEMPLATE += fakelib
MY_NAME = $$qtLibraryTarget(dbzhang800)
TEMPLATE -= fakelib

如果真的没见q,或许可以从这儿入手分析与学习Qt Solution对qmake的?br />$$qtLibraryTarget 有什么用

我们知道Q在Window下,动态库?Debug ?Release 版不能通用Q所以要攄在不同的路径下或者取不同的名字。在Qt下,我们l常见到

    QtCore4.dll

    QtCored4.dll

而当我们自己的工E中需要动态库Ӟ要想在兼֐个^CQ给它取个合适的名字q是有点小的挑战的?br />
既然Qt已经能处理自q动态库Q我们不妨直接借用它提供的机制Q这便是

$$qtLibraryTarget

    作用Qؓ各个q_下的库生成合适的名字
    位置Q?QTDIR/mkspecs/features/qt_functions.prf
    具体代码Q?br />
defineReplace(qtLibraryTarget) {
   unset(LIBRARY_NAME)
   LIBRARY_NAME = $$1
   mac:!static:contains(QT_CONFIG, qt_framework) {
      QMAKE_FRAMEWORK_BUNDLE_NAME = $$LIBRARY_NAME
      export(QMAKE_FRAMEWORK_BUNDLE_NAME)
   }
   contains(TEMPLATE, .*lib):CONFIG(debug, debug|release) {
      !debug_and_release|build_pass {
          mac:RET = $$member(LIBRARY_NAME, 0)_debug
              else:win32:RET = $$member(LIBRARY_NAME, 0)d
      }
   }
   isEmpty(RET):RET = $$LIBRARY_NAME
   return($$RET)
}

注:q是Qt4.8下的文gQQt5.0下与此小有不同?br />
从这儿你可以看到Q在windows下它何时会添加一个dQ何时不会?br />fakelib q嘛用的

从前面的代码中,我们看到有这么一?br />
   contains(TEMPLATE, .*lib)

可是Q当构徏动态库Ӟ不是TEMPLATE实是 lib/vclibq些了么Q?br />
恩,构徏时没有问题,可是当用时呢?比如

TEMPLATE = app
SOURCES += main.cpp

LIBS += $$qtLibraryTarget(dbzhang800)

q能工作么?

恩,所以了。就需要随便取一?xxxxxlib 作ؓ模板来哄骗一下它?br />q没l束Q?br />
自从认识它以后,一直在自己的程序中大量使用q个东西。但是有一件事情L让h感觉不爽?br />
使用它以后:

qmake -tp vc

生成的MSVC的工E文件中QL不能得到正确库文件的名字Q具体一点,是Debug模式下没有那个dQ?br />
自己用也没什么,反正也不是什么大问题。只是没惛_解决Ҏ竟是q样

SAVE_TEMPLATE = $$TEMPLATE
TEMPLATE = fakelib
MY_NAME = $$qtLibraryTarget(dbzhang800)
TEMPLATE = $$SAVE_TEMPLATE

原因

当qmake使用?-tp 选项后,对TEMPLATE处理Ӟ只接受一个倹{也是 += 操作对其无效?br />
具体一点,位于qmake源码 project.cpp ?043?br />
    } else if(var == QLatin1String("TEMPLATE")) {
        if(!Option::user_template.isEmpty()) {
            var = ".BUILTIN.USER." + var;
            place[var] =  QStringList(Option::user_template);
        } else {
            QString orig_template, real_template;
            if(!place[var].isEmpty())
                orig_template = place[var].first();
            real_template = orig_template.isEmpty() ? "app" : orig_template;
            if(!Option::user_template_prefix.isEmpty() && !orig_template.startsWith(Option::user_template_prefix))
                real_template.prepend(Option::user_template_prefix);
            if(real_template != orig_template) {
                var = ".BUILTIN." + var;
                place[var] = QStringList(real_template);
            }
        }

c米 2012-08-17 14:01 发表评论
]]>
?正确收到Qt属性控件中输入框消?/title><link>http://www.shnenglu.com/zhonghua/archive/2012/08/17/187479.html</link><dc:creator>c米</dc:creator><author>c米</author><pubDate>Fri, 17 Aug 2012 05:52:00 GMT</pubDate><guid>http://www.shnenglu.com/zhonghua/archive/2012/08/17/187479.html</guid><wfw:comment>http://www.shnenglu.com/zhonghua/comments/187479.html</wfw:comment><comments>http://www.shnenglu.com/zhonghua/archive/2012/08/17/187479.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/zhonghua/comments/commentRss/187479.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/zhonghua/services/trackbacks/187479.html</trackback:ping><description><![CDATA[<div><p>QtPropertyBrowser2.5中的字符串属性对应的修改方式是一个输入框,OnValueChange是在每次键入字符时发送一?q个对于~辑器需要的逻辑来说是一U灾? Ogitor修改了其源码,解决了这个问?</p><div><p> </p></div><div>qteditorfactory.h ?br /><br />QtLineEditFactorycL加如下代?U色标识<br /><br />class QT_QTPROPERTYBROWSER_EXPORT QtLineEditFactory : public QtAbstractEditorFactory<QtStringPropertyManager><br />{<br />    Q_OBJECT<br />public:<br />    QtLineEditFactory(QObject *parent = 0);<br />    ~QtLineEditFactory();<br />protected:<br />    void connectPropertyManager(QtStringPropertyManager *manager);<br />    QWidget *createEditor(QtStringPropertyManager *manager, QtProperty *property,<br />                QWidget *parent);<br />    void disconnectPropertyManager(QtStringPropertyManager *manager);<br />private:<br />    QtLineEditFactoryPrivate *d_ptr;<br />    Q_DECLARE_PRIVATE(QtLineEditFactory)<br />    Q_DISABLE_COPY(QtLineEditFactory)<br />    Q_PRIVATE_SLOT(d_func(), void slotPropertyChanged(QtProperty *, const QString &))<br />    Q_PRIVATE_SLOT(d_func(), void slotRegExpChanged(QtProperty *, const QRegExp &))<br />    Q_PRIVATE_SLOT(d_func(), void slotSetValue(const QString &))<br />    Q_PRIVATE_SLOT(d_func(), void slotEditingFinished())<br />    Q_PRIVATE_SLOT(d_func(), void slotEditorDestroyed(QObject *))<br />};<br /><br /> <br /><br />qteditorfactory.cpp?br /><br />class QtLineEditFactoryPrivate : public EditorFactoryPrivate<QLineEdit><br />{<br />    QtLineEditFactory *q_ptr;<br />    Q_DECLARE_PUBLIC(QtLineEditFactory)<br />public:<br /><br />    void slotPropertyChanged(QtProperty *property, const QString &value);<br />    void slotRegExpChanged(QtProperty *property, const QRegExp &regExp);<br />    void slotSetValue(const QString &value);<br />    void slotEditingFinished();<br />};<br /><br />void QtLineEditFactoryPrivate::slotEditingFinished()<br />{<br />    QObject *object = q_ptr->sender();<br />    const QMap<QLineEdit *, QtProperty *>::ConstIterator ecend = m_editorToProperty.constEnd();<br />    for (QMap<QLineEdit *, QtProperty *>::ConstIterator itEditor = m_editorToProperty.constBegin(); itEditor != ecend; ++itEditor)<br />        if (itEditor.key() == object) {<br />            QtProperty *property = itEditor.value();<br />            QtStringPropertyManager *manager = q_ptr->propertyManager(property);<br />            if (!manager)<br />                return;<br />            QString value = static_cast<QLineEdit*>(itEditor.key())->text();<br />            manager->setValue(property, value);<br />            return;<br />        }<br />}<br /><br />QWidget *QtLineEditFactory::createEditor(QtStringPropertyManager *manager,<br />        QtProperty *property, QWidget *parent)<br />{<br /><br />    QLineEdit *editor = d_ptr->createEditor(property, parent);<br />    QRegExp regExp = manager->regExp(property);<br />    if (regExp.isValid()) {<br />        QValidator *validator = new QRegExpValidator(regExp, editor);<br />        editor->setValidator(validator);<br />    }<br />    editor->setText(manager->value(property));<br /><br />    connect(editor, SIGNAL(editingFinished()),<br />                this, SLOT(slotEditingFinished()));<br />    connect(editor, SIGNAL(destroyed(QObject *)),<br />                this, SLOT(slotEditorDestroyed(QObject *)));<br />    return editor;<br />}<br /><br /> <br /><br />q样既可在输入回车键,或者输入框失去焦点后生一个OnValueChange事g</div><br /> </div><img src ="http://www.shnenglu.com/zhonghua/aggbug/187479.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/zhonghua/" target="_blank">c米</a> 2012-08-17 13:52 <a href="http://www.shnenglu.com/zhonghua/archive/2012/08/17/187479.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>国际化备忘(多个译文gl合Q?/title><link>http://www.shnenglu.com/zhonghua/archive/2012/08/02/186044.html</link><dc:creator>c米</dc:creator><author>c米</author><pubDate>Thu, 02 Aug 2012 08:37:00 GMT</pubDate><guid>http://www.shnenglu.com/zhonghua/archive/2012/08/02/186044.html</guid><wfw:comment>http://www.shnenglu.com/zhonghua/comments/186044.html</wfw:comment><comments>http://www.shnenglu.com/zhonghua/archive/2012/08/02/186044.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/zhonghua/comments/commentRss/186044.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/zhonghua/services/trackbacks/186044.html</trackback:ping><description><![CDATA[<div>lrelease  zhu_zh.ts 1_zh.ts -qm aaa.qm</div><img src ="http://www.shnenglu.com/zhonghua/aggbug/186044.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/zhonghua/" target="_blank">c米</a> 2012-08-02 16:37 <a href="http://www.shnenglu.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.shnenglu.com/zhonghua/archive/2012/07/20/184345.html</link><dc:creator>c米</dc:creator><author>c米</author><pubDate>Fri, 20 Jul 2012 06:14:00 GMT</pubDate><guid>http://www.shnenglu.com/zhonghua/archive/2012/07/20/184345.html</guid><wfw:comment>http://www.shnenglu.com/zhonghua/comments/184345.html</wfw:comment><comments>http://www.shnenglu.com/zhonghua/archive/2012/07/20/184345.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/zhonghua/comments/commentRss/184345.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/zhonghua/services/trackbacks/184345.html</trackback:ping><description><![CDATA[<div>使用setStyleSheet来设|图形界面的外观Q?br /> QT Style Sheets是一个很有利的工P允许定制H口的外观,<br /> 此外q可以用子类QStyle来完成,他的语法很大比重来源于html的CSSQ但是适用于窗?br /> <strong>概括Q?/strong><br /> Style Sheets是文字性的讑֮Q对于整个应用程序可以用QApplication::setStyleSheet() 或者对应一个窗口可以用QWidget::setStyleSheet()Q如果好几个样式表在不同的层ơ上讑֮Q?br /> QT会集合所有的样式表来讑֮外观Q这UCU串?br /> 例如Q下面的样式表指定所有的QLineEdit应该用黄色作Z们的背景颜色Q所有的核对框应该用U色作ؓ他们的文本颜?br /> <div><div class="nlfhpll" id="code0"><ol><li>QLineEdit { background: yellow }<br /> </li><li>QCheckBox { color: red }</li></ol></div><em>复制代码</em></div>对于q种定制Q样式表比palette调色板更强大Q例如用QPalette::Button role来设定一个按钮ؓU色可能引v危险<br /> 对于单独使用QPalette很难完成的定Ӟ样式表可以指定样式表作用于当前窗口样式顶部,q意呌应用E序讲看h可能的自然Q但是Q何样式表pȝ 参数应该考虑Q不像QPalette那样Q样式表提供查,如果你设定了一个按钮的背景颜色为红Ԍ你应该确定在所有的q_按钮会有一个红色的背景Q除 此,Qt Designer提供样式表集成环境,使得在不同的H口样式中更Ҏ看到样式表的效果<br /> 此外Q样式表可以用来Z的应用程序提供一个出众的外观Q不需要用子cQStyle,例如Q可以指定Q意的囄为单选按钮和核对按钮Q来使它们出众,?用这个技术,也可以获得辅助的定制Q这用几个子c,例如指定style hint(样式暗示),可以参看例子 Style Sheet?br /> 当样式表有效时候,使用QWidget::style()可以q回QStyle,<br /> 样式表语法:<br /> 样式表语法基本和HTML CSS语法一致?br /> 样式表包含了样式规则序列Q样式规则有一?lt;selector>?lt;declaration>l成Q?lt;selector>指定哪些H口会被这些规则媄响,<declaration>指定哪些属性将会被讑֮在窗口上Q例?br /> QPushButton{color:red}<br /> 在上面的Q规则中QQPushButton?lt;selector>Q{color:red}?lt;declaration>Q这个规则指定QPushButton和他的子cd使用U色作ؓ前景颜色Q就是字体颜Ԍq且对大写没有分别Q对?br /> colorQColoR,COLOR是一L?br /> 几个<selector>可以同时被列出,使用逗号","来分开各个<selector>Q例如:<br /> QPushButton, QLineEdit, QComboBox { color: red }<br /> <declaration>部分是一?属性:?nbsp; 对,用{}来括hQ用分h分开各个属性,例如<br /> QPushButton { color: red; background-color: white }<br /> 可以参看Qt Style Sheets Reference来查看部件以及样式表的属性列?br /> 关于样式表的U联属?br /> 看下面代码的不同<br /> <div><div class="b1v9vvh" id="code1"><ol><li>btn1->setStyleSheet("QPushButton{color:red}"); //讑֮前景颜色Q就是字体颜?br /> </li><li> btn1->setStyleSheet("QPushButton{background:yellow}"); //讑֮背景颜色为红?/li></ol></div><em>复制代码</em></div>?br /> <div><div class="xl1txxr" id="code2"><ol><li>btn1->setStyleSheet("QPushButton{color:redQbackground:yellow}");</li></ol></div><em>复制代码</em></div>W一个代码只能显C黄色背景,W二个确实红色字体,黄色背景Q?br /> 所以当讑֮一个部件时候,要在同一?gt;setStyleSheet()中完全写出来?br /> 源代码示例:<br /> <div class="tp73hnh" id="code3"><ol><li>Dialog::Dialog(QWidget *parent) :<br /> </li><li>    QDialog(parent),<br /> </li><li>    ui(new Ui::Dialog)<br /> </li><li>{<br /> </li><li>    ui->setupUi(this);<br /> </li><li>    this->setWindowFlags(this->windowFlags()&Qt::WindowMaximizeButtonHint&Qt::WindowMinimizeButtonHint); //为对话框d上最大化和最化按钮<br /> </li><li>//    layout=new QBoxLayout(this);<br /> </li><li>    layout1=new QGridLayout(this);<br /> </li><li>    btn1=new QPushButton(this);<br /> </li><li>    btn1->setStyleSheet("QPushButton{color:red;background:yellow}"); //讑֮前景颜色Q就是字体颜?br /> </li><li>//    btn1->setStyleSheet("QPushButton{background:yellow}");<br /> </li><li>    btn1->setText("Button1");<br /> </li><li>    btn2=new QPushButton(this);<br /> </li><li>    btn2->setStyleSheet("QPushButton{color:red;background-color:#c89b64}"); //使用rgb来设定背景颜?br /> </li><li>    btn2->setText("Button2");<br /> </li><li>     btn3=new QPushButton(this);<br /> </li><li>     btn3->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>     //讑֮按钮的背景图?background-repeat可以讑֮背景囄的重复规则,q里讑֮仅在xy方向都重复,所以图片会被重复一?br /> </li><li>     //background-position用来讑֮囄的位|,是左(left)q是?right)Q还是在中间(center),是上(top)q是底部(bottom)<br /> </li><li>     //background-attachment用来q定背景囄是否卷动或者和H口大小相匹配,默认是卷动的<br /> </li><li>     btn3->setText("Button3");<br /> </li><li>     btn4=new QPushButton(this);<br /> </li><li>     btn4->setStyleSheet("QPushButton{border: 3px solid red;border-radius:8px}"); //讑֮Ҏ宽度以及颜色<br /> </li><li>     //可以使用border-topQborder-rightQborder-bottomQborder-left分别讑֮按钮的上下左双框,<br /> </li><li>     //同样有border-left-color, border-left-style, border-left-width.{分别来讑֮他们的颜Ԍ样式和宽?br /> </li><li>     //border-image用来讑֮Ҏ的背景图片?br /> </li><li>     //border-radius用来讑֮Ҏ的弧度。可以设定圆角的按钮<br /> </li><li>     btn4->setText("Button4");<br /> </li><li>     //字体讑֮<br /> </li><li>     //font-family来设定字体所属家族,<br /> </li><li>     //font-size来设定字体大?br /> </li><li>     //font-style来设定字体样?br /> </li><li>     //font-weight来设定字体深?br /> </li><li>     //height用来讑֮光?br /> </li><li>     //selection-color用来讑֮选中时候的颜色<br /> </li><li>     edit1=new QLineEdit(this);<br /> </li><li>     edit1->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>     //父窗口的讑֮<br /> </li><li>     //icon-size来设定图片大?br /> </li><li>     this->setWindowIcon(QIcon("image/1.png"));<br /> </li><li>      this->setStyleSheet("QWidget{background:write url(image/2.png);icon-size:20px 5px}");  //讑֮整个对话框的背景颜色<br /> </li><li>//      this->setStyleSheet("QWidget{icon-size:20px 5px}");<br /> </li><li>    layout1->addWidget(btn1,0,0);<br /> </li><li>    layout1->addWidget(btn2,0,1);<br /> </li><li>    layout1->addWidget(btn3,1,0);<br /> </li><li>    layout1->addWidget(btn4,1,1);<br /> </li><li>     layout1->addWidget(edit1,2,0);<br /> </li><li>}</li></ol></div></div><img src ="http://www.shnenglu.com/zhonghua/aggbug/184345.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/zhonghua/" target="_blank">c米</a> 2012-07-20 14:14 <a href="http://www.shnenglu.com/zhonghua/archive/2012/07/20/184345.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> QTreeview 选中?branch区域背景为高亮的色. http://www.shnenglu.com/zhonghua/archive/2012/07/20/184321.htmlc米c米Fri, 20 Jul 2012 04:13:00 GMThttp://www.shnenglu.com/zhonghua/archive/2012/07/20/184321.htmlhttp://www.shnenglu.com/zhonghua/comments/184321.htmlhttp://www.shnenglu.com/zhonghua/archive/2012/07/20/184321.html#Feedback0http://www.shnenglu.com/zhonghua/comments/commentRss/184321.htmlhttp://www.shnenglu.com/zhonghua/services/trackbacks/184321.html

//如果讄 show-decoration-selected:1会导致点击选中?前面branch区域背景为高亮的色.

    ui->treeView->setVerticalScrollBarPolicy ( Qt::ScrollBarAlwaysOff ) ;

              ui->treeView->setStyleSheet(   \
                      " QTreeView { \
                                    show-decoration-selected: 0; \
                                } \
                                \
                                QTreeView::item { \
                                    show-decoration-selected: 0; \
                                    background-image:url(image/list_bg02.png); \
                                } \
                                QTreeView::item:selected{ \
                                    background-image:url(image/list_bg01a.png); \
                                }  \
             QTreeView::branch { \
                      selection-color: transparent; \
              } \
              QTreeView::branch:closed:has-children:has-siblings { \
                      image: url(image/icon_add.png); \
              } \
               \
              QTreeView::branch:has-children:!has-siblings:closed { \
                      image: url(image/icon_add.png); \
              } \
               \
              QTreeView::branch:open:has-children:has-siblings { \
                      image: url(image/icon_reduce.png); \
              } \
\
              QTreeView::branch:open:has-children:!has-siblings { \
                      image: url(image/icon_reduce.png); \
              }");

 


    ui->treeView->setAttribute(Qt::WA_MacShowFocusRect, 0);
    ui->treeView->setFocusPolicy(Qt::NoFocus);
    ui->treeView->setEditTriggers(QAbstractItemView::NoEditTriggers);

c米 2012-07-20 12:13 发表评论
]]>
? QT控制选中item的文字颜?HighlightedText) http://www.shnenglu.com/zhonghua/archive/2012/07/20/184320.htmlc米c米Fri, 20 Jul 2012 04:12:00 GMThttp://www.shnenglu.com/zhonghua/archive/2012/07/20/184320.htmlhttp://www.shnenglu.com/zhonghua/comments/184320.htmlhttp://www.shnenglu.com/zhonghua/archive/2012/07/20/184320.html#Feedback0http://www.shnenglu.com/zhonghua/comments/commentRss/184320.htmlhttp://www.shnenglu.com/zhonghua/services/trackbacks/184320.html

  默认的情况下QQTableView,QTableWidget{控Ӟ当item选中后其背景色ؓ蓝色的,文字颜色(前景?为白色的Q如图:

        默认的item选中后的背景?白色)

 

    如果我们惛_态的更改item的前景色Q例如值大于零昄U色Q小于零昄l色Q,q且选中后文字颜色不?q个是我惛_现的Q其实就是模仿一般的股票h图表)Q怎么办呢Q?首先在添加或者修改item的时候,可以使用:

 model->item(row, column)->setForeground(QBrush(QColor(255, 0, 0)));  //把表格的item的文字颜色设|ؓU色

但是只这栯是不够的Q这样只能保证在不选中的情况下昄为红Ԍ 若不做其他设|,选中后item的颜色照样变成白色的了?

 

    Ҏ我找C使用代理的方法,佉K中后的文字颜色和选中前的文字颜色一_也可以灵zM改)Q效果如下图Q代码随后?/p>

 

       //黄色的那行ؓ选中?/span>

 

 

   

  1. //委托(代理)   
  2. class ItemDelegate : public QItemDelegate  
  3. {  
  4.     Q_OBJECT  
  5. public:  
  6.     ItemDelegate()  
  7.     {  
  8.     }  
  9.     void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const  
  10.     {  
  11.         QStyleOptionViewItem  viewOption(option);  
  12.         //高亮昄与普通显C时的前景色一_即选中行和为选中时候的文字颜色一P   
  13.         viewOption.palette.setColor(QPalette::HighlightedText, index.data(Qt::ForegroundRole).value<QColor>());  
  14.         QItemDelegate::paint(painter, viewOption, index);  
  15.     }  
  16. };  
  1. //委托(代理)  
  2. class ItemDelegate : public QItemDelegate  
  3. {  
  4.     Q_OBJECT  
  5. public:  
  6.     ItemDelegate()  
  7.     {  
  8.     }  
  9.     void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const  
  10.     {  
  11.         QStyleOptionViewItem  viewOption(option);  
  12.         //高亮昄与普通显C时的前景色一_即选中行和为选中时候的文字颜色一P  
  13.         viewOption.palette.setColor(QPalette::HighlightedText, index.data(Qt::ForegroundRole).value<QColor>());  
  14.         QItemDelegate::paint(painter, viewOption, index);  
  15.     }  
  16. };  

 

   

  1. view = new QTableView;  
  2. model = new QStandardItemModel;  
  3. view->setModel(model);  
  4. view->setItemDelegate(new ItemDelegate);  
  1. view = new QTableView;  
  2. model = new QStandardItemModel;  
  3. view->setModel(model);  
  4. view->setItemDelegate(new ItemDelegate);  

 

  

  1. if (strList[2].toDouble() >= strList[3].toDouble())  
  2.     model->item(row, 2)->setForeground(QBrush(QColor(255, 0, 0)));  
  3. else  
  4.     model->item(row, 2)->setForeground(QBrush(QColor(0, 127, 0)));  
  5. if (strList[4].toDouble() >= strList[3].toDouble())  
  6.     model->item(row, 4)->setForeground(QBrush(QColor(255, 0, 0)));  
  7. else  
  8.     model->item(row, 4)->setForeground(QBrush(QColor(0, 127, 0)));  
  1. if (strList[2].toDouble() >= strList[3].toDouble())  
  2.     model->item(row, 2)->setForeground(QBrush(QColor(255, 0, 0)));  
  3. else  
  4.     model->item(row, 2)->setForeground(QBrush(QColor(0, 127, 0)));  
  5. if (strList[4].toDouble() >= strList[3].toDouble())  
  6.     model->item(row, 4)->setForeground(QBrush(QColor(255, 0, 0)));  
  7. else  
  8.     model->item(row, 4)->setForeground(QBrush(QColor(0, 127, 0))); 


c米 2012-07-20 12:12 发表评论
]]>
QTreeView 行高?,图标 http://www.shnenglu.com/zhonghua/archive/2012/07/20/184316.htmlc米c米Fri, 20 Jul 2012 03:23:00 GMThttp://www.shnenglu.com/zhonghua/archive/2012/07/20/184316.htmlhttp://www.shnenglu.com/zhonghua/comments/184316.htmlhttp://www.shnenglu.com/zhonghua/archive/2012/07/20/184316.html#Feedback0http://www.shnenglu.com/zhonghua/comments/commentRss/184316.htmlhttp://www.shnenglu.com/zhonghua/services/trackbacks/184316.html   // 样式

    ui->treeView->setStyleSheet(

            "QTreeView::item{height: 60px;show-decoration-selected: 0;background-image:url(image/list_content_bg.png);}"

            "QTreeView::item:selected{background-image:url(image/list_select_bg.png);}"

            );

 

//讄图标

QVariant data(const QModelIndex &index, int role)
{

if (!index.isValid())
    return QVariant();

if(role == Qt::UserRole)
{

}
 if(role ==Qt::BackgroundRole)
{
    QImage  image("image/list_bg02.png");
    return QBrush(image);
}

if(index.column()==0)
{

 

    if(role == Qt::DecorationRole)
    {
        QImage image;
        image.load("image/icon_user.png");
        return image;//QIcon("image/icon_user.png");
    }

}

图标大小  :属?iconSize

ui->treeView->setIconSize(QSize(32,32));

c米 2012-07-20 11:23 发表评论
]]>
?qt4 StyleSheet的ȝhttp://www.shnenglu.com/zhonghua/archive/2012/07/09/182430.htmlc米c米Mon, 09 Jul 2012 09:18:00 GMThttp://www.shnenglu.com/zhonghua/archive/2012/07/09/182430.htmlhttp://www.shnenglu.com/zhonghua/comments/182430.htmlhttp://www.shnenglu.com/zhonghua/archive/2012/07/09/182430.html#Feedback0http://www.shnenglu.com/zhonghua/comments/commentRss/182430.htmlhttp://www.shnenglu.com/zhonghua/services/trackbacks/182430.html
QApplication::setStyleSheet(QString);
QWidget::setStyleSheet(QString);

1. E序U的外观Q(作用于整个程序的器gQ?br />如:

QLineEdit { background: yellow }
QCheckBox { color: red }

2. 器gU的外观Q(作用于本器g及其子器Ӟ
如:

textViewer->
setStyleSheet("background-color: #FFFFBB;"
                "color: #000099;"
                "margin: 10px;"
                "padding: 5px;"
                "padding-left: 15px;"
                "padding-right: 15px;"
                "border-radius: 5px;" // 圆角Ҏ(只用IE的h׃知道了吧:D)
                "border: 3px solid #abc;");
 
 

"background-color: #FFFFBB;"
                "color: #000099;"
                "margin: 10px;"
                "padding: 5px;"
                "padding-left: 15px;"
                "padding-right: 15px;"
                "border-radius: 5px;" // 圆角Ҏ(只用IE的h׃知道了吧:D)
                "border: 3px solid #abc;"
 
 
q只是基Q其他的可根据实际情况,按帮助asstiant上的说明?/div>


c米 2012-07-09 17:18 发表评论
]]>
?QScopedPointer介绍http://www.shnenglu.com/zhonghua/archive/2012/07/03/181227.htmlc米c米Tue, 03 Jul 2012 02:19:00 GMThttp://www.shnenglu.com/zhonghua/archive/2012/07/03/181227.htmlhttp://www.shnenglu.com/zhonghua/comments/181227.htmlhttp://www.shnenglu.com/zhonghua/archive/2012/07/03/181227.html#Feedback0http://www.shnenglu.com/zhonghua/comments/commentRss/181227.htmlhttp://www.shnenglu.com/zhonghua/services/trackbacks/181227.html

QScopedPointer介绍

QScopedPointer

分配空间和释放I间而言QQt的处理有点乏呻I要不然是通过隐式׃n的containersQ要不然是通过QObject的父子关pL式。但L些时候我们需要在堆上分配一些空_问题来了Q我们该在哪里delete它,如何能够保不生内存泄露呢Q?
QScopedPointer׃ؓ了解册个问题而生的,哈哈 QScopedPointer在其生命期结束后会自动删除它所指的对象?

  1. void foo()
  2. {
  3. QScopedPointer<int> i(new int(42));
  4.     …
  5.     if (someCondition)
  6.         return; // 我们在堆上构造的整数q时会在q里删除或者是在下?/li>
  7.     …
  8. } // … 也可能在q里

复制代码

q样可以确保我们在堆上为整?2分配的空间不会生内存泄Ԍ同时我们也不用手动delete它,哈哈?
那我们如何访问QScopedPointer 所指的对象呢?QScopedPointer重新实现了operator* 和operator->Q因此我们可以像下面q样使用它:

  1. QScopedPointer<int> i(new int(42));
  2.     *i = 43;

复制代码

有些q算W是不支持的Q如赋D符Q?

  1. QScopedPointer<int> i(new int(42));
  2.     i = new int(43); // ~译不通过
  3.     i.reset(new int(43)); // 正确

复制代码

operator T*()也是没有的:

  1. int *foo()
  2. {
  3. QScopedPointer<int> i(new int(42));
  4.     …
  5.     return i; // thankfully, this does not compile.
  6. }

复制代码

看到错误没?在上面的代码中一旦我们returnQ我们构造的对象被删除因ؓi的生命期已经l束Q我们将会返回一个野指针Q这可能会导致崩溃。如果真要返回我们应该像下面q样Q?

  1. int *foo()
  2. {
  3. QScopedPointer<int> i(new int(42));
  4.     …
  5.     if (someError)
  6.         return 0; // our integer is deleted here
  7.     return i.take(); // from now on, our heap object is on its own.
  8. }

复制代码

通过调用take()ҎQ我们告诉QScopedPointer它的工作已经做完Q现在由我们来接在堆上分配对象的所有权Q哈?img alt="" src="http://www.thisisqt.com/forum/images/smilies/default/lol.gif" border="0" />
上面的只是针对new而言的,那么如果是malloc或者operator new[]构造数l呢Q这里我们需要用QScopedPointer的第二个参数Q?

  1. QScopedPointer<int, QScopedPointerPodDeleter> pod(static_cast<int *>(malloc(sizeof int)));

复制代码

但QScopedPointer生命期结束后QScopedPointerPodDeleter (pod ?“plain old data”的羃? 会调用free来释放我们分配的I间?
Z方便我们有一个专门针Ҏl的c,QScopedArrayPointerQ在其生命期l束后会自动调用delete[]ҎQ?

  1. void foo()
  2. {
  3.     QScopedArrayPointer<int> i(new int[10]);
  4.     i[2] = 42;
  5.     …
  6.     return; // our integer array is now deleted using delete[]
  7. }

复制代码

注意如果你有一个引用计数的对象Q可以用QExplicitlySharedDataPointer来确保当其引用计Cؓ0时正删除?
?Qt的S60分支中,QScopedPointe 和QExplicitlySharedDataPointer已经得到了广泛的使用。相信不久就可以加入Qt的d支中。通过使用Qt的这些智能指针,?们可以让我们的程序更易读同时也不用过于担心,因ؓq些Ҏ都是inline内联的?/p>

 

 

l常q么?/p>

class MyPrivateClass; // forward declare MyPrivateClass

class MyClass
{
private:
    QScopedPointer<MyPrivateClass> privatePtr; // QScopedPointer to forward declared class

public:
    MyClass(); // OK
    inline ~MyClass() {} // VIOLATION - Destructor must not be inline

private:
    Q_DISABLE_COPY(MyClass) // OK - copy constructor and assignment operators
                             // are now disabled, so the compiler won't implicitely
                             // generate them.
};



c米 2012-07-03 10:19 发表评论
]]>
常用正则http://www.shnenglu.com/zhonghua/archive/2012/06/21/179588.htmlc米c米Thu, 21 Jun 2012 02:55:00 GMThttp://www.shnenglu.com/zhonghua/archive/2012/06/21/179588.htmlhttp://www.shnenglu.com/zhonghua/comments/179588.htmlhttp://www.shnenglu.com/zhonghua/archive/2012/06/21/179588.html#Feedback0http://www.shnenglu.com/zhonghua/comments/commentRss/179588.htmlhttp://www.shnenglu.com/zhonghua/services/trackbacks/179588.html讄正则表达?
cM下面?br />QRegExp
q里的用法就是用来检QString{字W串错误?例如文g名里面最好就不出?lt;>|/\:{?所以可以如下定义QRegExp rx("[a-zA-Z0-9\-\\\_]{25}"); 25是所输入的字W串个数!a-z当然是a-z,你也可以abcdefghijklm....{等.\- 是-

好了,现在可以把这个rxl入QRegExpValidator.

QRegExpValidator *pRevalidotor = new QRegExpValidator(regExp, this);

l入lineEdit :

pEditWell->setValidator(new QRegExpValidator(regExp, this));

常用?
"^\d+$"  //非负整数Q正整数 + 0Q?<br>

"^[0-9]*[1-9][0-9]*$"  //正整?<br>

"^((-\d+)|(0+))$"  //非正整数Q负整数 + 0Q?<br>

"^-[0-9]*[1-9][0-9]*$"  //负整?<br>

"^-?\d+$"    //整数 <br>

"^\d+(\.\d+)?$"  //非负点敎ͼ正QҎ + 0Q?<br>

"^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$"  //正QҎ <br>

"^((-\d+(\.\d+)?)|(0+(\.0+)?))$"  //非正点敎ͼ负QҎ + 0Q?<br>

"^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$"  //负QҎ <br>

"^(-?\d+)(\.\d+)?$"  //点?<br>

"^[A-Za-z]+$"  //?6个英文字母组成的字符?<br>

"^[A-Z]+$"  //?6个英文字母的大写l成的字W串 <br>

"^[a-z]+$"  //?6个英文字母的写l成的字W串 <br>

"^[A-Za-z0-9]+$"  //由数字和26个英文字母组成的字符?<br>

"^\w+$"  //由数字?6个英文字母或者下划线l成的字W串 <br>

"^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$"    //email地址 <br>

"^[a-zA-z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$"  //url <br>

"^(d{2}|d{4})-((0([1-9]{1}))|(1[1|2]))-(([0-2]([1-9]{1}))|(3[0|1]))$" // q???<br>

"^((0([1-9]{1}))|(1[1|2]))/(([0-2]([1-9]{1}))|(3[0|1]))/(d{2}|d{4})$" // ??q?<br>

"^([w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$"    //Email <br>

"(d+-)?(d{4}-?d{7}|d{3}-?d{8}|^d{7,8})(-d+)?"      //电话L <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])$"  

//IP地址</font></p>

<p><font size="3" color="#ff9900">^([0-9A-F]{2})(-[0-9A-F]{2}){5}$    //MAC地址的正则表辑ּ <br>

^[-+]?\d+(\.\d+)?$ //值类型正则表辑ּ</font></p>

</font><br>

<br>

<font size="3">QRegExp是Qt的正则表辑ּc?<br>

Qt中有两个不同cȝ正则表达?<br>

W一cMؓ元字W?它表CZ个或多个帔R表达?<br>

令一cMؓ 转义字符,它代表一个特D字W?<br>

<br>

一.元字W?lt;br>

. 匚wL单个字符.例如, 1.3 可能?. 后面跟Q意字W?再跟3<br>

^ 匚w字符串首. 例如, ^12可能?23,但不能是312<br>

$ 配字W串? 例如, 12$可以?12, 当不能是 123<br>

[] 匚w括号内输入的L字符.[123]可以?, 2 ?<br>

* 匚wL数量的前导字W? 例如, 1*2可以ZQ意数量个1(甚至没有), 后面跟一?<br>

+ 匚w臛_一个前导字W? 例如, 1+2必须Z个或多个1, 后跟一?<br>

? 匚w一个前导字W或为空. 例如 1?2可以?或这12<br>

<br>

?l配模式<br>

通过 QRegExp::setPatternSyntax(QRegExp::Wildcard);可以元字符讄为统配模?在统配模式下,只有3个元?W可以?他们的功能没有变?<br>

? 匚wL单个字符, 例如, 1?2可以?,后面跟Q意单个字W? 再跟2<br>

* 匚wL一个字W序? 例如, 1*2, 可以?, 后面跟Q意数量的字符, 再跟一?<br>

[] 匚w一个定义的字符集合. 例如, [a-zA-Z\.]可以匚w a到z之间L一个字W和. [^a]匚w出小写a以外的字W?<br>

<br>

?转义序列<br>

\. 匚w"."<br>

\^ 匚w"^"<br>

\$ 匚w"$"<br>

\[ 匚w"["<br>

\] 匚w"]"<br>

\* 匚w"*"<br>

\+ 匚w"+"<br>

\? 匚w"?"<br>

\b 匚w响铃字符,使计机发出嘟的一?<br>

\t 制表W号<br>

\n 换行W号<br>

\r 回RW铪<br>

\s LI格<br>

\xnn 匚w16q制为nn的字W?lt;br>

\0nn 匚w8q制的nn字符<br>

q些表达式均以\开? 与C++的{义字W相?所以ؓ了定义QRegExp中的一个{义序?<br>

需要在前面d两个\\

c米 2012-06-21 10:55 发表评论
]]>
QT 定时器?/title><link>http://www.shnenglu.com/zhonghua/archive/2012/06/20/179477.html</link><dc:creator>c米</dc:creator><author>c米</author><pubDate>Wed, 20 Jun 2012 02:27:00 GMT</pubDate><guid>http://www.shnenglu.com/zhonghua/archive/2012/06/20/179477.html</guid><wfw:comment>http://www.shnenglu.com/zhonghua/comments/179477.html</wfw:comment><comments>http://www.shnenglu.com/zhonghua/archive/2012/06/20/179477.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/zhonghua/comments/commentRss/179477.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/zhonghua/services/trackbacks/179477.html</trackback:ping><description><![CDATA[<div><pre>1.<div><pre> QTimer *timer = new QTimer( myObject );<br /> <a >connect</a>( timer, SIGNAL(<a >timeout</a>()), myObject, SLOT(timerDone()) );<br /> timer-><a >start</a>( 2000, TRUE ); // 2U单触发定时?/pre></div> QTimer *t = new QTimer( myObject ); <br /><a >connect</a>( t, SIGNAL(<a >timeout</a>()), SLOT(processOneThing()) );<br /> t-><a >start</a>( 2000, FALSE ); // 2U单触发定时?br /><br />2.void QTimer::singleShot ( int msec, <a >QObject</a> * receiver, const char * member )<tt> [静态]</tt> <br />QTimer::<a >singleShot</a>( 10*60*1000, &a, SLOT(<a >quit</a>()) );<br /><br /></pre></div><img src ="http://www.shnenglu.com/zhonghua/aggbug/179477.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/zhonghua/" target="_blank">c米</a> 2012-06-20 10:27 <a href="http://www.shnenglu.com/zhonghua/archive/2012/06/20/179477.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>QT右键菜单的添加(转帖Q?/title><link>http://www.shnenglu.com/zhonghua/archive/2012/06/01/177082.html</link><dc:creator>c米</dc:creator><author>c米</author><pubDate>Fri, 01 Jun 2012 08:25:00 GMT</pubDate><guid>http://www.shnenglu.com/zhonghua/archive/2012/06/01/177082.html</guid><wfw:comment>http://www.shnenglu.com/zhonghua/comments/177082.html</wfw:comment><comments>http://www.shnenglu.com/zhonghua/archive/2012/06/01/177082.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/zhonghua/comments/commentRss/177082.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/zhonghua/services/trackbacks/177082.html</trackback:ping><description><![CDATA[<div><div class="f7rj779" 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枚Dcd包括QQt::DefaultContextMenu, Qt::NoContextMenu, Qt::PreventContextMenu, Qt::ActionsContextMenu, and Qt::CustomContextMenu?br /></p> <p>使用方式如下Q?/p> <p><br /><strong>1Q默认是Qt::DefaultContextMenu?/strong><br />?是利用右键菜单事件contextMenuEvent()来处理(which means the contextMenuEvent() handler is called)。就是要重写contextMenuEvent( QContextMenuEvent * event )函数?/p> <p><br /><strong>2Q用Qt::CustomContextMenu?/strong><br />它是发出QWidget::customContextMenuRequested信号Q注意仅仅只是发信号Q意味着要自己写昄右键菜单的slot?br />q个信号是QWidget唯一与右键菜单有关的信号Q也是自有的唯一信号Q,同时也是很容易被忽略的signalQ?/p> <p>void customContextMenuRequested ( const QPoint & pos ) </p> <p>该信L发出条g是:用户hcontextMenuQ常规就是鼠标右dQ且同时被击的widget其contextMenuPolicy又是Qt::CustomContextMenu?br />?意:pos是该widget接收右键菜单事g的位|,一般是在该部g的坐标系中。但是对于QAbstratScrollArea及其子类例外Q是对应着?视口viewport()的坐标系。如常用的QTableView、QHeaderView是QAbstratScrollArea的子cR?br />因ؓ仅发信号Q所以需自己写显C右键菜单的slot来响应,例如一个表|QTableViewcdQ表头的昄右键菜单槽:<br />datatable->horizontalHeader()->setContextMenuPolicy(Qt::CustomContextMenu);<br />connect(datatable->horizontalHeader(), SIGNAL(customContextMenuRequested(const QPoint&)), <br />        this, SLOT(show_contextmenu(const QPoint&)));//this是datatable所在窗?br />QMenu *cmenu = NULL;<br />show_contextmenu(const QPoint& pos)<br />{<br />    if(cmenu)//保证同时只存在一个menuQ及旉攑ֆ?br />    {<br />        delete cmenu;<br />        cmenu = NULL;<br />    }<br />    QMenu cmenu = new QMenu(datatable->horizontalHeader());<br />    <br />    QAction *ascendSortAction = cmenu->addAction("升序");<br />    QAction *descendSortAction = cmenu->addAction("降序");<br />    QAction *filterAction = cmenu->addAction("qo");<br />    QAction *reshowAction = cmenu->addAction("重蝲");<br />    <br />    connect(ascendSortAction, SIGNAL(triggered(bool)), this, SLOT(sort_ascend()));<br />    connect(descendSortAction, SIGNAL(triggered(bool)), this, SLOT(sort_descend()));<br />    connect(filterAction, SIGNAL(triggered(bool)), this, SLOT(show_filter_dlg()));<br />    connect(reshowAction, SIGNAL(triggered(bool)), this, SLOT(reshow_data()));<br />    <br />    cmenu->exec(QCursor::pos());//在当前鼠标位|显C?br />    //cmenu->exec(pos)是在viewport昄<br />}</p> <p>也可先做好cmenuQ好处是始终使用一个:<br />    QMenu cmenu = new QMenu(datatable->horizontalHeader());<br />    <br />    QAction *ascendSortAction = cmenu->addAction("升序");<br />    QAction *descendSortAction = cmenu->addAction("降序");<br />    QAction *filterAction = cmenu->addAction("qo");<br />    QAction *reshowAction = cmenu->addAction("重蝲");<br />    <br />    connect(ascendSortAction, SIGNAL(triggered(bool)), this, SLOT(sort_ascend()));<br />    connect(descendSortAction, SIGNAL(triggered(bool)), this, SLOT(sort_descend()));<br />    connect(filterAction, SIGNAL(triggered(bool)), this, SLOT(show_filter_dlg()));<br />    connect(reshowAction, SIGNAL(triggered(bool)), this, SLOT(reshow_data()));<br />show_contextmenu(const QPoint& pos)<br />{<br />    if(cmenu)<br />    {<br />        cmenu->exec(QCursor::pos());<br />    }<br />}</p> <p><br /><strong>3Q用Qt::ActionsContextMenu?br /></strong>把部件的所有action即QWidget::actions()作ؓcontext menu昄出来?br />q是上面的例子,要在表格QQTableViewcdQ表头显C右键菜单:<br />        QAction *ascendSortAction = new QAction("升序", this);<br />        QAction *descendSortAction = new QAction("降序", this);<br />        QAction *filterAction = new QAction("qo", this);<br />        QAction *unfilterAction = new QAction("取消qo", this);<br />    <br />        connect(ascendSortAction, SIGNAL(triggered(bool)), this, SLOT(sort_ascend()));<br />        connect(descendSortAction, SIGNAL(triggered(bool)), this, SLOT(sort_descend()));<br />        connect(filterAction, SIGNAL(triggered(bool)), this, SLOT(filter_table()));<br />        connect(unfilterAction, SIGNAL(triggered(bool)), this, SLOT(unfilter_table()));<br />    <br />        datatable->horizontalHeader()->addAction(ascendSortAction);<br />        datatable->horizontalHeader()->addAction(descendSortAction);<br />        datatable->horizontalHeader()->addAction(filterAction);<br />        datatable->horizontalHeader()->addAction(unfilterAction);<br />         <br />        datatable->horizontalHeader()->setContextMenuPolicy(Qt::ActionsContextMenu);</p> <p>另外两个是不显Ccontext menu了:<br />Qt::NoContextMenu<br />    the widget does not feature a context menu, context menu handling is deferred to the widget's parent.<br />    <br />Qt::PreventContextMenu<br />    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>补充Q?/strong><br />    使用Qt::ActionsContextMenu比较z,但是如果需要根据当前菜单弹出的位置来定义不同菜单,或者像上个例子Q在表格 QQTableViewcdQ表头显C右键菜单时Q我需要知道是哪一列表头被点击Q从而在后来调用sort_ascend()排序函数时能够根据不同列q?行不同排序策略,那么Qt::ActionsContextMenu做不到了?br />    q种需要捕捉弹Z|的情况只好用Qt::ActionsContextMenu了,customContextMenuRequested ( const QPoint & pos )信号q回点击位置posQ在表头视口坐标pM位置Q,然后表头卛_调用logicalIndexAt(pos)函数得到被点击section对应?index卌点击部分的列P然后存下来可供后面actionȀzȝ排序槽用?br />show_contextmenu(const QPoint& pos)<br />{<br />    //get related column of headerview<br />    contextmenu_column = datatable->horizontalHeader()->logicalIndexAt(pos);</p> <p>    //show contextmenu<br />    if(cmenu)<br />    {<br />        cmenu->exec(QCursor::pos());<br />    }<br />}</p></div></div><img src ="http://www.shnenglu.com/zhonghua/aggbug/177082.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/zhonghua/" target="_blank">c米</a> 2012-06-01 16:25 <a href="http://www.shnenglu.com/zhonghua/archive/2012/06/01/177082.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>?Qt 常用命o 常用?/title><link>http://www.shnenglu.com/zhonghua/archive/2012/05/30/176710.html</link><dc:creator>c米</dc:creator><author>c米</author><pubDate>Wed, 30 May 2012 01:49:00 GMT</pubDate><guid>http://www.shnenglu.com/zhonghua/archive/2012/05/30/176710.html</guid><wfw:comment>http://www.shnenglu.com/zhonghua/comments/176710.html</wfw:comment><comments>http://www.shnenglu.com/zhonghua/archive/2012/05/30/176710.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/zhonghua/comments/commentRss/176710.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/zhonghua/services/trackbacks/176710.html</trackback:ping><description><![CDATA[<div><div> qmake 常用命oQ?/div> <div>qmake -project //生成pro文gQ自动检查c/c++E序文g<br />    qmake -tp vc //Ҏpro文g生成vc的工E文Ӟqt commericial有一个绑定到vs的工P可以在菜单栏直接打开<br />    qmake -r xxx.pro "CONFIG+=debug" //递归生成makefile<br />    moc //包含Q_OBJECT文g转换?br />    rcc //Qt resource compiler<br />    uic //Qt ui file translator,to .h file.</div>   <div> Qt 常用宏:</div> <div>   q_相关<br />    Q_WS_WIN //windowpȝ<br />    Q_WS_X11 //xwindowpȝ<br />    Q_WS_MAC //Ҏmacpȝ<br />    Q_WS_SOL //sun的solarispȝ<br />    其它<br />    QT_OPENGL_SUPPORT //是否支援opengl<br />    QT_VERSION    //qt的版本,?if QT_VERSION > 0x040601(qt > 4.6.1)<br />    QT_VERSION_STR //qt版本的字W串<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>         T qAbs(const T & value) //q回l对?br />    void qCritical(const char * msg, ...) //输出告警信息  参赛cMprintf<br />    void qDebug(const char * msg, ... ) // 输出调试信息<br />    void qFatal(const char * msg, ... ) //输出错误信息<br />    qMax(const T & value1,const T & value2 )// 求最?br />    qMin(const T & value1,const T & value2 ) // 求最?/div> <div> pro 文g格式</div> <div>#: 表示到行֝为注视,被忽?br />   include: 可以包含别的文本文gQ一般ؓ*pri 例如 #include "../global.pri"<br />   scope{;;}: 预定?Q如win32{} 表示在win32q_下的定义Q其它忽?br />   win32/unix/linux-g++/linux-g++-64: q_?br />   DESTDIR: 产生目标文g路径<br />   MOC_DIR: moc转换文g路径<br />   RCC_DIR: 资源文g路径<br />   UI_DIRQui文g转换的\?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 += **来指定那些子目录Q?br />   TARGET: 指定目标文g?br />   Qt+=: d额外的模块支持,例如Qt -= QtCore;Qt += network,phonon,xmlQthread<br />   DEFINES: d额外的宏定义Q如win下需要的export{?br />   DEPENDPATH: d以来的\?br />   INCLUDEPATHQ?d头文件包含\?br />   HEADERSQ?需要包含的头文?br />   SOURCESQ?需要包含的源文?br />   FORMSQ?需要包含的ui文g<br />   RESOURCESQ需要包含的资源文g<br />   LIBSQ依赖库的\径和名称 -L{xxdirxx} -l{xxnamexx}<br />   CONFIG: d配置Q如warn_on debug_and_release plugin<br />   TRANSLATIONS: 多国语言支持文g<br />   INSTALLS: 要安装的文g<br />   target.path: 安装的\?br />   #在pro文g支持environment variables和自定义变量<br />   #如sources.file += $$SOURCES $$HEADERS<br />   #sources.path = $$DESTIN_DIR<br />   #INSTALLS += target source<br />   defineReplace(xxx): xxx为变?Q此函数可以q回一个变量值如:$$xxx()<br /> exists(file1,file2){error()}:查文件是否存?/div>   </div><img src ="http://www.shnenglu.com/zhonghua/aggbug/176710.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/zhonghua/" target="_blank">c米</a> 2012-05-30 09:49 <a href="http://www.shnenglu.com/zhonghua/archive/2012/05/30/176710.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.shnenglu.com/" title="精品视频久久久久">精品视频久久久久</a> <div class="friend-links"> </div> </div> </footer> <a href="http://www.211228.cn" target="_blank">þ㽶߿ۿƷyw </a>| <a href="http://www.hunxiaodansang.cn" target="_blank">ѹۿþþƵ</a>| <a href="http://www.12530downs.com.cn" target="_blank">һһþۺϺݺ</a>| <a href="http://www.wannianl.cn" target="_blank">޹Ʒþ</a>| <a href="http://www.ezftdhwp.cn" target="_blank">ٸþ</a>| <a href="http://www.vbzc.cn" target="_blank">ƷƷھþø</a>| <a href="http://www.lhstrip.cn" target="_blank">ɫۺϾþۺۿ</a>| <a href="http://www.yc-shop.cn" target="_blank">뾫Ʒþһ</a>| <a href="http://www.zgsmkf.cn" target="_blank">þ99ھƷ</a>| <a href="http://www.yhkim.cn" target="_blank">97þþƷһ</a>| <a href="http://www.chizhou8.cn" target="_blank">Ʒһþ</a>| <a href="http://www.grcooling.com.cn" target="_blank">ݺɫɫݺݺۺϾþ</a>| <a href="http://www.ndtym.cn" target="_blank">þ޾ƷƷ</a>| <a href="http://www.youhezulin.cn" target="_blank">þٸ۲AVר</a>| <a href="http://www.mirbase.cn" target="_blank">þ޾ƷĻ</a>| <a href="http://www.liangfang013.cn" target="_blank">޹ƷۺϾþһ</a>| <a href="http://www.ggg13.cn" target="_blank">þþƷоƷ</a>| <a href="http://www.169diaoyu.cn" target="_blank">պ뾫Ʒþþò</a>| <a href="http://www.sina458.cn" target="_blank">˾Ʒþһav</a>| <a href="http://www.iyuhu.cn" target="_blank">ŷպƷþ</a>| <a href="http://www.qhsy210.cn" target="_blank">þþоƷĻ</a>| <a href="http://www.vedz.cn" target="_blank">þ777߿ۿƷ</a>| <a href="http://www.hyzjlib.cn" target="_blank">AVĻþר</a>| <a href="http://www.effusion.net.cn" target="_blank">þþþþùƷŮ</a>| <a href="http://www.010law.cn" target="_blank">޹Ʒ˾þ</a>| <a href="http://www.sony888.cn" target="_blank">þĻȫ</a>| <a href="http://www.86mls.cn" target="_blank">޹Ʒþ</a>| <a href="http://www.bibi81.cn" target="_blank">޾Ʒҹvaþ</a>| <a href="http://www.jaqw.cn" target="_blank">þþ뾫Ʒպ</a>| <a href="http://www.smegdmm.cn" target="_blank">˾Ʒþ</a>| <a href="http://www.symedia.com.cn" target="_blank">þþþҹҹҹƷ</a>| <a href="http://www.zhangqiu114.cn" target="_blank">þþþAV鶹</a>| <a href="http://www.dzeuegg.cn" target="_blank">AþþƷ</a>| <a href="http://www.fanerge.cn" target="_blank">þˬˬƬAV</a>| <a href="http://www.yksxc.cn" target="_blank">һɫþۺ</a>| <a href="http://www.fc27.cn" target="_blank">ҹӰԺþþƷѿһ </a>| <a href="http://www.5748l.cn" target="_blank">ݹƷþþþ</a>| <a href="http://www.265zz.cn" target="_blank">7777þĻ</a>| <a href="http://www.710p.cn" target="_blank">þӰ㶮</a>| <a href="http://www.zfam.cn" target="_blank">bƷþþþþþ</a>| <a href="http://www.huangjiabbs.cn" target="_blank">þþžžþƷֱ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>