Qt 中 QStandardItemModel 中的重复行

duplicate rows in QStandardItemModel in Qt

我正在努力实现一些我认为很容易但不知道如何让它发挥作用的事情。

在这个基本的例子中,我正在创建一个地址簿,一个人可以在 2 个组中,John Doe 是朋友,也是工作同事。

如果我在朋友群里改了他的电话号码,在工作群里应该也会变。

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

 addressBookListModel = new QStandardItemModel(0, 4);
            addressBookListModel->setHeaderData(0,Qt::Horizontal,"First Name", Qt::DisplayRole);
            addressBookListModel->setHeaderData(0,Qt::Horizontal,"fn", Qt::UserRole);
            addressBookListModel->setHeaderData(1,Qt::Horizontal,"Last Name", Qt::DisplayRole);
            addressBookListModel->setHeaderData(1,Qt::Horizontal,"ln", Qt::UserRole);
            addressBookListModel->setHeaderData(2,Qt::Horizontal,"E-Mail", Qt::DisplayRole);
            addressBookListModel->setHeaderData(2,Qt::Horizontal,"mail", Qt::UserRole);
            addressBookListModel->setHeaderData(3,Qt::Horizontal,"Phone Number", Qt::DisplayRole);
            addressBookListModel->setHeaderData(3,Qt::Horizontal,"phone", Qt::UserRole);

然后插入数据:

//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);

但这只会将 john doe 插入到这样的工作中:

我以为这是因为行项不是指针,所以我这样试了:

//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);

但这给了我完全相同的结果,John Doe 不在 Friends 中,尽管在这两种情况下,都有一个箭头指示存在 child。

知道如何使相同的数据出现两次吗?

A QStandardItem 可以添加一次并且只能添加一次到 QStandardItemModel。检查您的调试器日志,我确定 QT 会写调试消息说当您两次插入相同的项目时不允许这样做。顺便说一句,什么return QStandrardItem::index()的item插入两次(这个方法returns row/column item在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 );