朗報です。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();
}
};