编辑C Qlist< object*> gt;QML代码和一些QML警告中的模型

Problems with editing C++ QList<Object*> model in Qml code and some Qml warnings

本文关键字:QML gt 警告 模型 代码 object Qlist 编辑 lt      更新时间:2023-10-16

我需要创建一个可以用C 和QML代码进行编辑的模型。该模型将用于包含QT小部件和QML的桌面应用程序。对于QML渲染,我使用QQuickWidget

我有具有两个属性的数据对象:名称和颜色。

dataObject.h

#ifndef DATAOBJECT_H
#define DATAOBJECT_H
#include <QObject>
class DataObject : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged)
    Q_PROPERTY(QString color READ color WRITE setColor NOTIFY colorChanged)
public:
    DataObject(QObject *parent = Q_NULLPTR);
    DataObject(const QString &name, const QString &color, QObject *parent = Q_NULLPTR);
    QString name() const;
    void setName(const QString &name);
    QString color() const;
    void setColor(const QString &color);
signals:
    void nameChanged();
    void colorChanged();
private:
    QString m_name;
    QString m_color;
};
#endif // DATAOBJECT_H

dataObject.cpp

#include "dataobject.h"
#include <QDebug>
DataObject::DataObject(QObject *parent)
    : QObject(parent)
{
}
DataObject::DataObject(const QString &name, const QString &color, QObject *parent)
    : QObject(parent), m_name(name), m_color(color)
{
}
QString DataObject::name() const
{
    return m_name;
}
void DataObject::setName(const QString &name)
{
    qDebug() << Q_FUNC_INFO;
    if (name != m_name) {
        m_name = name;
        emit nameChanged();
    }
}
QString DataObject::color() const
{
    return m_color;
}
void DataObject::setColor(const QString &color)
{
    qDebug() << Q_FUNC_INFO;
    if (color != m_color) {
        m_color = color;
        emit colorChanged();
    }
}

对于主窗口,我使用QMainWindow的子类。contral小部件包含 QQuickWidget,带有源mainview.qml。在构造函数中,i填充 QList<Object*>型号,并将其设置为上下文属性" namecolormodel"的mainview.qml。

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = Q_NULLPTR);
    ~MainWindow();
public slots:
    void onAccepted();
private:
    QList<QObject*> nameColorModel;
};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "dataobject.h"
#include <QQuickWidget>
#include <QQmlContext>
#include <QQuickItem>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{
    auto qmlWidget = new QQuickWidget(QUrl("qrc:/MainView.qml"), this);
    qmlWidget->setResizeMode(QQuickWidget::SizeRootObjectToView);
    this->setCentralWidget(qmlWidget);
    this->resize(600, 400);
    nameColorModel.append(new DataObject("Item 1", "red"));
    nameColorModel.append(new DataObject("Item 2", "green"));
    nameColorModel.append(new DataObject("Item 3", "blue"));
    nameColorModel.append(new DataObject("Item 4", "yellow"));
    qmlWidget->rootContext()->setContextProperty("nameColorModel", QVariant::fromValue(nameColorModel));
    connect(qmlWidget->rootObject(), SIGNAL(accepted()), SLOT(onAccepted()));
}
MainWindow::~MainWindow()
{
    qDeleteAll(nameColorModel.begin(), nameColorModel.end());
}
void MainWindow::onAccepted()
{
    for(auto& object: nameColorModel)
    {
        auto item = qobject_cast<DataObject*>(object);
        qDebug() << item->name() << item->color();
    }
}

mainview.qml包含一些其他组件(FirstTextField,secondCombobox,ok ok ok'和" cancel"按钮)和包含RepeaterGroupBox,其中使用我的" NameColormodel"。namecoloredit.qml用作Repeater的委托。

mainview.qml

import QtQuick 2.4
import QtQuick.Controls 1.3
import QtQuick.Layouts 1.1
import "." as Views
Item {
    id: root
    width: 600
    height: 400
    property alias firstText: firstTextField.text
    property alias secondText: secondComboBox.currentText
    signal accepted()
    signal rejected()
    ColumnLayout {
        spacing: 10
        anchors.fill: parent
        anchors.margins: 10
        GridLayout {
            columns: 2
            rowSpacing: 10
            columnSpacing: 10
            Label {
                text: "First"
            }
            TextField {
                id: firstTextField
                implicitHeight: 42
                Layout.fillWidth: true
            }
            Label {
                text: "Second"
            }
            ComboBox {
                id: secondComboBox
                implicitHeight: 42
                model: 5
                Layout.fillWidth: true
            }
        }
        GroupBox {
            title: qsTr("Name-color objects:")
            Layout.fillWidth: true
            ColumnLayout {
                id: col
                spacing: 10
                anchors.fill: parent
                Repeater {
                    id: repeater
                    model: nameColorModel ////  <-- QList<Object*> model
                    Views.NameColorEdit {
                        name: modelData.name
                        color: modelData.color
                        Layout.row: index
                        Layout.fillWidth: true
                    }
                }
            }
        }
        Item {
            Layout.fillHeight: true
        }
        RowLayout {
            Layout.alignment: Qt.AlignRight
            Button {
                text: "Ок"
                Layout.minimumWidth: 42
                Layout.minimumHeight: 42
                onClicked: accepted()
            }
            Button {
                text: "Cancel"
                Layout.minimumWidth: 42
                Layout.minimumHeight: 42
                onClicked: rejected()
            }
        }
    }
}

namecoloredit.qml

import QtQuick 2.4
import QtQuick.Controls 1.3
import QtQuick.Layouts 1.1
Item {
    id: root
    implicitWidth: nameField.implicitWidth
    implicitHeight: nameField.implicitHeight
    property alias name: nameField.text
    property alias color: colorField.text
    RowLayout {
        spacing: 10
        anchors.fill: parent
        Label {
            text: "Color"
        }
        TextField {
            id: colorField
            enabled: false
            implicitWidth: 150
            implicitHeight: 42
        }
        Label {
            text: "Name"
        }
        TextField {
            id: nameField
            implicitHeight: 42
            Layout.fillWidth: true
        }
    }
}

当我在namecoloredit.qml的"名字"中更改文本时," namecolormodel"不会在„ 代码中更改。我该如何解决?

也有QML代码中的以下警告:

qrc:/mainview.qml:50:9:qml groupbox:检测到的绑定循环 属性" indinitWidth" qrc:/mainview.qml:61:参考文献: Namecolormodel未定义

请注意,将在调用QQuickWidget的设置后设置该模型。我该如何解决这些警告?

您也可以给我有关编写代码的建议。

谢谢!

通过使用Binding用于DataObject属性和NameColorEdit属性解决了问题:

        Repeater {
            id: repeater
            model: nameColorModel ////  <-- QList<Object*> model
            Views.NameColorEdit {
                name: modelData.name
                color: modelData.color
                Layout.row: index
                Layout.fillWidth: true
                Binding { target: modelData; property: "name"; value: name }
                Binding { target: modelData; property: "color"; value: color }
            }
        }

现在,在namecoloredit.qml中编辑namefield时,QList<Object*>模型的C 代码中的内容已成功更新。另外,如果我们更改C 代码中QList<Object*>模型的内容,则将更新NameColoredit.QML。