0

QAbstractTableModel と QAbstractItemModel をサブクラス化したカスタム モデルを使用して Qtableview を動作させています。

私はQlineeditを持っています.onclickedはビューをフィルタリングします:

// model.cpp setFilter(QString strFilter) 関数はインターン QList を検索し (この Qlist は実際にはモデルに関連付けられています)、一致するものが見つかった場合: m_filterSet.insert(i);

これはすべてうまくいきます。問題は、テーブルビューのCRUD操作(行の挿入、行の削除..)があり、これもうまく機能することです! しかし、フィルター処理されたセットから行を選択するとき、フィルター処理されたセット ( QSet ) からこの選択された行が QList のどこにあるかを正確に知る必要があります。

ui.myView->selectionModel()->currentIndex().row();

明らかな現在のビューの間違ったインデックス カウントを与えます。

QSetで選択した行から値(int)を抽出するにはどうすればよいですか? この関数をモデルに追加したとき:

foreach (const int &value, m_filterSet)
        qDebug() << value;

すべての i 値が正常に出力されました。例: 3410、3411、3412 (これらは私のクライアント ID です)

Qset で選択した行のこの ID を抽出できれば、インターン QList を反復処理する関数を記述して、一致するものを見つけることができます。

if(m_Intern[i].nClientID == nId){   // nId = value inside Qset for selected row in view
    return nIdx;
}
4

2 に答える 2

4

Qt には問題の解決策があります。使用するだけQSortFilterProxyModelです。次のことを行う必要があります。

  • それをサブクラス化し、独自のフィルタリング関数を記述します ( filterAccpetsRow)
  • 元のモデルをフィルタリングしてプロキシする
  • フィルタリング モデルをビューにアタッチする
  • QSortFilterProxyModel::mapToSource()フィルター処理されたモデルと元のモデルのインデックス間の変換に使用します。

これにより、ソース データ モデルが 1 つだけの複数のビューを持つことができます。各ビューには異なるフィルターが含まれる場合があります。

于 2013-03-13T08:51:51.973 に答える
0

しばらく考えてから解決しました。モデル内に別の関数を実装する必要がありました。

int myClass::screenIndex2DataIndex(int nIdxScreen)
{
   if(m_bUseFilter)
    {
        int nIdx =-1;
        for(int i=0;i<m_lstIntern.size();i++)
        {
            if(m_filterSet.contains(i))
            {
                nIdx++;
                if(nIdx == nIdxScreen){
                    return i;   
                }
            }
        }
        return -1; //not found
    }
    else{
        return nIdxScreen;
    }
}

このようにして、フィルタリングされたビューの現在のインデックスを見つけることができます。これは、インターン リストにあります。

この後、リターンを通じて nClientID を取得するのは簡単です: return m_lstIntern[idx].nClientId

于 2013-03-13T23:37:39.183 に答える