我有以下(简化)代码将QStandardItem
添加到QStandardItemModel
,将模型附加到QListView
,并将我选择的信号从模型连接到我选择的功能:
// MyUIContainer derives from QWidget
MyUIContainer::SetItems()
{
// Inside a member function where model/items are added to a QListView...
// This code does not show deletion of existing ItemSelectionModel
QStandardItemModel * model = new QStandardItemModel(ui->listView);
// In the real code, data is set in each QStandardItem
model->setItem( 0, new QStandardItem() );
model->setItem( 1, new QStandardItem() );
model->setItem( 2, new QStandardItem() );
connect(model,
SIGNAL(itemChanged(QStandardItem*)),
this,
SLOT(ReceiveChange(QStandardItem*)));
// I have also tried connecting to this signal - same problem described below
//connect(model, SIGNAL(dataChanged(const QModelIndex &, const QModelIndex &, const QVector<int>)), this, SLOT(ReceiveChange(const QModelIndex &, const QModelIndex &, const QVector<int>)));
ui->listView->setModel(model);
}
MyUIContainer::ReceiveChange(QStandardItem * item)
{
// Problem! This slot is called *three times*
// whenever the check state of an item changes
}
正如代码注释所示,存在一个问题:只要检查状态为复选框,itemChanged()
\ ReceiveChange()
信号\插槽组合就会被称为三次次QListView
更改一次。
我知道我可以创建自己的Model类,它派生自QAbstractItemModel
,并且(如果我理解的话)自己处理视图中的鼠标点击,发出信号,例如{{1具有适当的用户定义角色的信号,以便复选框状态的更改只能处理一次。
然而,后一种方法要求我小心处理鼠标点击的所有可能情况。键盘事件可能导致更改的复选框状态。我希望并假设这个逻辑已经在Qt库本身内部处理,所以我没有 - 所以当复选框的检查状态改变时我只能接收一个信号(或其他一些消息)
请注意,似乎itemChanged
(而不是QListWidget
)也存在完全相同的问题。
所以,我的问题是:不编写自己的QListView
派生的Model类 - 它要求我自己编写代码来处理检查状态可以改变的每种可能方式 - 如何捕获已更改的检查状态(通过信号或其他方式)使得每次检查状态改变一次且仅一次每次检查状态改变时我可以明确地捕获?
附录
道歉 - 因为我非常谨慎地统治其他所有事情--Riateche的评论让我清楚地知道,这个问题强调的行为不是所谓的。最后,我确实已将问题追溯到我多次呼叫QAbstractItemModel
这一事实。