Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Alexandr Az от Август 13, 2013, 11:51



Название: QComboBox - отмена выбора
Отправлено: Alexandr Az от Август 13, 2013, 11:51
Как можно отменить выбор значения ComboBox. Для примера: мы выбираем неугодное нам значение из списка, кляцаем на него, а комбобокс и ухом не повел, чтобы установить новое. currentIndexChanged не предлагать.



Название: Re: QComboBox - отмена выбора
Отправлено: kibsoft от Август 13, 2013, 15:37
Цитировать
void QComboBox::highlighted(int index) [signal]
This signal is sent when an item in the combobox popup list is highlighted by the user. The item's index is passed.


Название: Re: QComboBox - отмена выбора
Отправлено: Alexandr Az от Август 13, 2013, 16:18
Цитировать
void QComboBox::highlighted(int index) [signal]
This signal is sent when an item in the combobox popup list is highlighted by the user. The item's index is passed.

Данный сигнал генерируется когда мы подсвечиваем выпадающие итемы, даже не выбираем, а бегаем по ним.
А моя задача - когда уже на нём кляцнул (т.е. выбрал) была возможность отменить выбор.


Название: Re: QComboBox - отмена выбора
Отправлено: _OLEGator_ от Август 13, 2013, 16:32
В таком случае надо работать не с QComboBox, а с его вьюхой.
Можно повесить фильтр событий на уже имеющуюся вьюху, можно написать свою и установить QComboBox:

Код
C++ (Qt)
void QComboBox::setView ( QAbstractItemView * itemView )
QAbstractItemView * QComboBox::view () const

Я так полагаю надо сигналы блокировать от вьюхи, чтобы в QComboBox не менялось значение.


Название: Re: QComboBox - отмена выбора
Отправлено: Alexandr Az от Август 13, 2013, 19:53
В таком случае надо работать не с QComboBox, а с его вьюхой.
Можно повесить фильтр событий на уже имеющуюся вьюху, можно написать свою и установить QComboBox:

Код
C++ (Qt)
void QComboBox::setView ( QAbstractItemView * itemView )
QAbstractItemView * QComboBox::view () const

Я так полагаю надо сигналы блокировать от вьюхи, чтобы в QComboBox не менялось значение.

Вы совершенно правы. Как вы понимаете, я не хочу найти просто решение, я хочу найти простое решение. Т.е. может я не доглядел эту примитивную возможность? Однако нет, она отсутствует. С вьюхой ещё сложнее. Стояла задача (QAbstractItemView) запретить двигаться по вьюхе при определенных условиях (классическое передвижение по базе данных. Если текущую строку внесли не верно, либо её дорабатывайте, либо отменяйте. Но вы не можете сдвинутся с неё, пока она не удовлетворяет условиям). Чтобы это реализовать - это наследование от вьюхи с кучей копипасты с иходников - т.е.  фильтр событий, когда мы фильтруем все события и реализуем их заново (мыши, клавы). Такую простыню вставлять. Другими словами этой возможности у view нету. Если я её проморгал, как в контексте комбобокса,  так и в контексте view, ткните....

Вообщем-то задачка классическая про ComboBox. Я, конечно, реализовал её через события (мы меняем, потом проверяем, потом возвращаем. При этом блокируем сообщения, чтобы не было цикличности).

Может поясню для чего: классика - таблицы главная - подчиненная. Представьте QComboBox, в котором Вы выбираете значения, а в форме изменяется текст. Вот выбрали что-то - появился текст, который мы можем редактировать. Вот мы его отредактировали. И выбираем другое значение Combobox. И вот незадача, что делать с текстом. Записать? Отменить? А вдруг при записи ошибка (не соответствует критериям). Поэтому как бы всплывает диалог и спрашивает - что делать, данные то пропадут...