我有QTableView
,其模型为QStandardItemModel
。在其中一列中,我创建了新索引并使用setIndexWidget
将它们分配给自定义颜色选择窗口小部件。我希望能够使用此列对视图进行排序,以便用户可以使用相似的颜色对项目进行分组。我为自定义小部件实现了operator<
,但每当我尝试使用它时,我都会得到一个运行时调试断言:
Expression: Invalid operator<
为了按此列排序,我是否需要为小部件附加到QStandardItem
设置一些角色数据?
我认为运营商&lt;代码很好,但我也包括它以防万一。
bool operator<(const QPenWidget &rhs) const
{
// use the RGB value to index the color
int r_lhs, g_lhs, b_lhs, rgb_lhs;
int r_rhs, g_rhs, b_rhs, rgb_rhs;
this->m_pen.color().getRgb(&r_lhs, &g_lhs, &b_lhs);
rgb_lhs = (r_lhs * 65536) + (g_lhs * 256) + b_lhs;
rhs.m_pen.color().getRgb(&r_rhs, &g_rhs, &b_rhs);
rgb_rhs = (r_rhs * 65536) + (g_rhs * 256) + b_rhs;
if (rgb_lhs != rgb_rhs)
return rgb_lhs < rgb_rhs;
if (m_pen.style() != rhs.m_pen.style())
return m_pen.style() < rhs.m_pen.style();
return m_pen.width() < rhs.m_pen.width();
}
答案 0 :(得分:0)
默认情况下,QStandardItemModel
使用Qt::DisplayRole
的任何数据进行排序。虽然可以使用setSortRole
更改角色,但对于索引窗口小部件,最简单的方法是将一些排序哈希值放入显示角色(注意:这不会影响窗口小部件在视图中的显示方式)。
对于这个应用程序,这里是一个哈希函数:
int sortKey()
{
int r, g, b, rgb;
m_pen.color().getRgb(&r, &g, &b);
rgb = (r * 65536) + (g * 256) + b;
rgb *= styleModel->rowCount();
rgb += m_pen.style();
rgb *= widthModel->rowCount();
rgb += m_pen.width();
return rgb;
}
然后在创建索引时:
QStandardItem* penItem = new QStandardItem;
QPenWidget* pen = new QPenWidget;
tableView->setIndexWidget(penIndex, pen);
penItem->setData(pen->sortKey(), Qt::DisplayRole);