Как отключить QAbstractButton animateClick, когда lineEdit имеет фокус
Я новичок в программировании QT GUI, и я использую QT Creator. Проблема, с которой я сталкиваюсь, связана с моей кнопкой и редактированием строки, когда пользователь нажимает клавишу ввода. Моя программа открывает групповое окно и позволяет пользователю ввести пароль и нажать ОК или отменить.
Если пользователь нажимает клавишу ввода, когда редактирование строки имеет фокус, программа, похоже, издает второй сигнал для QAbstractButton animateClick();
Поэтому, когда открывается следующее групповое окно и пользователю предлагается нажать "ОК" или "Отмена", программа продолжает работу, как если бы пользователь нажал кнопку "ОК".
Я установил свои нажимные кнопки, чтобы позволить пользователю нажимать клавишу табуляции и нажимать клавишу ввода. Чтобы получить эту функциональность, я установил okbutton->setAutodefault(true);
и cancelButton->setAutodefault(true);
У меня также есть строка Edit для пользователя, чтобы ввести пароль и нажмите Enter. Я настроил это, подключив сигнал возврата к нажатой кнопке ОК, показанной ниже.
connect(lineEdit, SIGNAL(returnPressed()), okButton, SIGNAL(clicked()));
Я также попытался подключить сигнал возврата нажатием непосредственно к слоту, но проблема все еще возникает.
connect(lineEdit, SIGNAL(returnPressed()), this, SLOT(chkPassword()));
Если пользователь щелкает мышью на кнопке okButton или я установил okButton->setAutoDefault(false);
программа работает как надо. Я хотел бы знать, возможно ли отключить сигнал animateClick, который появляется, когда редактирование строки имеет фокус.
Любая помощь с этим будет принята с благодарностью.
1 ответ
Попробуйте никогда не подключаться lineEdit
с okButton
закомментируйте эту строку в вашем коде:
connect(lineEdit, SIGNAL(returnPressed()), okButton, SIGNAL(clicked()));
и проверьте, работает ли программа так, как вы хотите.
Кроме того, вы можете позвонить
okButton->setDefault(true);
в дополнение к вашему setAutoDefault()
звонки на обе кнопки, в зависимости от того, что именно вы хотите сделать, когда пользователь нажимает Enter, в фокусе находятся разные вещи. Смотрите этот ответ для получения дополнительной информации по этому вопросу.
Я предполагаю, так как вы никогда не упоминаете это, что вы не звоните setDefault()
для любой из ваших кнопок. Таким образом, okButton
ваша первая кнопка с autoDefault
свойство установлено в true
, Это означает, что okButton
становится "кнопкой выбора" диалогового окна всякий раз, когда диалоговое окно должно обрабатывать нажатие клавиши " Ввод", чего не было на других autoDefault
кнопка (например, cancelButton
в твоем случае).
Каждый раз, когда любой виджет в вашем диалоге получает нажатие клавиши Enter и не использует само событие, событие в конечном итоге обрабатывается логикой обработки кнопок диалога по умолчанию, что приводит к нажатию на вышеупомянутую "кнопку выбора".
QLineEdit
не используется для многострочного редактирования, поэтому он, вероятно, просто не использует событие нажатия клавиши для Enter (все еще обрабатывая его, поскольку он отправляет returnPressed()
сигнал). Таким образом, ваша связь returnPressed()
заканчивает тем, что делает, и, кроме того, логика кнопки по умолчанию заканчивает тем, что нажимает вашу кнопку во второй раз.
Также ознакомьтесь с этой веткой на форумах проекта Qt, которая, похоже, решает одну и ту же проблему по-разному.