Вопрос

Я новичок в программировании QT GUI и использую QT Creator.Проблема, которую я вижу, связана с моей кнопкой и редактированием строки, когда пользователь нажимает клавишу ввода.Моя программа открывает групповое окно и позволяет пользователю ввести пароль и нажать «ОК» или «Отмена».

Если пользователь нажимает клавишу ввода, когда редактирование строки находится в фокусе, программа, похоже, излучает второй сигнал для QAbstractButton. animateClick(); Поэтому, когда откроется следующее групповое окно и предложит пользователю нажать «ОК» или «Отмена», программа продолжит работу, как если бы пользователь нажал кнопку «ОК».

Я настроил свои кнопки, чтобы пользователь мог нажимать клавишу табуляции и нажимать клавишу ввода.Чтобы получить эту функциональность, я установил okbutton->setAutodefault(true); и кнопка отмены->setAutodefault(true);

У меня также есть строка редактирования, позволяющая пользователю ввести пароль и нажать Enter.Я настроил это, подключив сигнал возврата к кнопке ОК, показанной ниже.

connect(lineEdit, SIGNAL(returnPressed()), okButton, SIGNAL(clicked()));

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

connect(lineEdit, SIGNAL(returnPressed()), this, SLOT(chkPassword()));

Если пользователь нажимает кнопку okButton мышью или я устанавливаю okButton->setAutoDefault(false); программа работает как надо.Я хотел бы знать, можно ли отключить сигнал animateClick, который возникает, когда редактирование строки имеет фокус.

Любая помощь в этом будет принята с благодарностью.

Это было полезно?

Решение

Попробуйте никогда не подключаться lineEdit с okButton, т.е.закомментируйте эту строку в своем коде:

connect(lineEdit, SIGNAL(returnPressed()), okButton, SIGNAL(clicked()));

и проверьте, ведет ли программа себя так, как вы хотите.


Также вы можете позвонить

okButton->setDefault(true);

в дополнение к твоему setAutoDefault() вызывает обе кнопки, в зависимости от того, что именно вы хотите, чтобы произошло, когда пользователь нажимает Входить с различными вещами в фокусе.Видеть этот ответ для получения дополнительной информации по этому вопросу.


Я предполагаю, что, поскольку вы никогда об этом не упоминаете, вы не звоните setDefault() для любой из ваших кнопок.Таким образом, okButton это ваша первая кнопка с autoDefault свойство установлено в true.Это значит, что okButton становится «кнопкой выбора» диалога всякий раз, когда диалог должен обрабатывать Входить нажатие клавиши, которого не было на каком-то другом autoDefault кнопка (например, cancelButton в твоем случае).

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

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

Также проверьте эта ветка на форумах проекта Qt который, кажется, решает ту же проблему по-разному.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top