Qt中QStandardItemModel中的重复行
Posted
技术标签:
【中文标题】Qt中QStandardItemModel中的重复行【英文标题】:duplicate rows in QStandardItemModel in Qt 【发布时间】:2015-10-11 06:58:44 【问题描述】:我正在尝试实现一些我认为很容易但不知道如何让它发挥作用的东西。
在这个基本示例中,我正在创建一个地址簿,一个人可以分成 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 中,尽管在这两种情况下,都有一个箭头表示存在一个孩子。
任何想法如何使相同的数据出现两次?
【问题讨论】:
如果您插入第二个具有不同名字的项目会发生什么? @jpo38 好主意,我试过了,把 jane,Jane 出现了但是其他列是空的,好像一个 qstandarditem 只能出现一次 【参考方案1】: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", "john.doe@gmail.com", "+123456789", work );
addEntry( "John", "Doe", "john.doe@gmail.com", "+123456789", friends );
【讨论】:
但是它们是不同的。编辑一个项目不会改变另一个项目 没错,您必须使用itemChanged(QStandardItem * item)
自己处理。您还可以专门化您自己的QStandardItem
管理与其他项目的链接并在更改时更新它们,以便更改一个会更改另一个。
我明白了,只是想子类化 qstandarditem 以使 2 个不同项目的值使用相同的指针。所以他们都有自己的位置和属性/标志,但共享价值
你可以有一个“master”QStandarItem
和一个“slave”。 “slave”将有一个指向“master”的指针并返回“master”值将覆盖QStandardItem::data
(返回master->data(...)
)以上是关于Qt中QStandardItemModel中的重复行的主要内容,如果未能解决你的问题,请参考以下文章
qt - 如何对 qstandarditemmodel 进行永久排序
在 qt 中使用 QStandardItemModel 显示 QSQLite 数据库 [关闭]
Qt入门教程数据模型篇 QStandardItemModel标准项目模型
Qt入门教程数据模型篇 QStandardItemModel标准项目模型