Qt之QHeaderView自定義排序(終極版)

2021-09-23 21:25:19 字數 3453 閱讀 9527

本節主要解決自定義排序衍生的第二個問題-將整形顯示為字串,而排序依然正常。

下面我們介紹三種方案:

委託繪製

使用者資料

輔助列 很多人也許會有疑慮,平時都用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的水平標題欄,實現了過濾 ...