點擊上方藍字可直接關注!方便下次閱讀。如果對你有幫助,可以點個在看,讓它可以幫助到更多老鐵~
上次和大家分享了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的可編輯屬性。
學不可以已,積少成多!
歡迎大家關注公衆號,定期分享編程中的小知識。