QWidget сигнал отправляется при выборе действия меню - как я могу предотвратить это? - PullRequest
0 голосов
/ 04 марта 2011

В более чем одном из моих приложений Qt я заметил, что всякий раз, когда нажимается строка меню, последний сигнал, отправленный из виджета в GUI, отправляется повторно, прежде чем вызывается действие меню. В большинстве случаев это не имеет значения; но в некоторых случаях это имеет большое значение.

В некоторых случаях, когда сигнал виджета подключен к одному из его собственных слотов, проще начать слот с

if (hasFocus())
{
    // ...
}

... блокировать, чтобы такие ложные сигналы, не генерируемые пользователем, фактически нажимающим на виджет, можно было игнорировать.

Однако недавно я обнаружил, что это поведение является причиной нескольких связанных ошибок, когда ложные сигналы передаются через несколько слоев программы перед тем, как на них воздействуют, поэтому просто проверить, находится ли конкретный виджет в фокусе, нетривиально реализовать.

Поэтому мой вопрос:

  • с какой стати нажатие на пункт меню вызывает сигнал из виджета в другом месте экрана? Я не могу найти это поведение где-либо задокументировано?

  • как мне это остановить?

Большое спасибо,

Стивен.

1 Ответ

0 голосов
/ 18 июля 2017

Как вы уже поняли, сигнал QLineEdit::editingFinished может быть издан дважды, если пользователь нажмет , введите , а QLineEdit потеряет фокус позже.Была создана старая ошибка, но поведение не было изменено: https://bugreports.qt.io/browse/QTBUG-40.

Ваше решение в порядке: перегрузите QLineEdit и проверьте, изменилось ли значение, прежде чем запускать сигнал.Вы можете использовать флаг QLineEdit::isModified для проверки: имеет значение по умолчанию false и меняется на true каждый раз, когда пользователь изменяет содержимое редактирования строки .Когда вы излучаете сигнал, его необходимо вручную сбросить на false.

Вы также можете выполнить эту проверку в объекте-получателе, просто проверив, имеет ли значение значение (например, отличается от последнего записанного значения)и обрабатывать его или нет.
Поэтому загрязняющие сигналы не будут проблемой.Это на мой взгляд самое чистое решение, тогда у вас есть надежная модель.Поскольку пользователь также может нажать , введите несколько раз с одним и тем же текстовым значением, и вам все равно придется с этим справиться.

Вы также можете использовать QLineEdit::returnPressed, но для этого необходимо, чтобы пользователь всегда нажималвведите, чтобы подтвердить значение.Не всегда интуитивно понятный, но вынуждает пользователя явно проверять вводимые данные.

...