python - QTreeView 与 sqlalchemy

标签 python qt pyqt pyside

我想制作一个 QTreeView 来显示我通过 sqlalchemy 获得的一些数据。大约有 1000-10.000 行要显示。我认为在这里使用模型比使用更简单的 QTreeWidget 更好,因为我认为将模型连接到 sqlalchemy 会相对容易,因为我认为这是经常做的事情。显然不是......我找不到这方面的好例子。

我查看了 QStandardItemModel 的文档,据我了解,我必须为每个值创建一个 QStandardItem。对于数千行乘以九列,我认为这将非常慢。
我曾与ObjectListView合作过之前在 wxpython 中使用过,并希望 Qt 中的 TreeView 也能类似地工作,所以当我发现这将是多么复杂时,你可以想象我的失望:P。

所以我的问题:

  1. 有没有办法将 sqlalchemy 连接到 QTreeView?
  2. 如何在 TreeView 中使用 sqlaclhemy 返回的项目? (就像 ObjectListView 所做的那样)

如您所见,我对模型和 View (以及 Qt)非常陌生,因此非常欢迎任何答案、解释、链接、有用的提示或任何与此相关的内容!

最佳答案

好消息 - 您不需要创建任何 QStandardItems。 Qt View 类从不调用数据类上的任何方法,因此您的数据可以按照您想要的任何方式存储。它们仅调用模型类上的方法(与 Ruby on Rails 不同,其中每个数据类都被视为一个模型,而在 Qt 中,“模型”指的是数据类的整个集合)。

我建议子类化 QAbstractItemModel (请参阅“子类化”部分)并从那里开始工作。如果您只有一个平面列表,您甚至可以对其进行设置,以便您的自定义模型简单地包装从数据库返回的结果。

我用 C++ 做了这个 - 我花了很长时间才理解它,但是一旦我这样做了,它就很容易使用。这是我的只读模型的基本代码 - 您必须将其转换为 python,但希望它可以减轻您的痛苦!

注意:下面的代码假设您的数据是一个平面列表(没有父子关系)。如果不是这种情况,请查看this tutorial有关您必须进行哪些调整的详细信息。

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

关于python - QTreeView 与 sqlalchemy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12126225/

相关文章:

python - 外语python中的Windows CMD行错误

PYTHON - 将特殊字符转换为字符串

python - 如何用 C 或 python 找出 mp3 的 bpm

c++ - QGraphicsView 奇怪地呈现其子小部件的子小部件

qt - QML2 ApplicationWindow按键处理

python - 如何在 LLDB 数据格式化程序中登录到控制台

python - 如何通过socket连接使qml对象的属性为 "dynamically updatable"?

python - SQL 更新语句但使用 pyodbc

python - 更改 QTableWidgetItem 背景颜色

c++ - Qt : Accessing Secure Objects using session-id from a server