1

QTableViewモデルがですQStandardItemModel。列の 1 つで、新しいインデックスを作成し、それを使用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();
}
4

1 に答える 1

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);
于 2014-12-15T19:20:01.510 に答える