我正在尝试从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部分是可重用的组件,因此模型可以具有各种数据类型的任意数量的不同角色.我想要做的是绑定currentItem
ListView属性的给定角色的值.换句话说,我想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脚本中使用数据时,我遇到类型错误,并且没有可用的类型转换,所以我不知道该怎么做.欢迎任何建议!
谢谢!
插口
我已经制作了一个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的新手,所以请耐心等待.
我已成功设法从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) 我试图了解如何选择是否使用a QAbstractListModel
或QObject
a QQmlListProperty
.
鉴于QQmlListProperty
处理"角色"功能必须使用QAbstractListModel
它来编写,它似乎是不那么乏味的路线.
我不知道大多数人是否建议使用QAbstractListModel
仅仅因为它已经存在更长时间或者由于某种原因它是更好的选择.
我也没有找到任何关于两种选择之间权衡的讨论.这个问题是在Qt开发者日讨论讨论期间提出的QAbstractListModel
,但答案是"那也行".
我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) 我已经基于底层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) 我有一个自定义模型,它源自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.
我是模型视图的新手,我在检查文档的同时也一直关注本教程,我偶然发现了这个小细节:可以在这里下载的教程代码在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.
在我的项目中,我需要使用 QML 列表视图来显示一些数据的列表。而且,我使用的 QT 版本是 QT 5.0.2。由于在这个版本的 Qt 中没有滚动条视图,我设法按照这个例子来实现它。
现在,数据源是另一个组件,它提供了 C++ API 来请求数据范围。并且数据集中的元素数量可能很大(以数万计)。
我已按照以下步骤实现我的要求:
到目前为止,还不错。但我需要澄清几点——
我在谷歌上花了很多时间来回答我的问题,但我成功地失败了。:(
任何帮助表示赞赏。提前致谢。
我有一个 QML ,上面ComboBox
有一个QAbstractListModel
附件。像这样的东西:
ComboBox {
model: customListModel
}
Run Code Online (Sandbox Code Playgroud)
我希望它在下拉列表中显示模型中没有的额外项目。
例如,假设有两个项目customListModel
:苹果和橙子。在下拉列表中应显示以下选项:
我无法将其添加到模型中,因为它包含自定义对象,并且我在程序中的其他几个地方使用了该模型,这会搞砸一切。
如何将这个“全选”选项添加到ComboBox
???