We should eat the first event that arrives exactly when the drop down appears on screen.
63 {
64 if (event->type() == QEvent::Leave) {
66
67 } else if (event->type() == QEvent::MouseButtonPress) {
68 QMouseEvent *mevent = static_cast<QMouseEvent*>(event);
70
71 } else if (event->type() == QEvent::MouseButtonRelease) {
72 QMouseEvent *mevent = static_cast<QMouseEvent*>(event);
73 QModelIndex index =
m_parent->view()->indexAt(mevent->pos());
74 if (!index.isValid()) return false;
75
81
82 const bool toUncheckedState = index.data(Qt::CheckStateRole) == Qt::Checked;
83
84 if (toUncheckedState) {
85 m_parent->model()->setData(index, Qt::Unchecked, Qt::CheckStateRole);
86 } else {
87 m_parent->model()->setData(index, Qt::Checked, Qt::CheckStateRole);
88 }
89
91 for (
int i = 0; i <
m_parent->model()->rowCount(); i++) {
92 const QModelIndex &other =
m_parent->model()->index(i, 0);
94 m_parent->model()->setData(other, toUncheckedState ? Qt::Unchecked : Qt::Checked, Qt::CheckStateRole);
95 }
96 }
97 } else {
98 bool prevChecked = false;
99 bool checkedVaries = false;
100 QModelIndex allLabelsIndex;
101
102 for (
int i = 0; i <
m_parent->model()->rowCount(); i++) {
103 const QModelIndex &other =
m_parent->model()->index(i, 0);
105 const bool currentChecked = other.data(Qt::CheckStateRole) == Qt::Checked;
106
107 if (i == 0) {
108 prevChecked = currentChecked;
109 } else {
110 if (prevChecked != currentChecked) {
111 checkedVaries = true;
112 break;
113 }
114 }
115 } else {
116 allLabelsIndex = other;
117 }
118 }
119
120 const bool allLabelsIndexShouldBeChecked =
121 prevChecked && !checkedVaries;
122
123 if (allLabelsIndexShouldBeChecked !=
124 (allLabelsIndex.data(Qt::CheckStateRole) == Qt::Checked)) {
125
126 m_parent->model()->setData(allLabelsIndex, allLabelsIndexShouldBeChecked ? Qt::Checked : Qt::Unchecked, Qt::CheckStateRole);
127 }
128 }
129
131
133 return true;
134 }
135
136 return QObject::eventFilter(obj, event);
137 }
void selectedColorsChanged()