gpt4 book ai didi

c++ - 获取 QList 对象的 ListView 索引

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:18:05 26 4
gpt4 key购买 nike

我公开了一个 QList<MyItem*>作为 ListView 的模型.但是我怎样才能得到 ListView MyItem*的索引对象?

上下文:我正在用 C++ 创建一个 findObject() 函数,当我找到对象(一个 MyItem* )时,我想滚动到 ListView 中的相应项目。 .

一些代码(完整的源代码和 Qt Creator 项目可以在 https://github.com/joncol/qml_test 找到)。

项目类:

class MyItem : public QObject
{
Q_OBJECT
Q_PROPERTY(qint32 data READ data NOTIFY dataChanged)

public:
MyItem() : m_data(s_counter++) {}

quint32 data() const { return m_data; }

signals:
void dataChanged();

private:
static int s_counter;
int m_data;
};

模型:

class MyCppModel : public QObject
{
Q_OBJECT

Q_PROPERTY(QQmlListProperty<MyItem> itemList READ itemList NOTIFY itemListChanged)

public:
MyCppModel()
{
m_specialItem = new MyItem;

m_model.append(new MyItem);
m_model.append(new MyItem);
m_model.append(new MyItem);
m_model.append(m_specialItem);
m_model.append(new MyItem);
}

QQmlListProperty<MyItem> itemList()
{
return QQmlListProperty<MyItem>(this, m_model);
}

Q_INVOKABLE QVariant specialItem()
{
return QVariant::fromValue(m_specialItem);
}

signals:
void itemListChanged();

private:
QList<MyItem*> m_model;
MyItem* m_specialItem; // simulate found item
};

“主要”功能:

int main(int argc, char *argv[])
{
QApplication app(argc, argv);

QQmlApplicationEngine engine;
QQmlContext* c = engine.rootContext();

MyCppModel* myCppModel = new MyCppModel;
c->setContextProperty("myCppModel", myCppModel);

qmlRegisterUncreatableType<MyItem>("CppModel", 1, 0, "MyItem", "");

engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

return app.exec();
}

最后是 QML:

ApplicationWindow {
title: qsTr("Testing")
width: 640
height: 480
visible: true

ColumnLayout {
anchors.centerIn: parent

Rectangle {
width: 150
height: 25
color: "#e67e22"
border.width: 1
border.color: "black"

Text {
anchors.centerIn: parent
text: "Mark Special Item"
}
MouseArea {
anchors.fill: parent
onClicked: {
var item = myCppModel.specialItem()
console.debug("how to color the special item: " + item)
}
}
}

ListView {
id: itemList
width: 200
height: 25 * count

model: myCppModel.itemList

delegate: Item {
width: parent.width
height: 25

Rectangle {
width: parent.width
height: 20
color: "#34495e"
border.width: 1
border.color: "black"

Text {
x: 10
anchors.verticalCenter: parent.verticalCenter
text: modelData.data
color: "white"
}
}
}
}
}
}

最佳答案

有几种方法可以做到这一点,具体取决于您的应用程序逻辑。

<强>1。将 isSpecialItem 属性添加到 MyItem

class MyItem : public QObject
{
Q_OBJECT
Q_PROPERTY(qint32 data READ data NOTIFY dataChanged)
Q_PROPERTY(bool isSpecialItem READ isSpecialItem WRITE setIsSpecialItem NOTIFY isSpecialItemChanged)
// ...
}

您的委托(delegate)将如下所示:

Rectangle {
width: parent.width
height: 20
color: "#34495e"
border.width: 1
border.color: isSpecialItem ? "red" : "black"

Text {
x: 10
anchors.verticalCenter: parent.verticalCenter
text: modelData.data
color: "white"
}
}

这是最简单的方法,但是用您可能认为更特定于 UI 的东西污染了 MyItem

<强>2。使 MyCppModel 派生自 QAbstractItemModel

使用此选项,您可以拥有一个SpecialItem role这在委托(delegate)中可用,委托(delegate)的 QML 代码与选项 #1 相同。

我将此称为解决此问题的规范方法,尤其是当 itemList 不需要是 QQmlListProperty 时。它不需要将可能特定于 UI 的 isSpecialItem 属性添加到 MyItem,并且可以按照您当前存储它的方式进行存储;在你的data()功能,你会写这样的东西:

if (role == SpecialItem) {
return QVariant(m_specialItem == m_model.at(index.row()));
}

<强>3。将特殊项目公开为列表的索引属性

为此,您需要将 specialItem() 函数转换为 MyCppModel 的属性:

Q_PROPERTY(int specialItemIndex READ specialItemIndex WRITE specialItemIndex NOTIFY specialItemIndexChanged)

然后,您的委托(delegate)看起来与选项 2 非常相似,除了一行:

border.color: myCppModel.specialItemIndex == index ? "red" : "black"

关于c++ - 获取 QList 对象的 ListView 索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30531495/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com