C++ Qt中QStandardItemModel中的重复行

C++ Qt中QStandardItemModel中的重复行,c++,qt,qt5,C++,Qt,Qt5,我正在努力实现一些我认为很容易但却不知道如何实现的事情 在这个基本示例中,我正在创建一个地址簿,一个人可以分为两组,John Doe是一个朋友,也是一个同事 如果我在朋友组中更改了他的电话号码,那么在工作组中也应该更改 这是我第一次尝试使用静态内容的方式(最后它链接到一个db) 然后插入数据: //Group 1 QStandardItem * work = new QStandardItem("Work"); QList<QStandar

我正在努力实现一些我认为很容易但却不知道如何实现的事情

在这个基本示例中,我正在创建一个地址簿,一个人可以分为两组,John Doe是一个朋友,也是一个同事

如果我在朋友组中更改了他的电话号码,那么在工作组中也应该更改

这是我第一次尝试使用静态内容的方式(最后它链接到一个db)

然后插入数据:

//Group 1
            QStandardItem * work = new QStandardItem("Work");

            QList<QStandardItem*> workgroup;
            workgroup << work ;
            addressBookListModel->appendRow(workgroup);

//group 2
            QStandardItem * friends = new QStandardItem("Friends");

            QList<QStandardItem*> friendgroup;
            friendgroup << friends ;
            addressBookListModel->appendRow(friendgroup);

//One contact in both groups
            QStandardItem * fn = new QStandardItem("John");
            QStandardItem * ln = new QStandardItem("Doe");
            QStandardItem * mail = new QStandardItem("john.doe@gmail.com");
            QStandardItem * phone = new QStandardItem("+123456789");

            QList<QStandardItem*> rowitems;
            rowitems << fn << ln << mail << phone;
            work->appendRow(rowitems);
            friends->appendRow(row items);
//组1
QStandardItem*工作=新QStandardItem(“工作”);
QList工作组;
工作组附录行(工作组);
//第2组
QStandardItem*friends=新的QStandardItem(“friends”);
QList友好小组;
friendgroup appendRow(friendgroup);
//两组都有一名联系人
QStandardItem*fn=新的QStandardItem(“约翰”);
QStandardItem*ln=新的QStandardItem(“Doe”);
QStandardItem*mail=新的QStandardItem(“约翰。doe@gmail.com");
QStandardItem*电话=新QStandardItem(“+123456789”);
QList行项目;

行项目A
QStandardItem
可以一次且只能一次添加到
QStandardItemModel
。检查您的调试器日志,我确信当您插入同一项两次时,QT会写入调试消息,说这是不允许的。顺便问一下,对于插入两次的项,什么将返回该项的
qstandardditem::index()
(此方法返回该项在
QStandardItemModel
中的行/列位置)

因此,您必须创建不同的
QStandardItem
。你应该这样做:

void addEntry( const QString& first, const QString& last, const QString& mail, const QString& tel, QStandardItem* parent )
{
    QStandardItem * fn = new QStandardItem(first);
    QStandardItem * ln = new QStandardItem(last);
    QStandardItem * mail = new QStandardItem(mail);
    QStandardItem * phone = new QStandardItem(tel);
    QList<QStandardItem*> rowitems;
    rowitems << fn << ln << mail << phone;
    parent->appendRow(rowitems);
}

...
addEntry( "John", "Doe", "john.doe@gmail.com", "+123456789", work );
addEntry( "John", "Doe", "john.doe@gmail.com", "+123456789", friends );
void addEntry(const-QString&first,const-QString&last,const-QString&mail,const-QString&tel,QStandardItem*parent)
{
QStandardItem*fn=新的QStandardItem(第一个);
QStandardItem*ln=新的QStandardItem(最后一个);
QStandardItem*mail=新的QStandardItem(mail);
QStandardItem*电话=新QStandardItem(电话);
QList行项目;

rowitems如果你插入第二个名字不同的项目会发生什么?@jpo38好主意,我试过了,把jane放进去,jane出现了,但是其他列是空的,好像一个qstandarditem只能出现一次,但是它们是不同的。编辑一个项目不会改变另一个项目确实,你必须自己使用
itemChanged来处理这个问题(QS标准项目*项目)
。你也可以专门化你自己的
QStandardItem
管理与其他项目的链接,并在更改时更新它们,以便更改其中一个会更改其他项目。我确实明白了这个想法,我只是想将QStandardItem子类化,使两个不同项目的值使用相同的指针。因此它们都有自己的位置and属性/标志,但共享值您可以有一个“master”
QStandarItem
和一个“slave”。“slave”将有一个指向“master”的指针,并返回覆盖的“master”值
QStandardItem::data
(返回
master->data(…)
//One contact in both groups 2

            QStandardItem * fn = new QStandardItem("John");
            QStandardItem * ln = new QStandardItem("Doe");
            QStandardItem * mail = new QStandardItem("john.doe@gmail.com");
            QStandardItem * phone = new QStandardItem("+123456789");

            QList<QStandardItem*> rowitems;
            rowitems << fn << ln << mail << phone;

            QList<QStandardItem*> rowitemsB;
            rowitemsB << fn << ln << mail << phone;


            work->appendRow(rowitems);
            friends->appendRow(rowitemsB);
void addEntry( const QString& first, const QString& last, const QString& mail, const QString& tel, QStandardItem* parent )
{
    QStandardItem * fn = new QStandardItem(first);
    QStandardItem * ln = new QStandardItem(last);
    QStandardItem * mail = new QStandardItem(mail);
    QStandardItem * phone = new QStandardItem(tel);
    QList<QStandardItem*> rowitems;
    rowitems << fn << ln << mail << phone;
    parent->appendRow(rowitems);
}

...
addEntry( "John", "Doe", "john.doe@gmail.com", "+123456789", work );
addEntry( "John", "Doe", "john.doe@gmail.com", "+123456789", friends );