2

sqlalchemy で取得したデータを表示する QTreeView を作成したいと考えています。表示する行数は約 1000 ~ 10.000 行です。ここでは、単純な QTreeWidget よりもモデルを使用する方がよいと考えました。これは、モデルを sqlalchemy に接続するのが比較的簡単であると考えたためです。どうやらそうではありません...これの良い例を見つけることができません。

QStandardItemModel のドキュメントを見て、理解したように、すべての値に対して QStandardItem を作成する必要があります。数千行 × 9 列なので、これは非常に遅くなると思います。
以前にwxpythonで ObjectListView を使用したことがあり、Qt のツリービューも同様に機能することを望んでいました。

だから私の質問:

  1. sqlalchemy を QTreeView に接続する方法はありますか?
  2. ツリービューで sqlaclhemy によって返される項目を使用するにはどうすればよいですか? (ObjectListView のように)

ご覧のとおり、私はモデルとビュー (および Qt) に非常に慣れていないため、回答、説明、リンク、役立つヒント、またはこれについて何か言いたいことがあれば大歓迎です!

4

1 に答える 1

2

朗報です。QStandardItems を作成する必要はありません。Qt ビュー クラスは、データ クラスのメソッドを呼び出すことはないため、データは任意の方法で保存できます。モデル クラスのメソッドのみを呼び出します (各データ クラスがモデルと見なされる Ruby on Rails とは異なり、Qt では、「モデル」はデータ クラスのコレクション全体を指します)。

QAbstractItemModelをサブクラス化し(「サブクラス化」セクションを参照)、そこから作業することをお勧めします。フラット リストしかない場合は、カスタム モデルがデータベースから返された結果を単純にラップするように設定することもできます。

私はこれを C++ で行いました。理解するのにかなりの時間がかかりましたが、一度やると、作業は非常に簡単になりました。読み取り専用モデルの基本的なコードは次のとおりです。これを Python に変換する必要がありますが、うまくいけば私の苦労を免れることができます。

注:以下のコードは、データがフラット リスト (親子関係なし) であることを前提としています。そうでない場合は、このチュートリアルをチェックして、どのような微調整を行う必要があるかを確認してください。

template <typename T> class ListModel : public QAbstractItemModel
{
protected:
    //This is where I store my data - it's just a generic list!
    //Try using your SQL result instead?
    QList<T*> mData;

public:
    ListModel(): mData() {}

    int columnCount(const QModelIndex& index) const
    {
        //You'll probably want a different number here:
        return 1;
    }

    QVariant data(const QModelIndex& index, int role) const
    {
        if(index.isValid() && role == Qt::DisplayRole && index.column() == 0)
        {
            if(T* t = (T*) index.internalPointer())
            {
                //Something, based on column number:
                return t->data[index.column()];
            }
        }

        return QVariant();
    }

    QVariant headerData(int section, Qt::Orientation orientation, int role) const
    {
        if(orientation == Qt::Horizontal && role == Qt::DisplayRole && section == 0)
        {
            //Something, based on column number:
            return "header text";
        }

        return QVariant();
    }

    QModelIndex index(int row, int column, const QModelIndex& parent) const
    {
        //Tweak this if you have a hierarchical model:
        return (parent.isValid())? QModelIndex() : createIndex(row, column, (void*) mData[row]);
    }

    QModelIndex parent(const QModelIndex& child) const
    {
        //Tweak this if you have a hierarchical model:
        return QModelIndex();
    }

    int rowCount(const QModelIndex& index) const
    {
        //Tweak this if you have a hierarchical model:
        return (index.isValid())? 0 : mData.count();
    }
};
于 2012-08-26T00:49:30.627 に答える