Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 如何共享模型&x27;在QML ListView和网格之间创建项目_Qt_View_Qml - Fatal编程技术网

Qt 如何共享模型&x27;在QML ListView和网格之间创建项目

Qt 如何共享模型&x27;在QML ListView和网格之间创建项目,qt,view,qml,Qt,View,Qml,我想知道在QML中实现以下目标的最佳方法: 我有一个带有可拖放元素的列表视图,还有一个初始填充了拖放区域的网格。ListView使用从QAbstractItemModel派生的模型。我想在网格上放置一个元素并与之交互(例如重命名它)。目前,ListView中的任何修改都会更新模型,但是网格中元素的修改如何更新模型呢 与ListView模型的子集相对应的网格中可以有多个项目。我不知道如何才能做到这一点。无法使用包,因为网格不是网格视图,必须在特定位置移动/设置项目。所以我试着: 使用与用于拖动项

我想知道在QML中实现以下目标的最佳方法:

我有一个带有可拖放元素的列表视图,还有一个初始填充了拖放区域的网格。ListView使用从QAbstractItemModel派生的模型。我想在网格上放置一个元素并与之交互(例如重命名它)。目前,ListView中的任何修改都会更新模型,但是网格中元素的修改如何更新模型呢

与ListView模型的子集相对应的网格中可以有多个项目。我不知道如何才能做到这一点。无法使用,因为网格不是网格视图,必须在特定位置移动/设置项目。所以我试着:

  • 使用与用于拖动项目的源ListView相同的模型,创建显示在已拖放项目上的ListView
  • 设置相同的根索引,然后设置相同的索引
我很接近找到解决办法,但我认为这不是最好的办法

有线索吗

谢谢


我想有不同的视觉表现相同的模型 列表视图中的项和网格中的组件中的项。因此,对 ListView中的项应更新网格中的项,并且 反之亦然

如果模型的数据不是通过
NOTIFY
和属性派生的
QObject
,则只能通过模型发出更改通知

由于您不会在网格中使用模型,这意味着您的模型必须使用底层
QObject
实例。可能会派上用场

如果有,您只需要引用基础的
QObject
模型项,并使用绑定来设置列表视图委托。然后,当您拖放时,只需将对
QObject
的引用传递给将在网格内创建的其他视觉表示


最后,当您从模型中删除项时,请注意不要留下悬空引用,因为这很可能会使您的应用程序硬崩溃。使用<代码>销毁< /代码>附加信号,清除网格中的元素作为模型项对象被破坏。

< P>我终于找到了一个解决方案,通过创建一个C++类型,它继承了QObjon,它可以嵌入在一个QML对象中。此类型具有读/写属性,并使用与ListView相同的模型初始化。有趣的方法有:

/* writing to a property **from QML** goes here */
void ModelItem::setName(const QString& name)
{
    setModelData(GroupMemberModel::Nom, name);
}
/* then here */
bool ModelItem::setModelData(GroupMemberModel::Role role, const QVariant& value)
{
    return m_model->setData(m_modelIndex, value, role);
}

/* any changes in the model fall here (signals/slots mecanism)*/
void ModelItem::dataChanged(const QModelIndex& topLeft, const QModelIndex& bottomRight, const QVector<int>& roles)
{
    if(m_modelIndex.row() < topLeft.row() || m_modelIndex.row() > bottomRight.row())
        return;
    if(m_modelIndex.column() < topLeft.column() || m_modelIndex.column() > bottomRight.column())
        return;
    //Index is modified, emit signal
    foreach(int role, roles) {
        emitDataChanged(role);
    }
}
/* **notify QML** by emit signal on property */
void ModelItem::emitDataChanged(int role) const
{
    if(role < (Qt::UserRole+1))
        role+=Qt::UserRole+1;

    switch(role)
    {
    case GroupMemberModel::Nom:
        emit nameChanged();
        break;
    default:
        qDebug() << "ModelItem::dataChanged, unknown role";
        break;
    }
}
/*从QML**写入属性**到此处*/
void ModelItem::setName(常量QString&name)
{
setModelData(GroupMemberModel::Nom,name);
}
/*那么这里*/
bool modeleitem::setModelData(GroupMemberModel::Role、const QVariant和value)
{
返回m_model->setData(m_model索引、值、角色);
}
/*模型中的任何更改都属于此处(信号/插槽mecanism)*/
void ModelItem::dataChanged(常量QModelIndex和左上角、常量QModelIndex和右下角、常量QVector和角色)
{
如果(m_modelIndex.row()bottomRight.row())
返回;
if(m_modeleindex.column()bottomRight.column())
返回;
//索引被修改,发出信号
foreach(int角色,roles){
改变角色;
}
}
/***通过在属性上发出信号通知QML***/
void ModelItem::emitDataChanged(int角色)常量
{
if(角色<(Qt::UserRole+1))
role+=Qt::UserRole+1;
交换机(角色)
{
案例组成员模型::名称:
emit nameChanged();
打破
违约:

qDebug()模型的项或视图的项?数据部分或可视部分?我希望在ListView和网格中的组件中对同一模型项有不同的可视表示。因此,在ListView中对项的修改应该会更新网格中的项,反之亦然。谢谢,我将观看此内容。我还将仔细查看在Package元素处,因为该元素在网格上放置了一个视图。