Qt: fix closing editor in capture interfaces dialog

Whenever (every second) the points list is updated, a dataChanged signal
is emitted and Qt decides to close all editors. Workaround this issue by
disabling the dataChanged signal. (Alternatively, we could change the
list into a pointer-to-list again.)

Change-Id: Ie06d118d011a72f5be5608c2324ca2715a3f97c7
Fixes: v2.3.0rc0-2014-gf8dc2346df ("Qt: fix memleak of PointList in interface statistics")
Reviewed-on: https://code.wireshark.org/review/20530
Petri-Dish: Peter Wu <peter@lekensteyn.nl>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Stig Bjørlykke <stig@bjorlykke.org>
Reviewed-by: Anders Broman <a.broman58@gmail.com>
This commit is contained in:
Peter Wu 2017-03-13 13:47:34 +01:00 committed by Anders Broman
parent e1b14fbcfe
commit 721182b09b
1 changed files with 25 additions and 0 deletions

View File

@ -111,6 +111,8 @@ class InterfaceTreeWidgetItem : public QTreeWidgetItem
public:
InterfaceTreeWidgetItem(QTreeWidget *tree) : QTreeWidgetItem(tree) {}
bool operator< (const QTreeWidgetItem &other) const;
QVariant data(int column, int role) const;
void setData(int column, int role, const QVariant &value);
QList<int> points;
void updateInterfaceColumns(interface_t *device)
@ -1116,6 +1118,29 @@ bool InterfaceTreeWidgetItem::operator< (const QTreeWidgetItem &other) const {
return QTreeWidgetItem::operator<(other);
}
QVariant InterfaceTreeWidgetItem::data(int column, int role) const
{
// See setData for the special col_traffic_ treatment.
if (column == col_traffic_ && role == Qt::UserRole) {
return qVariantFromValue(points);
}
return QTreeWidgetItem::data(column, role);
}
void InterfaceTreeWidgetItem::setData(int column, int role, const QVariant &value)
{
// Workaround for closing editors on updates to the points list: normally
// QTreeWidgetItem::setData emits dataChanged when the value (list) changes.
// We could store a pointer to the list, or just have this hack that does
// not emit dataChanged.
if (column == col_traffic_ && role == Qt::UserRole) {
points = value.value<QList<int> >();
return;
}
QTreeWidgetItem::setData(column, role, value);
}
//
// InterfaceTreeDelegate