Qt ModelView教程(二)——應用舉例(一)

點擊上方藍字可直接關注!方便下次閱讀。如果對你有幫助,可以點個在看,讓它可以幫助到更多老鐵~

上次和大家分享了Qt Model/View只讀表的方法,簡單回顧下:

因爲是爲一個Table設置Model,爲了快速入門,我們選擇繼承QAbstractTableModel。繼承後需要重寫三個函數,分別是Model的行數和列數、以及每個Cell需要顯示的內容。

 

這次和大家分享Qt Model/View教程的幾個其他例子。

 

一、 使用Roles屬性擴展只讀Table

怎麼擴展?擴展些什麼?

上次的示例中我們是在role == Qt::DisplayRole時進行的顯示,那麼擴展時是不是有其他Roles屬性?

具體擴展的內容,是不是也根據這些Roles呢?答案是肯定的。

無需更改其他任何內容即可設置字體,背景色,對齊方式和複選框等屬性,其他屬性可請參閱Qt名稱空間文檔以瞭解有關Qt :: ItemDataRole枚舉功能的更多信息。

 

在上次的程序基礎上添加BackgroundRole屬性,如下:

case Qt::BackgroundRole:
        if (row == 1 && col == 2)  //change background only for cell(1,2)
            return QBrush(Qt::red);
        break;

效果如下:

這裏面值得注意的是調用data()函數的頻率,具體可打印效果進行查看,一次可以判斷使用分離的模型如何影響應用程序的性能。還有就是當鼠標懸浮在Cell時,都會對data()進行調用。

二、 Cell中顯示時鐘

回顧之前的操作,View都是自動將數據與屬性顯示出來的,並且在特定條件下進行“更新顯示”,如將鼠標懸浮在Cell上時;那麼我們如何主動讓Model更新數據呢——Model可以接收數據變化的信號,從而進行響應。Ok,下面看具體的例子:

 

接下來擴展的是在單元格中每一秒顯示一次當前的時間。

 

我們要考慮的幾個問題:

如何產生一個更新時間的計數器?

如何將信號發送給Model進行更新?

 

直接看代碼:

①使用QTimer進行計數,溢出時響應如下:

void MyModel::slot_updateTime()
{
    QModelIndex topLeft = createIndex(0,0);
    emit dataChanged(topLeft, topLeft);


}

將具體的Cell信息發送出去即可。

 

DisplayRole屬性設置

int row = index.row();
    int col = index.column();


    if (role == Qt::DisplayRole)
    {
        if (row == 0 && col == 0)
        {
            return QTime::currentTime().toString();
        }
    }

效果如下:

小結:本次主要和大家分享一下data()函數中其他屬性的應用以及如何通過信號更新Cell數據。下次和大家分享下在Model中如何設置行列標題以及如何設置Table的可編輯屬性。

 

學不可以已,積少成多!

歡迎大家關注公衆號,定期分享編程中的小知識。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章