【问题标题】:Sort QTableView column containing index widgets对包含索引小部件的 QTableView 列进行排序
【发布时间】:2014-12-15 18:47:58
【问题描述】:

我有一个QTableView,其型号是QStandardItemModel。在其中一列中,我创建了新索引并使用setIndexWidget 将它们分配给自定义颜色选择小部件。我希望能够使用此列对视图进行排序,以便用户可以对具有相似颜色的项目进行分组。我已经为自定义小部件实现了operator<,但是每当我尝试使用它时,我都会得到一个运行时调试断言:

Expression: Invalid operator<

为了按此列排序,我是否需要为小部件附加到的QStandardItem 设置一些角色数据?

我认为 operator

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();
}

【问题讨论】:

    标签: c++ qt c++11 qtableview qstandarditemmodel


    【解决方案1】:

    默认情况下,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);
    

    【讨论】:

      猜你喜欢
      • 2021-11-01
      • 1970-01-01
      • 2012-07-21
      • 2012-07-07
      • 2019-04-28
      • 2015-04-06
      • 1970-01-01
      • 2019-02-24
      • 2018-12-08
      相关资源
      最近更新 更多