我正在尝试实现一些虽然很容易但无法弄清楚如何使其起作用的东西。

在此基本示例中,我正在创建一个通讯簿,一个人可以分为两组,John Doe是 friend ,也是工作同事。

如果我在 friend 组中更改了他的phoneNumber,它也应该在工作组中更改。

这是我第一次尝试使用静态内容的方法(最后将其链接到数据库)

 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("[email protected]");
            QStandardItem * phone = new QStandardItem("+123456789");

            QList<QStandardItem*> rowitems;
            rowitems << fn << ln << mail << phone;
            work->appendRow(rowitems);
            friends->appendRow(row items);

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

c&#43;&#43; - Qt中QStandardItemModel中的重复行-LMLPHP

我认为这是因为行项目不是指针,所以我这样尝试了:
//One contact in both groups 2

            QStandardItem * fn = new QStandardItem("John");
            QStandardItem * ln = new QStandardItem("Doe");
            QStandardItem * mail = new QStandardItem("[email protected]");
            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 的存在。

任何想法如何使相同的数据出现两次?

最佳答案

只能将QStandardItem添加一次到QStandardItemModel中。检查您的调试器日志,我确定QT会写调试消息,说您两次插入相同项目时不允许这样做。顺便说一句,什么将返回插入两次的项目的QStandrardItem::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", "[email protected]", "+123456789", work );
addEntry( "John", "Doe", "[email protected]", "+123456789", friends );

关于c++ - Qt中QStandardItemModel中的重复行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33062383/

10-13 08:15