- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我目前的情况是,我有一个带有 MyClass 的 QList,还包括一个列表 QList。
为了显示这个列表层次结构,我想在 ListView 中提供一个 Repeater。
我用 QStringList 试过了,效果很好(见下面未注释的行)。当我尝试使用我的 QList 执行此操作时,我无法访问 MySubClass 的名称属性。而是显示 MyClass 的名称属性。
错误的输出:
Object 1
Object 1
Object 1
Object 2
正确的输出应该是:
Object 1
SubObject 1
SubObject 2
Object 2
编辑:2014 年 12 月 8 日我发现,为什么子列表不起作用。我只需要替换子 ListView 的委托(delegate)中的一行(名称 -> modelData.name)。
这是我的代码:
main.cpp
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include <QList>
#include <QDebug>
#include "myclass.h"
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
/* create simple stringlist */
QStringList dataList;
dataList << "Data 1"
<< "Data 2"
<< "Data 3";
/* create more complex QObject List */
MySubClass *mySubObject = NULL;
QList<QObject *> mySubList;
mySubObject = new MySubClass;
mySubObject->setName("SubObject 1");
mySubList.append(mySubObject);
mySubObject = new MySubClass;
mySubObject->setName("SubObject 2");
mySubList.append(mySubObject);
/* create object list */
MyClass *myObject = NULL;
QList<QObject *> myList;
myObject = new MyClass;
myObject->setName("Object 1");
myObject->setDataList(dataList);
myObject->setObjectList(mySubList);
myList.append(myObject);
myObject = new MyClass;
myObject->setName("Object 2");
myObject->setDataList(dataList);
myList.append(myObject);
qDebug () << myList.size();
myObject = NULL;
/* start engine and expose object list */
QQmlApplicationEngine engine;
QQmlContext *myContext = engine.rootContext();
myContext->setContextProperty("myObjectList", QVariant::fromValue(myList));
engine.load(QUrl(QStringLiteral("qrc:///main.qml")));
return app.exec();
}
MyClass.h
#ifndef MYCLASS_H
#define MYCLASS_H
#include <QObject>
#include <QStringList>
#include "mysubclass.h"
class MyClass : public QObject
{
Q_OBJECT
Q_PROPERTY (QString name READ name WRITE setName NOTIFY nameChanged)
Q_PROPERTY (QStringList dataList READ dataList WRITE setDataList NOTIFY dataListChanged)
Q_PROPERTY (QList<QObject *> objectList READ objectList WRITE setObjectList NOTIFY objectListChanged)
public:
inline MyClass(QObject *parent = 0) : QObject(parent) {}
inline ~MyClass() {}
QString name() const
{
return m_name;
}
QStringList dataList() const
{
return m_dataList;
}
QList<QObject *> objectList() const
{
return m_objectList;
}
public slots:
void setName(QString arg)
{
if (m_name != arg) {
m_name = arg;
emit nameChanged(arg);
}
}
void setDataList(QStringList arg)
{
if (m_dataList != arg) {
m_dataList = arg;
emit dataListChanged(arg);
}
}
void setObjectList(QList<QObject *> arg)
{
if (m_objectList != arg) {
m_objectList = arg;
emit objectListChanged(arg);
}
}
signals:
void nameChanged(QString arg);
void dataListChanged(QStringList arg);
void objectListChanged(QList<QObject *> arg);
private:
QString m_name;
QStringList m_dataList;
QList<QObject *> m_objectList;
};
#endif // MYCLASS_H
MySubClass.h
#ifndef MYSUBCLASS_H
#define MYSUBCLASS_H
#include <QObject>
#include <QString>
class MySubClass : public QObject
{
Q_OBJECT
Q_PROPERTY (QString name READ name WRITE setName NOTIFY nameChanged)
public:
inline MySubClass(QObject *parent = 0) : QObject(parent) {}
inline ~MySubClass() {}
QString name() const
{
return m_name;
}
public slots:
void setName(QString arg)
{
if (m_name != arg) {
m_name = arg;
emit nameChanged(arg);
}
}
signals:
void nameChanged(QString arg);
private:
QString m_name;
};
#endif // MYSUBCLASS_H
main.qml
import QtQuick 2.2
import QtQuick.Window 2.1
Window {
visible: true
width: 360
height: 360
ListView {
id: view
anchors.fill: parent
model: myObjectList
delegate: Item {
width: parent.width
height: col.height
Column {
id: col
Text {
id: nameLabel
text: name
}
Repeater {
id: dataView
// model: dataList
model: objectList
delegate: Text {
id: dataLabel
// text: modelData
// text: name
/* Here's the fix!!! (dunno why, but it works) */
text: modelData.name
}
}
}
}
}
}
最佳答案
为了向 QML 列表公开 QObject 派生类型,应该使用 QQmlListProperty而不是 QList<T>
作为属性类型
MyClass.h:
Q_PROPERTY (QQmlListProperty<MySubClass> objectList READ getMySubClassList NOTIFY objectListChanged)
public:
QQmlListProperty<MySubClass> getMySubClassList() {
return QQmlListProperty<MySubClass>(this, 0, &MyClass::countMySubClassList, &MyClass::atMySubClassList);
}
static int countMySubClassList(QQmlListProperty<MySubClass> *property) {
MyClass *m = qobject_cast<MyClass *>(property->object);
return m->m_objectList.size();
}
static MySubClass *atMySubClassList(QQmlListProperty<MySubClass> *property, int index) {
MyClass *m = qobject_cast<MyClass *>(property->object);
return m->m_objectList[index];
}
private:
QList<MySubClass *> m_objectList
此外,您应该注册 MySubClass
通过使用 qmlRegisterUncreatableType 输入 QML 系统
qmlRegisterUncreatableType<MySubClass,1>("project.mySubClass",1,0,"mySubClass","error message");
关于c++ - 将 QList<QObject *> 层次结构公开给 QML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27312189/
我对 Qt Qlist 容器有一个有趣的问题。尝试将 QList append 到 QList 会使我的迭代器指向内存的未知部分。 QList listSmall; QList> listBig; f
我对 documentation. 的 QList 复制构造函数感到困惑 QList::QList ( const QList & other ) Constructs a copy of other
我试图在运行时将项目附加到 QList,但运行时出现错误消息。基本上我想做的是制作一个 QList 的 QList 并向每个内部列表添加一些 customClass 对象。这是我的代码: 小部件.h:
所以我有一个名为 AppointmentSchedule 的类,它属于以下类型: namespace Ui { class AppointmentSchedule; } class Appointme
我正在使用 Qt5 用 C++ 编写一个视频抓取应用程序。我正在关注他们的示例代码并查看获取相机信息的文档: http://doc.qt.io/qt-5/qcamerainfo.html 我遇到的问题
我试图将 2d QList 作为 Q_PROPERTY 传递到 QML,但是,在 QML 内部,我无法实际访问任何信息。 一些代码: C++:q_property 由构造函数中的 q_invokabl
我有以下方法(只有 1 个参数),我想对其进行调整以用于 1 个以上的参数。我尝试使用默认参数,但这不起作用。 (只有旧方法的原始代码工作正常)令我印象深刻的是该声明中省略了变量名。 为什么? 这是我
在我的 mainwindow.h 中,我有一个 QList m_qlServoList,它应该存储指向 Servo 对象的指针: QList m_qlServoList; 当我尝试将新的伺服指针 ap
有没有简单的方法来复制QList从新 QList 中的位置 a 到 b? 我测试过: QList newList(list.begin()+5,list.end()); 但它不起作用。我收到错误消
我找不到使用另一个类模板将 QObjects 的 QList 转换为另一个 QList 的方法。我有一个创建 QObjects 实例然后返回 QList 的函数。所以我的问题是,我可以将 QList
有没有简单的方法来创建 QList来自 QList ? (不迭代 QList 并将每个元素添加到 QList ) 最佳答案 答案是否定的。你怎么可能在不迭代的情况下将一个转换成另一个?即使您正在使用某
我有几个属性类型为 QList 的类.我使用原始指针来表示所有权。此访问器将返回 QList>因为我们不想分发原始指针。问题是目前每个访问器或多或少看起来像下面这样: QList> values; C
我正在尝试使用 QT 框架获取存储在 QList 中的帐户列表的总余额。 我的问题是总余额需要从不允许我这样做的类中访问 protected 成员余额。 这个问题来自大学的作业,问题已经给了我程序的
学习C++,所以要温柔:)... 我一直主要使用堆变量(来自 C)来设计我的应用程序,所以我设计了这样的结构: QList _Criteria; // ... Criteria *c = new Cr
因此主题行中提到的代码会导致 Qt 4.8.3 和 gcc 4.7.2 出现段错误 这在 .cpp 文件中的任何类/结构之外,适用于 gcc 4.4 const QList warnings = QL
我最近一直在从事一个项目。当我尝试运行项目时,出现此错误: /ASSERT failure in QList::operator[]: "index out of range", file /usr/
我对 QT 没有太多经验,今天出现了这个问题。 QList memList; const int large = 100000; getchar(); for (int i=0; i
我明白了qCopy ,和 qCopybackward但似乎都不让我以相反的顺序复印。 qCopybackward 仅以相反的顺序复制它,但使该死的元素保持相同的顺序!我想做的就是以相反的顺序返回列表的
typedef struct { char *u8_testStep; char *u8_functionTested; char *u8_testDescription;
我有一个应用程序,其目的是获取按键值并将其放入 QList 中。但是,每次我调用处理 QList 修改的类成员函数时,成员变量 QList 都会被重置。我相信我有范围问题,但我不知道在哪里。这是我的代
我是一名优秀的程序员,十分优秀!