Как удалить фокус из QLineEdit при щелчке в любом месте окна

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

4 ответов


я нашел решение, которое, кажется, работает, хотя я все еще открыт для других вариантов, если они есть. Я использую 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 ...

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


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


поймать сигнал clicked() из родительского виджета и вызов yourLabel->clearFocus() (что, к сожалению, не является слотом, что делает вещи более сложными) там.


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

QApplication.focusWidget().clearFocus()

исправит проблему.


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

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

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

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