Python 如何将一行编辑的焦点更改为另一行编辑
这是我的示例程序,在此我有一个两行编辑,我想使用键盘设置文本。我在两行编辑中得到相同的文本。任何人都可以帮助我如何聚焦特定的选定行编辑。如果我选择了现金行编辑,我的文本将设置为该对象。提前谢谢。 下面是我的代码:Python 如何将一行编辑的焦点更改为另一行编辑,python,python-2.7,pyqt,pyqt4,Python,Python 2.7,Pyqt,Pyqt4,这是我的示例程序,在此我有一个两行编辑,我想使用键盘设置文本。我在两行编辑中得到相同的文本。任何人都可以帮助我如何聚焦特定的选定行编辑。如果我选择了现金行编辑,我的文本将设置为该对象。提前谢谢。 下面是我的代码: import sys from PyQt4 import QtGui,QtCore from functools import partial class Example(QtGui.QWidget): def __init__(self): super(E
import sys
from PyQt4 import QtGui,QtCore
from functools import partial
class Example(QtGui.QWidget):
def __init__(self):
super(Example, self).__init__()
self.initUI()
def initUI(self):
self.Vbox = QtGui.QGridLayout()
hbox = QtGui.QHBoxLayout(spacing = 0)
hbox.setContentsMargins(0, 0, 0, 0)
cash_btn = QtGui.QPushButton("cash")
card_btn = QtGui.QPushButton("Card")
cash_btn.clicked.connect(self.cash_card_payment)
wallet_btn = QtGui.QPushButton("wallet")
hbox.addWidget(cash_btn)
hbox.addWidget(card_btn)
hbox.addWidget(wallet_btn)
self.Vbox.addLayout(hbox,0,0)
grid = QtGui.QGridLayout()
self.Vbox.addLayout(grid,3,0)
self.setLayout(self.Vbox)
names = [
'7', '8', '9', '-',
'4', '5', '6', '+',
'1', '2', '3', 'enter',
'0', '', '.']
positions = [(i,j) for i in range(4) for j in range(4)]
for position, name in zip(positions, names):
x, y = position
if name == '':
continue
button = QtGui.QPushButton(name)
button.setFocusPolicy(QtCore.Qt.NoFocus)
button.clicked.connect(partial(self.buttonClicked,name))
button.setMinimumWidth(50)
button.setMinimumHeight(50)
if button.text() == 'enter':
button.setMinimumHeight(110)
grid.addWidget(button, x, y, 2,1)
elif button.text() == '0':
grid.addWidget(button, x, y, 1,2)
else:
grid.addWidget(button, x, y, 1,1)
def cash_card_payment(self):
print "cardssss"
cash_payment_vbox = QtGui.QVBoxLayout()
cash_payment_vbox.setAlignment(QtCore.Qt.AlignCenter)
self.cash_received = QtGui.QLineEdit()
self.cash_tender = QtGui.QLineEdit()
cash_payment_vbox.addWidget(self.cash_received)
cash_payment_vbox.addWidget(self.cash_tender)
self.Vbox.addWidget(self.cash_received,1,0)
self.Vbox.addWidget(self.cash_tender,2,0)
def buttonClicked(self,name):
print name
self.cash_received.setText(name)
#herei want to set the text for
# cash_received objec only
self.cash_tender.setText(name) # here i want to set the text for
# cash_tender objec only how can i focus the one line edit to another
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
ex = Example()
ex.show()
ex.setWindowTitle('Calculator')
ex.setGeometry(300, 150, 500,400)
sys.exit(app.exec_())
直接在
QLineEdit
中设置文本是无可比拟的,比如说在使用qtexedit
或其他小部件之后,如果您想实现清除键,等等,您的解决方案将在很大程度上取决于小部件
较少耦合的解决方案是使用QCoreApplication::postEvent()
向具有焦点的小部件发送QKeyEvent
,使用QApplication::focusWidget()
PyQt5版本:
从PyQt5导入QtCore、QtGui、qtwidget
类键盘(qtwidts.QWidget):
def uuu init uuu(self,parent=None):
超级(键盘,自我)。\uuuuu初始化\uuuuuuuu(父级)
grid_lay=qtwidts.QGridLayout(self)
钥匙=[
(“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_减号,0,3,1,1),
(“4”,QtCore.Qt.Key_4,1,0,1,1),
(“5”,QtCore.Qt.Key_5,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_周期,3,2,1,1),
(“输入”,QtCore.Qt.Key_返回,2,3,2,1),
]
对于文本、键、r、c、sr、sc输入键:
button=qtwidts.QPushButton(text=text,focusPolicy=QtCore.Qt.NoFocus)
button.setProperty(“\u key”,key)
网格层添加小部件(按钮、r、c、sr、sc)
按钮。单击。连接(单击时自行)
如果文本==“输入”:
sp=button.sizePolicy()
sp.setVerticalPolicy(sp.horizontalPolicy())
按钮设置策略(sp)
@QtCore.pyqtSlot()
已单击的def(自身):
button=self.sender()
text=”“if button.text()==“enter”else button.text()
key=button.property(“\u key”)
widget=qtwidts.QApplication.focusWidget()
如果hasattr(键,“toPyObject”):
key=key.toPyObject()
如果小部件:
event=QtGui.QKeyEvent(
QtCore.QEvent.KeyPress,键,QtCore.Qt.NoModifier,文本
)
QtCore.QCoreApplication.postEvent(小部件,事件)
类小部件(qtwidts.QWidget):
def uuu init uuu(self,parent=None):
超级(小部件,自我)。\uuuuu初始化\uuuuuuu(父级)
cash\u btn=qtwidts.QPushButton(“cash”,clicked=self.on\u cash\u btn\u clicked)
card_btn=qtwidts.QPushButton(“卡”)
钱包\u btn=qtwidts.QPushButton(“钱包”)
self.cash\u widget=qtwidts.QWidget(可见=False)
self.cash_received=qtwidts.QLineEdit()
self.cash_tender=qtwidts.QLineEdit()
cash\u lay=qtwidts.QVBoxLayout(self.cash\u小部件)
cash\u lay.addWidget(self.cash\u received)
现金支付(self.cash\u-tender)
小键盘=小键盘()
hbox=qtwidts.QHBoxLayout()
hbox.addWidget(现金支付)
hbox.addWidget(卡\u btn)
hbox.addWidget(钱包\u btn)
vlay=qtwidts.QVBoxLayout(self)
vlay.addLayout(hbox)
vlay.addWidget(self.cash_小部件)
vlay.addWidget(键盘)
@QtCore.pyqtSlot()
已单击现金上的def(自我):
self.cash\u widget.setVisible(不是self.cash\u widget.isVisible())
如果self.cash\u widget.isVisible():
self.cash_received.setFocus()
如果名称=“\uuuuu main\uuuuuuuu”:
导入系统
app=qtwidts.QApplication(sys.argv)
w=Widget()
w、 show()
sys.exit(app.exec_())
当我运行此代码时,我得到了以下错误类型错误:参数与任何重载调用不匹配:QKeyEvent(QEvent.Type,int,Union[Qt.KeyboardModifiers,Qt.KeyboardModifier],text:str='',autorep:bool=False,count:int=1):参数2具有意外类型“QVariant”QKeyEvent(QKeyEvent):参数1具有意外类型“Type”
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_())