标签: qabstractlistmodel

如何从QML中的listview访问currentItem的角色?

我正在尝试从QML中的ListView访问角色.基本上,我在我的QML中有这个:

ListView {
    id: myId
    model: myModel
    delegate: Item {
        Text {
            text: model.text
        }
        Text {
            text: model.moreText
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

myModel是一个QAbstractListModel实现.QML部分是可重用的组件,因此模型可以具有各种数据类型的任意数量的不同角色.我想要做的是绑定currentItemListView属性的给定角色的值.换句话说,我想Component在页面上有一些可以将属性绑定到ListView中当前选定项目的其他内容,如下所示:

Text {
    text: myId.currentItem.text // Or myId.currentItem.model.text (or something similar)
}
Run Code Online (Sandbox Code Playgroud)

请记住,我需要这个一般可用,因为我将为许多模型类型做很多事情,我试图不为每个模型和ListView编写那种自定义代码.

看起来访问当前所选项目的属性应该很简单,但据我所知,这是不可能的.当只有一个角色时,模型似乎被区别对待,这个问题更加复杂.我的意思是,有时您通过model.roleName而不是只使用一个角色来访问您的角色modelData.

如果有人有任何建议,我会非常感激.非常感谢!

编辑

我找到了这个:

http://comments.gmane.org/gmane.comp.lib.qt.qml/1778

但是,这似乎对我没用.当我尝试在我的QML脚本中使用数据时,我遇到类型错误,并且没有可用的类型转换,所以我不知道该怎么做.欢迎任何建议!

谢谢!

插口

listview roles qml qabstractlistmodel

20
推荐指数
2
解决办法
3万
查看次数

如何将QModelIndex与新行相关联?

我已经制作了一个QAbstractListModel模型索引包含我绝对需要的指针来处理数据.我这样添加数据:

void PointListModel::addPoint(int frameNumber, QPoint const& pos)
{
    PointItem *pointItem = new PointItem( frameNumber, pos );
    QModelIndex newRow = this->createIndex( m_points.count(), 0, pointItem );

    qDebug() << newRow.internalPointer();

    beginInsertRows( newRow, m_points.count(), m_points.count() );
    m_points.insert( m_points.count( ), pointItem );
    endInsertRows();

    emit pointAdded( pointItem, pos );
}
Run Code Online (Sandbox Code Playgroud)

直到后来才意识到,参数beginInsertRows是要求新行的模型索引,而不是新行的实际模型索引.

所以,在这个时间点,Qt让我无法提供QModelIndex与这个特定行相关联的东西.如何为这个新行创建自己的模型索引?

qt qabstractlistmodel qmodelindex

7
推荐指数
1
解决办法
1万
查看次数

在ListView中使用QAbstractListModel

我是Qt的新手,所以请耐心等待.

我已成功设法从StringList和Object的QList填充ListView*

我现在正在努力的是使用在C++中定义的派生QAbstractListModel的类在QML中填充ListView.

这是我的CPP类的原型:

class MessageListEntryModel : public QAbstractListModel
{

Q_OBJECT
public:

enum eMLERoleTypes
{
    MLERT_MSG = Qt::UserRole+1,
    MLERT_COLOR
};

                                MessageListEntryModel(QObject* parent=0);
        virtual                 ~MessageListEntryModel();

        void                    AddEntry(QString aMessage, QColor aColor);

        // pure virtuals implementations
        QVariant                data(const QModelIndex &index, int role = Qt::DisplayRole) const;
        int                     rowCount(const QModelIndex &parent = QModelIndex()) const ;
        int                     columnCount(const QModelIndex &parent = QModelIndex()) const ;
        QModelIndex             index(int row, int column, const QModelIndex &parent = QModelIndex()) const;
        QModelIndex             parent(const QModelIndex &child) const ;

        QHash<int,QByteArray>   roleNames();
private:
 QList<MessageEntry*> m_vpMessages; …
Run Code Online (Sandbox Code Playgroud)

qt listview qabstractlistmodel qt5 qtquick2

7
推荐指数
1
解决办法
1万
查看次数

QQmlListProperty vs QAbstractListModel

我试图了解如何选择是否使用a QAbstractListModelQObjecta QQmlListProperty.

鉴于QQmlListProperty处理"角色"功能必须使用QAbstractListModel它来编写,它似乎是不那么乏味的路线.

我不知道大多数人是否建议使用QAbstractListModel仅仅因为它已经存在更长时间或者由于某种原因它是更好的选择.

我也没有找到任何关于两种选择之间权衡的讨论.这个问题是在Qt开发者日讨论讨论期间提出的QAbstractListModel,但答案是"那也行".

qt qml qabstractlistmodel

7
推荐指数
1
解决办法
436
查看次数

带有QAbstractListModel的QListView显示一个空列表

QListView用自定义创建了一个非常简单的例子QAbstractListModel.将QListView被显示,但它是空的.

我究竟做错了什么?

码:

#include <QListView>
#include <QAbstractListModel>
#include <QApplication>

class DataModel: public QAbstractListModel
{
public:
    DataModel() : QAbstractListModel() {}
    int rowCount( const QModelIndex & parent = QModelIndex() ) const { return 2; }
    QVariant data( const QModelIndex & index, int role = Qt::DisplayRole ) const
    {
        return "a";
    }
};

int main( int argc, char **argv)
{
    QApplication app(argc, argv, true);
    QListView *lv = new QListView();
    DataModel d;
    lv->setModel( &d ); 
    lv->show();
    app.setMainWidget(lv);
    app.exec(); …
Run Code Online (Sandbox Code Playgroud)

qt qlistview qabstractlistmodel

6
推荐指数
1
解决办法
5069
查看次数

按QML ListView中的角色对QAbstractListModel派生模型进行排序

我已经基于底层QHash创建了一个QAbstractListModel派生模型.由于我需要在QML中使用该模型,我无法利用Qt小部件和视图集成的排序功能.

我尝试使用QSortFilterProxyModel但它似乎不适用于我的模型.让模型在QML中正常工作并不够乏味,现在我仍然坚持排序.

任何建议表示赞赏.

这是模型来源:

typedef QHash<QString, uint> Data;

class NewModel : public QAbstractListModel {
    Q_OBJECT
    Q_PROPERTY(int count READ count NOTIFY countChanged)

public:
    NewModel(QObject * parent = 0) : QAbstractListModel(parent) {}

    enum Roles {WordRole = Qt::UserRole, CountRole};

    QHash<int, QByteArray> roleNames() const {
        QHash<int, QByteArray> roles;
        roles[WordRole] = "word";
        roles[CountRole] = "count";
        return roles;
    }

    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const {
        if (index.row() < 0 || index.row() >= m_data.size()) return QVariant();
        Data::const_iterator iter = m_data.constBegin() + index.row();

        switch …
Run Code Online (Sandbox Code Playgroud)

sorting qt qml qabstractlistmodel qsortfilterproxymodel

6
推荐指数
2
解决办法
5150
查看次数

从QAbstractListModel中删除行

我有一个自定义模型,它源自QAbstractListModel,它暴露给QML.我需要支持添加新项目和删除现有项目的操作.虽然插入操作没有任何问题,但删除操作会导致应用程序在调用endRemoveRows()函数时崩溃.

    void GPageModel::addNewPage()
    {
        if(m_pageList.count()<9)
        {
            beginInsertRows(QModelIndex(),rowCount(),rowCount());
            GPage * page = new GPage();
            QQmlEngine::setObjectOwnership(page,QQmlEngine::CppOwnership);
            page->setParent(this);
            page->setNumber(m_pageList.count());
            page->setName("Page " + QString::number(m_pageList.count()+1));
            m_pageList.append(page);
            endInsertRows();
        }
    }

    void GPageModel::removePage(const int index)
    {
        if(index>=0 && index<m_pageList.count())
        {        
            beginRemoveRows(QModelIndex(),index,index);
            qDebug()<<QString("beginRemoveRows(QModelIndex(),%1,%1)").arg(index);
            GPage * page = m_pageList.at(index);        
            m_pageList.removeAt(index);
            delete page;
            endRemoveRows();
        }
    }
Run Code Online (Sandbox Code Playgroud)

GPage类派生自QObject.我很想知道在尝试调用endRemoveRows()时导致应用程序崩溃的原因.当调用endRemoveRows()时,我在"QList :: at:"索引超出范围""时得到"ASSERT失败."如何从QAbstracListModel中删除行?还有其他方法吗?

我在Windows 7 64位计算机上使用Qt 5.1.0.

qt qabstractitemmodel qml qabstractlistmodel qtquick2

6
推荐指数
1
解决办法
9978
查看次数

Qt:QAbstractItemModel中的setData方法

我是模型视图的新手,我在检查文档的同时也一直关注本教程,我偶然发现了这个小细节:可以在这里下载的教程代码在QAbstractItemModel类(这里是QAbstractListModel)中setData方法,代码是:

def setData(self, index, value, role = QtCore.Qt.EditRole):
    if role == QtCore.Qt.EditRole:

        row = index.row()
        color = QtGui.QColor(value)

        if color.isValid():
            self.__colors[row] = color
            self.dataChanged.emit(index, index)
            return True
    return False
Run Code Online (Sandbox Code Playgroud)

根据教程中的解释和我从文档中理解的内容,如果函数返回True,则视图会更新,如果返回false,则没有任何反应,但是当我将代码更改为:

def setData(self, index, value, role = QtCore.Qt.EditRole):
    if role == QtCore.Qt.EditRole:

        row = index.row()
        color = QtGui.QColor(value)

        if color.isValid():
            self.__colors[row] = color
            self.dataChanged.emit(index, index)
            return False # This is what I changed in the code
    return False
Run Code Online (Sandbox Code Playgroud)

我意识到如果color.isValid()即使函数返回False,视图仍会更新.我是否误解了setData方法中的返回角色或者它是一个错误?

作为参考,我使用的是PySide 1.2.1,而不是PyQt4.

python qt qtgui qabstractitemmodel qabstractlistmodel

6
推荐指数
1
解决办法
6424
查看次数

QML 列表视图/C++ 列表模型中的大量数据

在我的项目中,我需要使用 QML 列表视图来显示一些数据的列表。而且,我使用的 QT 版本是 QT 5.0.2。由于在这个版本的 Qt 中没有滚动条视图,我设法按照这个例子来实现它。

现在,数据源是另一个组件,它提供了 C++ API 来请求数据范围。并且数据集中的元素数量可能很大(以数万计)。

我已按照以下步骤实现我的要求:

  1. 我创建了一个继承自 QAbstractListModel 的 C++ 类,并且覆盖了 rowCount、data、canfetchmore 和 fetch more 函数。
  2. 在 QML 中,我将 C++ 实例称为模型。
  3. 每当调用 fetchmore() 函数时,我都会使用由另一个组件提供的 C++ API 请求下一组数据,并将相同的数据附加到我的列表模型中。

到目前为止,还不错。但我需要澄清几点——

  1. 如果我继续将数据附加到我的列表模型,那么我最终会在列表中存储数千个元素(我不想这样做)。我想限制列表中的元素数量并将其用作环形缓冲区。这可能吗?
  2. fetchmore 中的 QModelIndex 参数作为无效索引接收。为什么?
  3. 假设一个案例:滚动条上提到了字母,当用户在滚动条上选择 Y 时,我应该获取以 Y 开头的元素。在这里,我可以从我的外部组件获取数据并使用新数据重置列表模型。但是,如果我这样做,那么我的列表将从 Y 元素开始,我将无法向上滚动以获取以前的元素。-- 还有其他方法可以实现吗?
  4. 此外,如果我询问大量数据(例如在第 3 点中提到的情况),我的其他组件需要相当长的时间 - 有什么建议可以做出更好的设计来处理这种情况吗?
  5. 除了 fetchmore() 之外,还有什么方法可以动态更新模型。

我在谷歌上花了很多时间来回答我的问题,但我成功地失败了。:(

任何帮助表示赞赏。提前致谢。

qabstractitemmodel qml qabstractlistmodel

6
推荐指数
0
解决办法
1136
查看次数

如何将模型中没有的额外项目添加到 QML ComboBox 中?

我有一个 QML ,上面ComboBox有一个QAbstractListModel附件。像这样的东西:

ComboBox {
    model: customListModel
}
Run Code Online (Sandbox Code Playgroud)

我希望它在下拉列表中显示模型中没有的额外项目。

例如,假设有两个项目customListModel:苹果和橙子。在下拉列表中应显示以下选项:

  • 全选
  • 苹果
  • 橙子

我无法将其添加到模型中,因为它包含自定义对象,并且我在程序中的其他几个地方使用了该模型,这会搞砸一切。

如何将这个“全选”选项添加到ComboBox???

qt combobox qml qabstractlistmodel

5
推荐指数
1
解决办法
3262
查看次数