欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2018年07月10日 16:47:12   作者:朝十晚八  
如果有用過PS的選區(qū)工具應該就會知道螞蟻線是什么東西了,就是用來表示選區(qū)的一種虛線,關鍵還是要動態(tài)的!下面這篇文章主要給大家介紹了關于Qt學習教程之表格控件螞蟻線的相關資料,需要的朋友可以參考下

一、螞蟻線

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

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

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

二、效果展示

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


三、實現(xiàn)

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

1、繪制區(qū)域

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

2、定時器

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

3、繪制策略

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

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();
}

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

根據(jù)螞蟻線的偏移繪制開始的空白區(qū)域,螞蟻線是由7個像素的藍色和2個像素的空白循環(huán)組成,當偏移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(強制刷新)兩個接口,但是這個兩個接口調(diào)用時也不是說界面肯定會刷新,其實這兩個接口都是使用QWidgetBackingStoreTracker類的senUpdateRequest接口類來拋出的刷新界面事件,Qt窗口有一個dirtyWidget的概念,當判定這個窗口為需要刷新的窗口時才會調(diào)用sendUpdateRequest接口進行界面刷新,如下代碼,update和repaint區(qū)別在于調(diào)用了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;
 }
 }
}

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

四、下載鏈接

Qt螞蟻線-表格

總結(jié)

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

相關文章

  • C++重載運算符你真的了解嗎

    C++重載運算符你真的了解嗎

    這篇文章主要為大家詳細介紹了C++重載運算符,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • C++開發(fā)繪制正弦曲線的方法

    C++開發(fā)繪制正弦曲線的方法

    這篇文章主要為大家詳細介紹了C++繪制正弦曲線的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • C++?STL容器詳解之紅黑樹部分模擬實現(xiàn)

    C++?STL容器詳解之紅黑樹部分模擬實現(xiàn)

    本文主要對紅黑樹進行了詳細介紹,并對其核心功能進行了模擬實現(xiàn)。文中的代碼對我們的學習或工作有一定的價值,感興趣的小伙伴可以了解一下
    2021-12-12
  • C++ 獲取URL內(nèi)容的實例

    C++ 獲取URL內(nèi)容的實例

    這篇文章主要介紹了C++ 獲取URL內(nèi)容的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • C語言實現(xiàn)小學生計算機輔助教學系統(tǒng)

    C語言實現(xiàn)小學生計算機輔助教學系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)小學生計算機輔助教學系統(tǒng),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • C++?中如何結(jié)束?while?(cin>>str)?的輸入

    C++?中如何結(jié)束?while?(cin>>str)?的輸入

    這篇文章主要介紹了C++?中如何結(jié)束?while?(cin>>str)?的輸入,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • 關于C++一些特性的探究

    關于C++一些特性的探究

    下面小編就為大家?guī)硪黄P于C++一些特性的探究。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-06-06
  • C語言/C++中如何產(chǎn)生隨機數(shù)

    C語言/C++中如何產(chǎn)生隨機數(shù)

    這里要用到的是rand()函數(shù), srand()函數(shù),和time()函數(shù)。需要說明的是,iostream頭文件中就有srand函數(shù)的定義,不需要再額外引入stdlib.h;而使用time()函數(shù)需要引入ctime頭文件
    2013-10-10
  • C語言實現(xiàn)客房管理系統(tǒng)

    C語言實現(xiàn)客房管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)客房管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C++調(diào)用libcurl開源庫實現(xiàn)郵件的發(fā)送功能流程詳解

    C++調(diào)用libcurl開源庫實現(xiàn)郵件的發(fā)送功能流程詳解

    libcurl是一個免費開源的網(wǎng)絡傳輸庫,支持ftp、ftps、tftp,http、https、telnet、ldap、pop3、smtp等多種協(xié)議,接下來讓我們一起來了解吧
    2021-11-11

最新評論