Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.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
C++ QTableView和惟一id_C++_Qt_Qtableview - Fatal编程技术网

C++ QTableView和惟一id

C++ QTableView和惟一id,c++,qt,qtableview,C++,Qt,Qtableview,我是Qt新手,来自C#Net。我试图复制一个相当简单的程序,作为一个学习工具,我在Qt中用C#编写。我有一个数据模型,它继承QabStretctTableModel并实现: 行数, 列数, 数据, setData, 人头数据 旗帜 我的数据结构是一张地图 std::map<int, CBDataRow> 现在您可以看到UpdateRow()函数在编辑时被调用。该函数应在映射中找到唯一id,并更新其CBDataRow结构的相应成员。我的问题是,我不知道如何从传递到编辑函数的QMode

我是Qt新手,来自C#Net。我试图复制一个相当简单的程序,作为一个学习工具,我在Qt中用C#编写。我有一个数据模型,它继承QabStretctTableModel并实现:

行数, 列数, 数据, setData, 人头数据 旗帜

我的数据结构是一张地图

std::map<int, CBDataRow>
现在您可以看到UpdateRow()函数在编辑时被调用。该函数应在映射中找到唯一id,并更新其CBDataRow结构的相应成员。我的问题是,我不知道如何从传递到编辑函数的QModelIndex对象中获取唯一ID

例如: 用户编辑第3行的“CB名称”单元格。第三行中的数据的唯一ID为100。该值100位于QTableView的隐藏列中,列索引为0。因此,我需要做的只是: (Psuedo代码)


由于用户正在编辑第1列,如何查找第0列中包含的唯一ID?

我建议重新实现模型的index()方法,然后使用调用createIndex(行、列、唯一ID)在那里创建索引


然后,在获得QModelIndex的任何地方,都可以提取unique_id=model_index.internalId()

在我看来,您可以将数据存储在数组中,只需通过index.row()访问即可为元素编制索引:

无需自行定义内部id。
我希望这能对您有所帮助。

因为您将数据id隐藏在一个伪列中,我想您需要一个行索引。如果我是对的,为什么不简单地使用一个向量,其中每个元素都包含行的数据?也就是说,为什么在处理第3行数据时不搜索m_数据[3]元素?有什么我不明白的吗?如果我这样做,我将无法对表进行排序,因为第三行将不再对应于id为3的数据。传递到index()中的行、列参数是否来自tableView?如果是这样,我一定不明白,因为这似乎让我的权利回到了我的位置。
bool CBDatabaseModel::setData(const QModelIndex &index, const QVariant &value, int role) {
    bool success = false;
    if(role == Qt::EditRole) {
        success = m_data.UpdateRow(index, value);
    }

    if(success) {
        emit dataChanged(index, index);
        return true;
    } else {
        return false;
    }
}
it = m_data.find(unique_id);
it->second.cb_name = value.toString();
QVector<CBDataRow> m_data;

....

bool CBDatabaseModel::setData(const QModelIndex &index, const QVariant &value, int role) {
    bool success = false;
    if(role == Qt::EditRole && index.row() < m_data.size()) {
        success = m_data.at(index.row()).UpdateRow(index.column(), value);
    }

    if(success) {
        emit dataChanged(index, index);
        return true;
    } else {
        return false;
    }
}
bool CBDatabaseModel::lessThan(const QModelIndex &left,
                                   const QModelIndex &right) const