亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

Qt學習教程之表格控件螞蟻線詳解

2020-01-26 13:41:01
字體:
來源:轉載
供稿:網友

一、螞蟻線

摘自互動百科:在圖像影像軟件中表示選區的動態虛線,因為虛線閃爍的樣子像是一群螞蟻在跑,所以俗稱螞蟻線。在Poshop,After Effect等軟件中比較常見。

背景:用過excel的同學都知道,當對單元格進行復制時,單元格周圍就會出現一個跑動的矩形框,這個矩形框就被稱為螞蟻線。通過設置螞蟻線的線型和調整控件有效刷新次數我們可以得到不同的跑動效果,這是一個非常有意思的現象。

本文將給大家詳細介紹關于Qt表格控件螞蟻線的相關內容,分享出來供大家參考學習,下面話不多說了,來一起看看詳細的介紹吧。

二、效果展示

  如下圖就是螞蟻線的效果截圖,單擊單元格時,會繪制一個2個像素寬的外框;當雙擊某個單元格時,就會產生螞蟻線,螞蟻線的線型和跑動速度都可以定制。文末會放出演示代碼下載鏈接。


三、實現

說到Qt繪圖,肯定離不開paintEvent函數,而且大多數的功能都可以通過重寫paintEvent函數來完成。凡是總有例外,當控件本身就比較復雜,或者只需要重寫控件某一部分時,就需要重寫一些其他東西來完成需求,比如表格螞蟻線繪制就屬于這個例外,當我們重寫表格時就不能重寫paintEvent函數,如果重寫這個函數那么表格的所有東西就需要我們自己去繪制,一個好的辦法就是重寫QStyledItemDelegate代理類,通過這個類我們可以定制表格控件的每一個項。下面我們就來仔細的分析下基于重寫代理類的實現細節,理解下面4個實現維度后螞蟻線基本就完成了。

1、繪制區域

螞蟻線是針對表格項來進行繪制的,因此首先想到的就是刷新表格某一項來進行提高繪制效率,通過閱讀Qt源碼,找到QTableView::paintEvent函數中對表格項進行了繪制,主要是通過調用QTableViewPrivate::drawCell函數來進行每個單元格的繪制,該函數最后一行是通過QStyledItemDelegate類的paint方法來進行繪制,與第三節第一段的說明對應起來。因此如果想進行局部刷新看來困難比較大,因此最終決定每次刷新螞蟻線時對整個表格進行刷新。

2、定時器

定時刷新,顧名思義就是我們需要一個定時器,定時刷新表格控件。首先想到的是我們自己維護一個QTimer,通過QTimer::timeout信號來刷新表格;除此之外QObject類已經幫我們提供了一個timerEvent回調函數,我們只需要通過startTime接口來啟動一個定時器,timerEvent函數就會被定時調用,當然了這個回調接口同時支持多個定時器,用timeID進行區分每個定時器。

3、繪制策略

當選擇一個單元格時(當前單元格發現變化),繪制矩形框;繪制矩形框比較簡單,這塊需要注意一個地方,就是當繪制第一列的時候矩形框可能會跑出當前項,導致矩形框顯示不全。螞蟻線繪制時也存在這個問題。

void GMPFileItemDelegate::DrawBorderRect( QPainter * painter, const QRect & rect, bool firstColumn ) const{ painter->save(); QPen pen = painter->pen(); pen.setWidth(2); pen.setColor(QColor(0, 132, 255)); painter->setPen(pen);  QRect tmpRect = rect; if (firstColumn) { tmpRect.adjust(2, 1, -1, -1); } else { tmpRect.adjust(1, 1, -1, -1); } painter->drawRect(tmpRect); painter->restore();}

當雙擊單元格時繪制螞蟻線,螞蟻線繪制是通過定時器進行控制線框奔跑速度,這塊有一個需要注意的地方是只有當定時器引起的繪制才會使起螞蟻線往前跑。

根據螞蟻線的偏移繪制開始的空白區域,螞蟻線是由7個像素的藍色和2個像素的空白循環組成,當偏移10個像素時,重新回到偏移1個像素。

if (startPoint != truthPoint && offset > 2){ QPolygon polygon; for (int i = 4; i <= offset; ++i)//繪制前邊偏移的像素 { if (polygon.size() >= 7) {  break; } polygon.append(truthPoint - QPoint(i , 0)); } painter->drawPoints(polygon);}

4、界面刷新

qt自己又自己的界面刷新策略,平時使用比較多的也不外乎update(建議刷新)、repaint(強制刷新)兩個接口,但是這個兩個接口調用時也不是說界面肯定會刷新,其實這兩個接口都是使用QWidgetBackingStoreTracker類的senUpdateRequest接口類來拋出的刷新界面事件,Qt窗口有一個dirtyWidget的概念,當判定這個窗口為需要刷新的窗口時才會調用sendUpdateRequest接口進行界面刷新,如下代碼,update和repaint區別在于調用了switch的不同分支。

void QWidgetBackingStore::sendUpdateRequest(QWidget *widget, UpdateTime updateTime){ if (!widget) return;  switch (updateTime) { case UpdateLater: updateRequestSent = true; QApplication::postEvent(widget, new QEvent(QEvent::UpdateRequest), Qt::LowEventPriority); break; case UpdateNow: { QEvent event(QEvent::UpdateRequest); QApplication::sendEvent(widget, &event); break; } }}

對于表格控件當我們單純調用repaint或者update函數時是不能起到刷新界面的作用,因此我們需要調用其他能直接導致界面刷新的接口,目前我這塊想到了直接調用窗口自身style的polish方法,如果大家有其他好的刷新方式可以留言。
通過以上4個小點的說明,螞蟻線的實現基本就完成了。需要完整源碼的去csdn下載吧

四、下載鏈接

Qt螞蟻線-表格

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對武林網的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美激情精品久久久久久蜜臀| 中文字幕视频在线免费欧美日韩综合在线看| 97精品视频在线播放| 久久久精品视频成人| 国内精品小视频在线观看| 亚洲精品456在线播放狼人| 亚洲色图综合久久| 欧美精品免费在线| 欧美插天视频在线播放| 91精品国产综合久久香蕉| 激情久久av一区av二区av三区| 国产精品自在线| 成人黄色在线免费| 欧美大片欧美激情性色a∨久久| 午夜精品久久久久久99热软件| 日韩免费av在线| 色悠久久久久综合先锋影音下载| 国产精品国产福利国产秒拍| 欧美另类高清videos| 久久不射热爱视频精品| 久久精品电影网站| 亚洲欧美变态国产另类| 久久琪琪电影院| 日韩精品在线免费播放| 久久精品久久久久久国产 免费| 日韩中文字幕在线精品| 亚洲97在线观看| 欧美肥老太性生活视频| 中文字幕亚洲专区| 一本大道香蕉久在线播放29| 亚洲片在线资源| 欧美综合第一页| 亚洲人成电影在线| 国产成人97精品免费看片| 国产精品香蕉在线观看| 成人精品aaaa网站| 青草青草久热精品视频在线网站| 久久精品91久久久久久再现| 日本精品视频在线播放| 2019亚洲日韩新视频| 这里只有精品在线播放| 日本免费久久高清视频| 国产精品r级在线| 国产精品一区二区三区免费视频| 久久久久久久久网站| 国产成人免费av电影| 国产色视频一区| 在线日韩av观看| 搡老女人一区二区三区视频tv| 国产最新精品视频| 国产欧美久久久久久| xxav国产精品美女主播| 国自在线精品视频| 欧美黄色片免费观看| 亚洲国内精品在线| 国产亚洲成精品久久| 国产中文字幕日韩| 欧美在线免费视频| 亚洲欧美日韩国产中文| 久青草国产97香蕉在线视频| 久久亚洲影音av资源网| 欧美日韩亚洲成人| 亚洲免费福利视频| 亚洲va电影大全| 91av国产在线| 日本亚洲欧洲色α| 欧美日韩国产一中文字不卡| 日韩亚洲精品视频| 尤物九九久久国产精品的分类| 欧美日韩一区二区三区| 九九精品视频在线| 亚洲一区二区三区四区视频| 欧美激情精品久久久久久蜜臀| 久久久久久网站| 欧美电影在线免费观看网站| 国产欧美在线观看| 91香蕉电影院| wwwwwwww亚洲| 国产伦精品一区二区三区精品视频| 欧美国产一区二区三区| 亚洲女人初尝黑人巨大| 国产乱肥老妇国产一区二| 91超碰中文字幕久久精品| 日韩电影免费在线观看| 在线精品高清中文字幕| 欧美激情视频给我| 日韩欧美在线国产| 国产精品免费小视频| 午夜精品福利在线观看| 日韩高清中文字幕| 亚洲国产精品成人精品| 亚洲一区制服诱惑| 欧美成人久久久| 在线观看欧美视频| 国产ts一区二区| 久久精品国产96久久久香蕉| 亚洲国产99精品国自产| 亚洲电影免费观看高清| 岛国精品视频在线播放| 亚洲自拍欧美色图| 久久天天躁夜夜躁狠狠躁2022| 日韩精品视频在线观看网址| 国产va免费精品高清在线| 日韩美女激情视频| 51色欧美片视频在线观看| 亚洲国产精品久久精品怡红院| 成人女保姆的销魂服务| 成人午夜高潮视频| 亚洲精品第一国产综合精品| 国产精品久久久久久av下载红粉| 久久久久久91香蕉国产| 性欧美视频videos6一9| 亚洲欧美日韩久久久久久| 亚洲大胆美女视频| 亚洲人成网站777色婷婷| 国产精品免费看久久久香蕉| 中文字幕av一区| 日韩激情视频在线播放| 91在线高清免费观看| 欧美裸体xxxx极品少妇| 中文字幕亚洲无线码在线一区| 欧美另类高清videos| 国产视频福利一区| 久久中文字幕一区| 欧美在线观看一区二区三区| 在线中文字幕日韩| 欧美日韩国产综合视频在线观看中文| 亚洲免费电影一区| 亚洲男人第一网站| 欧美美最猛性xxxxxx| 欧美精品免费看| 色综合视频一区中文字幕| 色综合91久久精品中文字幕| 精品国产欧美一区二区三区成人| 国产精品欧美一区二区| 日本三级韩国三级久久| 欧美激情视频一区二区三区不卡| 久久久久久久久久久网站| 岛国av一区二区| 在线观看精品自拍私拍| 欧美午夜美女看片| 色噜噜亚洲精品中文字幕| 国产成人精品一区二区三区| 色婷婷综合久久久久| 欧美日韩精品在线播放| 久久久精品国产网站| 中文字幕精品久久久久| 欧美日韩国产精品专区| 一本色道久久88综合日韩精品| 国产精品女人网站| 日韩一级裸体免费视频| 久久久中精品2020中文| 日本成人黄色片| 欧美精品日韩www.p站| 欧美国产亚洲精品久久久8v| 欧美与欧洲交xxxx免费观看| 日韩女优在线播放| 日韩电视剧免费观看网站| 亚洲精品自拍第一页| 日韩精品视频在线观看网址| 成人免费看黄网站| 欧美最猛黑人xxxx黑人猛叫黄| 亚洲精品二三区| 视频在线观看99|