本節主要解決自定義排序衍生的第二個問題-將整形顯示為字串,而排序依然正常。
下面我們介紹三種方案:
委託繪製
使用者資料
輔助列 很多人也許會有疑慮,平時都用delegate來繪製各種按鈕、圖示、圖形等操作,它還能排序?當然,它本身是不會排序的,但他的高階用法之一就是-輔助排序。
使用者資料
輔助列總結
我們可以通過設定顯示的文字,然後呼叫qstyle的drawcontrol來進行viewitem的繪製。繪製之後,資料來源中的資料依然是qint64的,而我們看到的是繪製之後的文字-qstring型別,這樣qsortfilterproxymodel預設排序(根據源資料排序)就可以滿足我們的要求了。
void sortdelegate::paint(qpainter *painter, const qstyleoptionviewitem &option, const qmodelindex &index) const
else
}
通過效果圖我們也可以很明顯的看出來,其實內部的資料並不是介面顯示的字串,而是原始的qint64型別的資料。
ptableview->setmousetracking(true);
connect(ptableview, signal(entered(qmodelindex)), this, slot(showtooltip(qmodelindex)));
void mainwindow::showtooltip(const qmodelindex &index)
顯示在介面的資料為displayrole中的資料,我們可以看到已經通過bytestogbmbkb轉化為字串,這時我們可以通過設定userrole新增使用者資料將源資料儲存起來。
// **項資料
qvariant tablemodel::data(const qmodelindex &index, int role) const
else
if (ncolumn == date_time_column)
else
if (ncolumn == file_size_column)
return
""; }
case qt::userrole:
default:
return qvariant();
}return qvariant();
}
根據使用者源資料進行排序。
設定輔助資料
#define file_name_column 0 // 檔名
#define date_time_column 1 // 修改日期
#define file_size_column 2 // 檔案大小
#define file_size_hidden_column 3 // 檔案大小隱藏列,顯示為位元組
// 列數
int tablemodel::columncount(const qmodelindex &parent) const
// 設定**項資料
bool tablemodel::setdata(const qmodelindex &index, const qvariant &value, int role)
else
if (ncolumn == date_time_column)
// 新增**
else
if ((ncolumn == file_size_column) || (ncolumn == file_size_hidden_column))
m_recordlist.replace(index.row(), record);
emit datachanged(index, index);
// 新增**
if ((ncolumn == file_size_column) || (ncolumn == file_size_hidden_column))
return
true;
}default:
return
false;
}return
false;
}// **項資料
qvariant tablemodel::data(const qmodelindex &index, int role) const
else
if (ncolumn == date_time_column)
else
if (ncolumn == file_size_column)
// 新增**
else
if (ncolumn == file_size_hidden_column)
return
""; }
default:
return qvariant();
}return qvariant();
}// 表頭資料
qvariant tablemodel::headerdata(int section, qt::orientation orientation, int role) const
}default:
return qvariant();
}return qvariant();
}
這裡對第三列進行排序,因為第三列的資料是字串(當然,也可以反轉換),所以使用的輔助列資料,獲取位元組大小後進行對比。
bool sortfilterproxymodel::lessthan(const qmodelindex &source_left, const qmodelindex &source_right) const
}return
qsortfilterproxymodel::lessthan(source_left, source_right);
}
一般來說,輔助列(資料)只對我們處理資料有幫助,而不直接顯示在介面上,所以我們可以將其隱藏ptableview->setcolumnhidden(file_size_hidden_column, true); Qt之QHeaderView加入核取方塊
前面分享了qtableview中怎樣加入核取方塊。本節主要介紹qtableview中的表頭 qheaderview加入核取方塊的功能,以下以水平表頭為例。垂直表頭相似!qabstracttablemodel使用 槽函式,用於更新核取方塊狀態 void tableheaderview onstatec...
Qt之QHeaderView新增核取方塊
前面分享了qtableview中如何新增核取方塊。本節主要介紹qtableview中的表頭 qheaderview新增核取方塊的功能,下面以水平表頭為例,垂直表頭類似!qabstracttablemodel使用 槽函式,用於更新核取方塊狀態 void tableheaderview onstatec...
Qt5標題欄自定義QHeaderView自定義
為了能在多個平台上使用自定義標題欄視窗,試了網上好幾個版本,都多少有些問題 最後在github上找到了乙個稍微看的過去的乙個版本,稍加更改後可以在mac os ubuntu,window 上正常使用的版本。整體效果圖 完成了自定義標題視窗後繼續擴充套件了qtableview的水平標題欄,實現了過濾 ...