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

首頁 > 編程 > C++ > 正文

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

2020-05-23 13:28:37
字體:
來源:轉載
供稿:網友

一、螞蟻線

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

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

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

二、效果展示

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

Qt,表格控件,螞蟻線

三、實現

說到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螞蟻線-表格

總結

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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久香蕉国产线看观看网| 久久97精品久久久久久久不卡| 九九精品在线视频| 亚洲另类xxxx| 欧美日韩一二三四五区| 高清在线视频日韩欧美| 国产精品日日摸夜夜添夜夜av| 日韩av在线一区二区| 亚洲欧美日韩天堂| 久久精品国产免费观看| 日韩精品视频在线| 国产一区二区三区三区在线观看| 亚洲www在线| 成人免费午夜电影| 精品一区电影国产| 奇米四色中文综合久久| 在线观看欧美日韩国产| 久久久久久久久久久国产| 日韩欧美一区二区三区| 免费97视频在线精品国自产拍| 欧美亚洲国产日本| 97视频在线观看成人| 最近2019好看的中文字幕免费| 日韩人在线观看| 日韩电影网在线| 亚洲综合在线中文字幕| 欧美在线观看日本一区| 亚洲成人久久一区| 性欧美在线看片a免费观看| 日韩精品有码在线观看| 国产精品久久久久久久久久新婚| 亚洲色图偷窥自拍| 色yeye香蕉凹凸一区二区av| 色综合伊人色综合网| 青草热久免费精品视频| 欧美一区二区色| 97超碰蝌蚪网人人做人人爽| 日韩精品中文字幕在线播放| 亚洲国产精品大全| 欧美成人第一页| 成人高清视频观看www| 国产视频福利一区| 91沈先生作品| 国产精品91久久久| 国产精品91久久久久久| 亚洲曰本av电影| 中文字幕av日韩| 久久久久久97| 久久影视三级福利片| 亚洲国产女人aaa毛片在线| 亚洲变态欧美另类捆绑| 亚洲97在线观看| 久久人人爽国产| 国产精品久久久久99| 国产精品亚洲第一区| 国产综合久久久久久| 国内精品久久久久久影视8| 久久色免费在线视频| 亚洲精品第一页| 尤物tv国产一区| 国产在线观看不卡| 992tv成人免费影院| 国产欧美日韩最新| 日韩电影免费观看中文字幕| 精品国产乱码久久久久久天美| 亚洲美女av在线| 亚洲国产精品久久精品怡红院| 亚洲欧美国产一本综合首页| 亚洲色图日韩av| 精品国产1区2区| 国产欧美精品日韩| 亚洲aaaaaa| 国产精品视频男人的天堂| 国产成人精品久久亚洲高清不卡| 精品国产乱码久久久久久虫虫漫画| 国产一区二区日韩精品欧美精品| 最好看的2019的中文字幕视频| 国产亚洲a∨片在线观看| 91欧美视频网站| 97免费在线视频| 日韩亚洲成人av在线| 国产精品视频专区| 久久免费视频在线| 亚洲美女性生活视频| 国产99久久精品一区二区 夜夜躁日日躁| 欧美极品少妇xxxxx| 色天天综合狠狠色| 96精品久久久久中文字幕| 97成人超碰免| 精品五月天久久| 国内成人精品视频| 日本三级韩国三级久久| 亚洲国产第一页| 中文字幕亚洲专区| 亚洲欧洲中文天堂| 亚洲国产第一页| 国模精品一区二区三区色天香| 日本免费一区二区三区视频观看| 亚洲区一区二区| 午夜精品一区二区三区在线| 深夜福利亚洲导航| 国产精品永久免费| 久久亚洲精品中文字幕冲田杏梨| 这里只有精品丝袜| 国产精品自在线| 国产亚洲精品久久久久久| 欧美体内谢she精2性欧美| 久久久999国产| 91久久久亚洲精品| 欧美精品电影在线| 动漫精品一区二区| 日韩视频中文字幕| 这里只有精品丝袜| 日韩精品免费一线在线观看| 日本精品性网站在线观看| 国产成人精品在线视频| 欧美高清第一页| 亚洲欧美在线看| www.日韩欧美| 亚洲成色777777在线观看影院| 精品亚洲va在线va天堂资源站| 亚洲精品美女视频| 国产精品一区二区三区成人| 成人性教育视频在线观看| 欧美成人免费在线视频| 久久久日本电影| 狠狠色狠狠色综合日日五| 日本午夜在线亚洲.国产| 91香蕉国产在线观看| 中文字幕欧美精品日韩中文字幕| 欧美性xxxx极品hd欧美风情| 国产欧美欧洲在线观看| 国产精品精品视频一区二区三区| 日韩中文字幕国产精品| 久久久免费高清电视剧观看| 欧美日韩高清区| 国产精品高清网站| 国产精品直播网红| 色噜噜亚洲精品中文字幕| 日韩av一区在线观看| 久久影院免费观看| 久久精品国产精品| 日韩av在线不卡| 欧美巨乳在线观看| 国产精品激情自拍| 亚洲欧美在线看| 一区二区亚洲精品国产| 高清在线视频日韩欧美| 欧美日韩另类在线| 国产有码在线一区二区视频| 欧美激情视频在线免费观看 欧美视频免费一| 日韩电影中文字幕| 狠狠久久亚洲欧美专区| 国产成人综合精品| 欧美精品久久久久久久久| 午夜精品99久久免费| 91精品久久久久久久久中文字幕| 久久大大胆人体| 久久视频在线视频| 欧美综合国产精品久久丁香| 亚洲国产97在线精品一区| 亚洲自拍中文字幕| 在线观看91久久久久久| 久久久成人的性感天堂|