Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python QTreeView与sqlalchemy_Python_Qt_Pyqt_Pyside - Fatal编程技术网

Python QTreeView与sqlalchemy

Python QTreeView与sqlalchemy,python,qt,pyqt,pyside,Python,Qt,Pyqt,Pyside,我想制作一个QTreeView,显示我通过sqlalchemy获得的一些数据。大约有1000-10000行要显示。我认为在这里使用模型比使用更简单的QTreeWidget更好,因为我认为将模型连接到sqlalchemy相对容易,因为我假设这是经常做的事情。显然不是。。。我找不到这方面的好例子 我查看了QStandardItemModel的文档,据我所知,我必须为每个值创建一个QStandardItem。数千行乘以九列,我认为这将非常缓慢。 我以前在wxpython中工作过,希望Qt中的treev

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

我查看了QStandardItemModel的文档,据我所知,我必须为每个值创建一个QStandardItem。数千行乘以九列,我认为这将非常缓慢。
我以前在wxpython中工作过,希望Qt中的treeview也能起到类似的作用,所以当我发现这将是多么复杂时,你可以想象我的失望:P

所以我的问题是:

  • 有没有办法将sqlalchemy连接到QTreeView
  • 如何在我的树视图中使用sqlaclhemy返回的项目?(与ObjectListView类似)
  • 正如你们所看到的,我对模型和视图(以及Qt)非常陌生,所以任何答案、解释、链接、有用的提示或者任何关于这方面的东西都是非常受欢迎的

    好消息-您不需要创建任何QStandarditem。Qt视图类从不调用数据类上的任何方法,因此数据可以按任何方式存储。它们只调用模型类上的方法(不像在RubyonRails中,每个数据类都被视为一个模型,在Qt中,“模型”指的是整个数据类集合)

    我建议使用子类化(参见“子类化”部分)并从那里开始工作。如果您只有一个平面列表,您甚至可以设置它,以便您的自定义模型只包装从数据库返回的结果

    我在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();
        }
    };
    
    模板类ListModel:公共QAbstractItemModel
    {
    受保护的:
    //这是我存储数据的地方-它只是一个通用列表!
    //是否尝试使用SQL结果?
    QList-mData;
    公众:
    ListModel():mData(){}
    int columnCount(常量QModelIndex和index)常量
    {
    //您可能需要一个不同的号码:
    返回1;
    }
    QVariant数据(常量QModelIndex和索引,int角色)常量
    {
    if(index.isValid()&&role==Qt::DisplayRole&&index.column()==0)
    {
    if(T*T=(T*)index.internalPointer())
    {
    //基于列号的内容:
    返回t->data[index.column()];
    }
    }
    返回QVariant();
    }
    QVariant headerData(int段,Qt::定向,int角色)常量
    {
    如果(方向==Qt::水平和角色==Qt::显示角色和部分==0)
    {
    //基于列号的内容:
    返回“标题文本”;
    }
    返回QVariant();
    }
    QModelIndex索引(int行、int列、常量QModelIndex&parent)常量
    {
    //如果您有分层模型,请对此进行调整:
    return(parent.isValid())?QModelIndex():createIndex(行,列,(void*)mData[row]);
    }
    QModelIndex父项(常量QModelIndex和子项)常量
    {
    //如果您有分层模型,请对此进行调整:
    返回QModelIndex();
    }
    int行计数(常数QModelIndex和索引)常数
    {
    //如果您有分层模型,请对此进行调整:
    返回(index.isValid())?0:mData.count();
    }
    };
    
    谢谢,这说明了很多问题!我以前已经研究过这个问题,我发现QabstracteModel在Python中的速度非常慢。我采用了同样的标准QT树视图示例并将其翻译为Python,性能没有使用QStaleReTimeMod那么好,甚至只是QTreWiGeGET,甚至是10K+项,我也没有做任何花样。@ Eriululs-嗯。不能评论,只是在C++中做过,但这并不好。如果这不可行,您最终使用了什么?我通常(10个中的9个)使用QTreeWidget,这取决于您如何构造它以加载它,它可以很好地处理自己。如果我想在不止一种视图类型中使用它,我真的只会为某些东西创建自己的模型。那只是我的看法。