Установка текста непосредственно в QLineEdit
непобедима, скажем, что после использования QTextEdit
или другого виджета, и если вы хотите реализовать ключ очистки и т. Д., Ваше решение будет во многом зависеть от виджета.
Менее связанным решением является использование QCoreApplication::postEvent()
для отправки QKeyEvent
на виджет, который имеет фокус, используя QApplication::focusWidget()
from PyQt4 import QtCore, QtGui
class KeyPad(QtGui.QWidget):
def __init__(self, parent=None):
super(KeyPad, self).__init__(parent)
grid_lay = QtGui.QGridLayout(self)
keys = [
("7", QtCore.Qt.Key_7 , 0, 0, 1, 1),
("8", QtCore.Qt.Key_8 , 0, 1, 1, 1),
("9", QtCore.Qt.Key_9 , 0, 2, 1, 1),
("-", QtCore.Qt.Key_Minus , 0, 3, 1, 1),
("4", QtCore.Qt.Key_4 , 1, 0, 1, 1),
("5", QtCore.Qt.Key_5 , 1, 1, 1, 1),
("6", QtCore.Qt.Key_6 , 1, 2, 1, 1),
("+", QtCore.Qt.Key_Plus , 1, 3, 1, 1),
("1", QtCore.Qt.Key_1 , 2, 0, 1, 1),
("2", QtCore.Qt.Key_2 , 2, 1, 1, 1),
("3", QtCore.Qt.Key_3 , 2, 2, 1, 1),
("0", QtCore.Qt.Key_0 , 3, 0, 1, 2),
(".", QtCore.Qt.Key_Period , 3, 2, 1, 1),
("enter", QtCore.Qt.Key_Return , 2, 3, 2, 1)
]
for text, key, r, c, sr, sc in keys:
button = QtGui.QPushButton(text=text, focusPolicy=QtCore.Qt.NoFocus)
button.setProperty("_key_", key)
grid_lay.addWidget(button, r, c, sr, sc)
button.clicked.connect(self.on_clicked)
if text == "enter":
sp = button.sizePolicy()
sp.setVerticalPolicy(sp.horizontalPolicy())
button.setSizePolicy(sp)
@QtCore.pyqtSlot()
def on_clicked(self):
button = self.sender()
text = "" if button.text() == "enter" else button.text()
key = button.property("_key_")
widget = QtGui.QApplication.focusWidget()
if hasattr(key, 'toPyObject'):
key = key.toPyObject()
if widget:
event = QtGui.QKeyEvent(QtCore.QEvent.KeyPress, key, QtCore.Qt.NoModifier, text)
QtCore.QCoreApplication.postEvent(widget, event)
class Widget(QtGui.QWidget):
def __init__(self, parent=None):
super(Widget, self).__init__(parent)
cash_btn = QtGui.QPushButton("cash", clicked=self.on_cash_btn_clicked)
card_btn = QtGui.QPushButton("Card")
wallet_btn = QtGui.QPushButton("wallet")
self.cash_widget = QtGui.QWidget(visible=False)
self.cash_received = QtGui.QLineEdit()
self.cash_tender = QtGui.QLineEdit()
cash_lay = QtGui.QVBoxLayout(self.cash_widget)
cash_lay.addWidget(self.cash_received)
cash_lay.addWidget(self.cash_tender)
keypad = KeyPad()
hbox = QtGui.QHBoxLayout()
hbox.addWidget(cash_btn)
hbox.addWidget(card_btn)
hbox.addWidget(wallet_btn)
vlay = QtGui.QVBoxLayout(self)
vlay.addLayout(hbox)
vlay.addWidget(self.cash_widget)
vlay.addWidget(keypad)
@QtCore.pyqtSlot()
def on_cash_btn_clicked(self):
self.cash_widget.setVisible(not self.cash_widget.isVisible())
if self.cash_widget.isVisible():
self.cash_received.setFocus()
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
w = Widget()
w.show()
sys.exit(app.exec_())