我有一个QLineEdit,它将使用RFID标签的值,并使用接收到的值登录用户,我已经设置了QLineEdit,以便在按Enter键时调用登录功能。
我唯一剩下的问题是QLineEdit是可见的,这是不必要的,因为用户不会输入其RFID标签的值,他们将对其进行扫描,然后扫描仪将输入该值并按Enter
rfid_enter = QLineEdit()
rfid_enter.returnPressed.connect(lambda: log_user_in(rfid_enter.text()))
def log_user_in(value):
print(value) (THIS WILL LOG THE USER IN)
答案 0 :(得分:1)
QLineEdit需要具有焦点来获取键盘事件,但是要使其具有焦点必须可见,因此将其隐藏不是解决方案。
如窗口the comments中的OP所指出的,只有:两个标签和一些间隔符,它们不处理键盘事件,因此没有可拦截的小部件该事件,以便窗口可以毫无问题地获取它们(如果还有其他小部件,例如QLineEdits,QTextEdit,QSpinBox等,则逻辑可能会更改)。
考虑到上述情况,我实现了以下逻辑:
import string
from PyQt5 import QtCore, QtWidgets
class Widget(QtWidgets.QWidget):
returnPressed = QtCore.pyqtSignal(str)
def __init__(self, parent=None):
super(Widget, self).__init__(parent)
lay = QtWidgets.QVBoxLayout(self)
lay.addWidget(
QtWidgets.QLabel("My Label", alignment=QtCore.Qt.AlignHCenter),
alignment=QtCore.Qt.AlignTop,
)
self.m_text = ""
self.returnPressed.connect(self.log_user_in)
def keyPressEvent(self, event):
if event.text() in string.ascii_letters + string.digits:
self.m_text += event.text()
if event.key() in (QtCore.Qt.Key_Return, QtCore.Qt.Key_Enter):
self.returnPressed.emit(self.m_text)
# clear text
self.m_text = ""
super(Widget, self).keyPressEvent(event)
@QtCore.pyqtSlot(str)
def log_user_in(self, text):
print(text)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
w = Widget()
w.resize(240, 320)
w.show()
sys.exit(app.exec_())
答案 1 :(得分:0)
如果整个窗口都是他创建的类,则从eyllanesc的答案将起作用,但是在我的情况下,布局将更改,因此我不能将其用作主窗口。
我尝试了一种作弊方法,即尝试尽可能多地隐藏盒子并最终得到这个结果。
class LogInRFIDListener(QtWidgets.QPlainTextEdit):
def __init__(self):
super(LogInRFIDListener, self).__init__()
self.setTextInteractionFlags(QtCore.Qt.TextEditable)
self.setCursor(QtCore.Qt.ArrowCursor)
self.setStyleSheet("border: none; color: transparent;") # Hide the border around the text box
self.setCursorWidth(0) # Hide the cursor
def keyPressEvent(self, event): # Major restricting needed
if event.key() in (QtCore.Qt.Key_Return, QtCore.Qt.Key_Enter):
log_user_in(self.toPlainText())
super(LogInRFIDListener, self).keyPressEvent(event)