假设我有一个名为button
的QPushButton,我成功执行了以下操作以允许 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
?例如,如果我有一个名为tb_id
的QlineEdit,则在输入值并按Tab键之后,应该以与do_something()
相同的方式调用clicked
方法。如何使用pyqt5
来做到这一点?
非常感谢您。
答案 0 :(得分:3)
要获得所需的方法,有很多方法,但是在观察代码指向它之前,我看到您已经使用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_())
此外,我建议您在What are the differences between event and signal in Qt中阅读Qt世界中事件和信号之间的区别,因为您所说的是 click事件,但是在Qt世界中,您必须说点击信号。
现在要讲的话,有以下几种选择:
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)
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窗口中时,仅检测到事件。
答案 1 :(得分:1)
我假设您将小部件放在QDialog小部件中,因此,如果要实现自己的按键事件,则应覆盖Dialog小部件的 keyPressEvent , 然后它可以表现出您想要的样子。
这是一个例子,
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()