Как разрешить событие нажатия клавиши табуляции в pyqt5 - PullRequest
0 голосов
/ 18 декабря 2018

Предполагая, что у меня есть QPushButton с именем button, я успешно делаю следующее, чтобы разрешить событие click :

class UI(object):
    def setupUi(self, Dialog):
        # ...
        self.button.clicked.connect(self.do_something)

    def do_something(self):
        # Something here

Мой вопрос: как я могу вызвать do_something()когда нажата кнопка the tab?Например, если у меня есть QlineEdit с именем tb_id, после ввода значения и нажатия клавиши табуляции метод do_something() должен вызываться так же, как clicked, описанный выше.Как я могу сделать это, используя pyqt5?

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

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

Чтобы получить то, что вы хотите, есть много методов, но прежде чем указывать на это, наблюдая за вашим кодом, я вижу, что вы сгенерировали его с помощью Qt Designer, так что код не должен быть изменен, но создайте другой класс, который использует этот код, чтобы я поместилбазовый код:

from PyQt5 import QtCore, QtWidgets

class UI(object):
    def setupUi(self, Dialog):
        self.button = QtWidgets.QPushButton("Press Me")
        lay = QtWidgets.QVBoxLayout(Dialog)
        lay.addWidget(self.button)

class Dialog(QtWidgets.QDialog, UI):
    def __init__(self, parent=None):
        super(Dialog, self).__init__(parent)
        self.setupUi(self)
        self.button.clicked.connect(self.do_something)

    @QtCore.pyqtSlot()
    def do_something(self):
        print("do_something")

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = Dialog()
    w.resize(640, 480)
    w.show()
    sys.exit(app.exec_())

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

Теперь, если идти к точке, есть следующие опции:

  • Использование keyPressEvent:

class Dialog(QtWidgets.QDialog, UI):
    def __init__(self, parent=None):
        super(Dialog, self).__init__(parent)
        self.setupUi(self)
        self.button.clicked.connect(self.do_something)

    @QtCore.pyqtSlot()
    def do_something(self):
        print("do_something")

    def keyPressEvent(self, event):
        if event.key() == QtCore.Qt.Key_Tab:
            self.do_something()
  • Использование фильтра событий:

class Dialog(QtWidgets.QDialog, UI):
    def __init__(self, parent=None):
        super(Dialog, self).__init__(parent)
        self.setupUi(self)
        self.button.clicked.connect(self.do_something)

    @QtCore.pyqtSlot()
    def do_something(self):
        print("do_something")

    def eventFilter(self, obj, event):
        if obj is self and event.type() == QtCore.QEvent.KeyPress:
            if event.key() == QtCore.Qt.Key_Tab:
                self.do_something()
        return super(Dialog, self).eventFilter(obj, event)
  • Использование активированного сигналаQShorcut:

class Dialog(QtWidgets.QDialog, UI):
    def __init__(self, parent=None):
        super(Dialog, self).__init__(parent)
        self.setupUi(self)
        self.button.clicked.connect(self.do_something)
        shortcut = QtWidgets.QShortcut(QtGui.QKeySequence(QtCore.Qt.Key_Tab), self)
        shortcut.activated.connect(self.do_something)

    @QtCore.pyqtSlot()
    def do_something(self):
        print("do_something")

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

НаС другой стороны, только событияобнаруживаются, когда фокус находится в окне Qt.

0 голосов
/ 18 декабря 2018

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

Вот пример,

from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QDialog

class UI(QDialog):

    def __init__(self):
        super(UI, self).__init__()
        # ...
        self.button.clicked.connect(self.do_something)

    def do_something(self):
        # Something here

    def keyPressEvent(self, event):
        # when press key is Tab call your function
        if event.key() == Qt.Key_Tab:
           self.do_something()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...