Я обычно привык к .net framework и недавно получил возможность работать над проектом с использованием C ++ / Qt. В этом контексте я хочу реализовать следующую функциональность: (для упрощения вещей, скажем, у меня есть ListView и Textbox / Textedit)
В основном я вижу два решения (может быть больше) для этого:
aboutToChangeSelection(proposedSelection, vetoObj)
changedSelection(newSelection)
Первый сигнал будет отправлен на textedit, который затем в конечном итоге будет использовать свое право вето. После этого тот же сигнал будет отправлен в сам список, выполнить действие в зависимости от права вето и отправить второй сигнал, если он фактически изменил выбор.
В мире .NET существует такой механизм, с помощью CancelEventArgs
. Я знаю, что у событий .NET и сигналов Qt совершенно другой принцип работы, но есть ли какой-нибудь эквивалент Qt для достижения такого же эффекта?
Большое спасибо за любую помощь!
Если вы используете QListWidget
вместо QListView
тогда вы можете сделать следующее:
QListWidget::itemPressed ( QListWidgetItem * item )
а не сигнал о том, что предмет изменился (т.е. currentItemChanged ( QListWidgetItem * current, QListWidgetItem * previous )
в моем примере)currentItemChanged ( QListWidgetItem * current, QListWidgetItem * previous )
который будет использоваться только для запоминания текущего и последнего элемента.Теперь есть одна проблема. Какой сигнал будет получен первым ?? Не указано в документе и может быть в любом порядке. Если пользователь на элементе A
и нажимает на элемент B
Вы хотите, чтобы Lastitem был A
и текущий элемент будет B
на данный момент вы обрабатываете itemPressed
, Итак, вы хотите справиться currentItemChanged
первый. К счастью, вы можете использовать Qt::DirectConnection
за currentItemChanged
и использовать Qt::QueuedConnection
за itemPressed
АЛЬТЕРНАТИВА:
Вы можете использовать фильтр событий в списке виджетов. Этот фильтр будет выполнять обработку, описанную вами в нескольких шагах. Если пользователь нажимает «Принять», вы отправляете событие в список. Если пользователь отклоняет, вы блокируете событие. Я не уверен, но возможно, что события не будут обработаны фильтром, который сделает эту альтернативу нежизнеспособной.
Не уверен на 100%, но вы можете переопределить QCoreApplication::notify( QObject * receiver, QEvent * event )
и попробуйте найти подходящее событие и просто позвонить ignore()
в теме. И чтобы сказать, когда игнорировать, вы можете добавить новый QEvent
подкласс, вставьте в него указатель целевых элементов и сделайте так, чтобы он действовал как событие вето — если оно получено, вы знаете, что будете игнорировать следующее событие определенного типа для этого конкретного объекта.