如何使用pyqt4将焦点更改为一行编辑到另一行编辑

时间:2019-01-18 16:34:13

标签: python python-2.7 pyqt pyqt4

这是我的示例程序,在这个示例中,我有两行编辑,我想使用键盘设置文本。我在两行编辑中得到相同的文本,任何人都可以帮助我如何集中选择的特定内容行编辑。如果我选​​择了cash_received行编辑,我的文本将设置为该对象。在此先感谢您。 下面是我的代码:

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_())

1 个答案:

答案 0 :(得分:1)

Setting the text directly in the QLineEdit is unbeatable, say that after you use QTextEdit or another widget, and say you want to implement the clear key, etc, your solution will depend a lot on the widget.

A less coupled solution is to use QCoreApplication::postEvent() to send a QKeyEvent to the widget that has the focus using 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_())