Как убрать фокус из QLineEdit при нажатии в любом месте окна - PullRequest
9 голосов
/ 17 декабря 2010

Я работаю над пользовательской кнопкой Qt, которая позволяет вам редактировать текст на кнопке, если вы дважды щелкнете по ней.При двойном щелчке по кнопке появляется QLineEdit, где текст на кнопке позволяет пользователю редактировать текст на кнопке.Мое требование состоит в том, что если пользователь щелкает в любом месте окна приложения, QLineEdit должен исчезнуть и отменить операцию редактирования.Это работает в некоторых случаях.В частности, это работает, если я нажимаю на все, что способно к вводу текста.Другие части окна не работают должным образом.Я нажму на пустую часть окна приложения, и QLineEdit сохранит свой фокус.Как мне убрать его фокус в этих случаях?

Ответы [ 4 ]

10 голосов
/ 17 декабря 2010

Я нашел решение, которое, кажется, работает, хотя я все еще открыт для других вариантов, если они есть.Я использую PyQt4, поэтому мой пример на python:

Создайте подкласс QLineEdit, чтобы у меня был новый тип.Я не хочу или не нуждаюсь в этом поведении во всех экземплярах QLineEdit;только эти конкретные.

class MyLineEdit(QtGui.QLineEdit):
    pass

Теперь, в моем подклассе QMainWindow, я переопределяю реализацию mousePressEvent().Получает текущий фокусированный виджет.Если этот виджет имеет тип MyLineEdit, очистите фокус.

class MyMainWindow(QtGui.QMainWindow):
    def ...

    def mousePressEvent(self, event):
        focused_widget = QtGui.QApplication.focusWidget()
        if isinstance(focused_widget, MyLineEdit):
            focused_widget.clearFocus()
        QtGui.QMainWindow.mousePressEvent(self, event)

    def ...

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


Редактировать: я нашел одно предупреждение для этого.У меня есть QTreeView в главном окне.Если пользователь щелкает по дереву, фокус не удаляется из поля редактирования текста.

6 голосов
/ 17 декабря 2010

Перехватите сигнал clicked () вашего родительского виджета и вызовите туда yourLabel-> clearFocus () (что, к сожалению, не является слотом, что усложняет ситуацию).

2 голосов
/ 10 июня 2016

Я следовал инструкции Гранта Лимберга здесь, но понял, что в моем случае простое:

QApplication.focusWidget().clearFocus()

решит проблему.

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

Если бы это было сделано в C ++, я бы сделал что-то вроде:

connect(myWidgets->MyLineEdit, SIGNAL(returnPressed()), this, SLOT(onLineEditDone());

void onLineEditDone()
{
    myWidgets->MyLineEdit->clearFocus();
}

Для этого конкретного случая я бы использовал editingFinished() вместо returnPressed(), вероятно, но я бы НЕ использовал textChanged(QString).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...