将一个 QPushButton 与两个 QLineEdits 结合使用,具体取决于最后的焦点

Use one QPushButton with two QLineEdits, depending on last focus

我有一个window,里面有两个QLineEdits。它们是第 1 行和第 2 行。我有一个要按下的 Backspace QPushButton。我想要一些代码,当按下退格键时,这些代码将从所需的 QLineEdit 中删除文本。这个要看当时关注的是哪个。

我知道目前我的代码将退格第 1 行,但是我希望它删除最近获得焦点的任何行编辑(即,如果第 1 行在退格之前被选中,它将退格,如果第 2 行是最后一个焦点, 然后它将退格)。

我认为它需要一个 if 语句或 2,但不确定。如何根据最后一个焦点选择删除哪一行编辑?

from PySide import QtGui, QtCore
from PySide.QtCore import*
from PySide.QtGui import*

class MainWindow(QtGui.QMainWindow):                                                                                    #The Main Window Class Maker

    def __init__(self,):
        QtGui.QMainWindow.__init__(self)
        QtGui.QApplication.setStyle(('cleanlooks'))

        mfont = QFont()
        mfont.setFamily("BankGothic LT")
        mfont.setPointSize(40)
        mfont.setBold(True)
        xfont = QFont()
        xfont.setFamily("BankGothic LT")
        xfont.setPointSize(40)
        xfont.setLetterSpacing(QFont.AbsoluteSpacing, 15)

        self.line1 = QLineEdit("Line 1", self)
        self.line1.setFixedSize(460, 65)
        self.line1.setFont(xfont)
        self.line1.move(10,10)

        self.line2 = QLineEdit("Line 2", self)
        self.line2.setFixedSize(460, 65)
        self.line2.setFont(xfont)
        self.line2.move(10,200)


        #BackSpace button
        back = QPushButton("BackSpace", self)
        back.move(100,100)
        back.setFixedSize(300,75)
        back.setFont(mfont)
        back.clicked.connect(self.line1.backspace)


if __name__ == '__main__':

    import sys
    app = QtGui.QApplication(sys.argv)
    window = MainWindow()
    window.setWindowTitle("BackSpace")
    window.resize(480, 400)
    window.setMaximumSize(480,400)
    window.setMinimumSize(480,400)
    window.show()
    sys.exit(app.exec_())

您可以通过使用 editingFinished 信号和一些操作将行编辑连接到您的 backspace 函数来完成此操作。

我将 post 然后是整个代码块,然后解释我在其下方所做的更改。

class MainWindow(QtGui.QMainWindow): 
    def __init__(self,):
        QtGui.QMainWindow.__init__(self)
        QtGui.QApplication.setStyle(('cleanlooks'))

        mfont = QFont()
        mfont.setFamily("BankGothic LT")
        mfont.setPointSize(40)
        mfont.setBold(True)
        xfont = QFont()
        xfont.setFamily("BankGothic LT")
        xfont.setPointSize(40)
        xfont.setLetterSpacing(QFont.AbsoluteSpacing, 15)

        self.line1 = QLineEdit("Line 1", self)
        self.line1.setFixedSize(460, 65)
        self.line1.setFont(xfont)
        self.line1.move(10,10)

        self.line2 = QLineEdit("Line 2", self)
        self.line2.setFixedSize(460, 65)
        self.line2.setFont(xfont)
        self.line2.move(10,200)

        self.recent_line = self.line2
        self.previous_line = self.line1

        #BackSpace button
        self.back = QPushButton("BackSpace", self)
        self.back.move(100,100)
        self.back.setFixedSize(300,75)
        self.back.setFont(mfont)
        self.back.clicked.connect(self.recent_line.backspace)

        self.line1.editingFinished.connect(self.last_lineedit)
        self.line2.editingFinished.connect(self.last_lineedit)

    def last_lineedit(self):
        if isinstance(self.sender(), QLineEdit):
            self.recent_line, self.previous_line = self.previous_line, self.recent_line
            self.back.clicked.disconnect(self.previous_line.backspace)
            self.back.clicked.connect(self.recent_line.backspace)

我所做的第一个更改是包含两个新变量,以便我们可以跟踪 QLineEdit 最后关注的是哪个:

self.recent_line = self.line2
self.previous_line = self.line1

接下来,我将您的 back 小部件更改为 self.back,因为我们将在 __init__

之外需要它
self.back = QPushButton("BackSpace", self)
self.back.move(100,100)
self.back.setFixedSize(300,75)
self.back.setFont(mfont)
self.back.clicked.connect(self.recent_line.backspace)

然后我们将line1line2设置为editingFinished信号。

This signal is emitted when the Return or Enter key is pressed or the line edit loses focus.

我们将利用 "loses focus" 部分,因为当按下 self.back 按钮时,QLineEdit 失去了焦点。

最后,我们将了解要跟踪哪个 QLineEdit 在任何给定时间连接到退格键的函数。

def last_lineedit(self):
    if isinstance(self.sender(), QLineEdit):
        self.recent_line, self.previous_line = self.previous_line, self.recent_line
        self.back.clicked.disconnect(self.previous_line.backspace)
        self.back.clicked.connect(self.recent_line.backspace)

在这个函数中,我们首先确保只有一个 QLineEdits 正在发送信号(以防万一你将其他东西连接到这个不是 QLineEdit 的信号)。

接下来,我们交换 QLineEdit 最近关注的是:

self.recent_line, self.previous_line = self.previous_line, self.recent_line

然后我们断开与上一条线的连接并连接到新线。最后两行很神奇,它允许您根据最近获得焦点的两行进行删除。这些行也是我们更改为 self.back 而不是将其保留在 back 的原因。 last_lineedit 函数无法访问局部范围的 back

退格按钮最好不要抢走焦点。这样,插入符号将在具有焦点的行编辑中保持可见,并且用户可以轻松地准确地看到正在发生的事情。这样做也使代码更简单:

        back.setFocusPolicy(QtCore.Qt.NoFocus)
        back.clicked.connect(self.handleBackspace)

    def handleBackspace(self):
        widget = QtGui.qApp.focusWidget()
        if widget is self.line1 or widget is self.line2:
            widget.backspace()

好的,伙计们,所以我一直致力于此,以找到一种有用的情况,人们可以在这种情况下使用这种功能。 假设您正在尝试为触摸屏创建一个登录表单,但您没有安装屏幕键盘,您可以 'create' 一个。这就是预期用途。

我已经对此进行了某种测试,并修复了我看到的所有错误,但是嘿,请随意使用它。我注意到计算器存在大量示例,但键盘或数字键盘输入没有实际示例。享受吧!

    from PySide import QtGui, QtCore
    from PySide.QtCore import*
    from PySide.QtGui import*

    class MainWindow(QtGui.QMainWindow):                                                                                    #The Main Window Class Maker

    def __init__(self,):
        QtGui.QMainWindow.__init__(self)
        QtGui.QApplication.setStyle(('cleanlooks'))

        U = QLabel("U:", self)
        U.move(10,10)
        P = QLabel("P:", self)
        P.move(10,50)

        self.line1 = QLineEdit("", self)
        self.line1.move(20,10)
        self.line1.setReadOnly(True)

        self.line2 = QLineEdit("", self)
        self.line2.move(20,50)
        self.line2.setReadOnly(True)
        self.line2.setEchoMode(QLineEdit.Password)

        #PushButtons
        back = QPushButton("<", self)
        back.move(100,80)
        back.setFocusPolicy(QtCore.Qt.NoFocus)
        back.setFixedSize(20,20)
        one = QPushButton('1', self)
        one.move(10,80)
        one.setFocusPolicy(QtCore.Qt.NoFocus)
        one.setText("1")
        one.setFixedSize(20,20)
        two = QPushButton('2', self)
        two.move(40,80)
        two.setFocusPolicy(QtCore.Qt.NoFocus)
        two.setFixedSize(20,20)
        three = QPushButton('3', self)
        three.move(70,80)
        three.setFocusPolicy(QtCore.Qt.NoFocus)
        three.setFixedSize(20,20)
        four = QPushButton('4', self)
        four.move(10,110)
        four.setFocusPolicy(QtCore.Qt.NoFocus)
        four.setFixedSize(20,20)
        five = QPushButton('5', self)
        five.move(40,110)
        five.setFocusPolicy(QtCore.Qt.NoFocus)
        five.setFixedSize(20,20)
        six = QPushButton('6', self)
        six.move(70,110)
        six.setFocusPolicy(QtCore.Qt.NoFocus)
        six.setFixedSize(20,20)
        seven = QPushButton('7', self)
        seven.move(10,140)
        seven.setFocusPolicy(QtCore.Qt.NoFocus)
        seven.setFixedSize(20,20)
        eight = QPushButton('8', self)
        eight.move(40,140)
        eight.setFocusPolicy(QtCore.Qt.NoFocus)
        eight.setFixedSize(20,20)
        nine = QPushButton('9', self)
        nine.move(70,140)
        nine.setFocusPolicy(QtCore.Qt.NoFocus)
        nine.setFixedSize(20,20)
        zero = QPushButton('0', self)
        zero.move(100,140)
        zero.setFocusPolicy(QtCore.Qt.NoFocus)
        zero.setFixedSize(20,20)
        enter = QPushButton("E", self)
        enter.move(100,110)
        enter.setFixedSize(20,20)
        enter.setFocusPolicy(QtCore.Qt.NoFocus)


                #click Handles
        def handleBackspace():
            backh = QtGui.qApp.focusWidget()
            if backh is self.line1 or backh is self.line2:
                backh.backspace()
        def handleZero():
            zeroh = QtGui.qApp.focusWidget()
            if zeroh is self.line1:
                zeroh.setText((self.line1.text()+str('0')))
            else:
                zeroh.setText(self.line2.text()+str('0'))
        def handleOne():
            oneh = QtGui.qApp.focusWidget()
            if oneh is self.line1:
                oneh.setText(self.line1.text()+str('1'))
            else:
                oneh.setText(self.line2.text()+str('1'))
        def handleTwo():
            twoh = QtGui.qApp.focusWidget()
            if twoh is self.line1:
                twoh.setText(self.line1.text()+str('2'))
            else:
                twoh.setText(self.line2.text()+str('2'))
        def handleThree():
            threeh = QtGui.qApp.focusWidget()
            if threeh is self.line1:
                threeh.setText(self.line1.text()+str('3'))
            else:
                threeh.setText(self.line2.text()+str('3'))
        def handleFour():
            fourh = QtGui.qApp.focusWidget()
            if fourh is self.line1:
                fourh.setText(self.line1.text()+str('4'))
            else:
                 fourh.setText(self.line2.text()+str('4'))
        def handleFive():
            fiveh = QtGui.qApp.focusWidget()
            if fiveh is self.line1:
                fiveh.setText(self.line1.text()+str('5'))
            else:
                fiveh.setText(self.line2.text()+str('5'))
        def handleSix():
            sixh = QtGui.qApp.focusWidget()
            if sixh is self.line1:
                sixh.setText(self.line1.text()+str('6'))
            else:
                sixh.setText(self.line2.text()+str('6'))
        def handleSeven():
            sevenh = QtGui.qApp.focusWidget()
            if sevenh is self.line1:
                sevenh.setText(self.line1.text()+str('7'))
            else:
                sevenh.setText(self.line2.text()+str('7'))
        def handleEight():
            eighth = QtGui.qApp.focusWidget()
            if eighth is self.line1:
                eighth.setText(self.line1.text()+str('8'))
            else:
                eighth.setText(self.line2.text()+str('8'))
        def handleNine():
            nineh = QtGui.qApp.focusWidget()
            if nineh is self.line1:
                nineh.setText(self.line1.text()+str('9'))
            else:
                nineh.setText(self.line2.text()+str('9'))

        #Click Conditions
        self.connect(enter, SIGNAL("clicked()"), self.close)
        zero.clicked.connect(handleZero)
        nine.clicked.connect(handleNine)
        eight.clicked.connect(handleEight)
        seven.clicked.connect(handleSeven)
        six.clicked.connect(handleSix)
        five.clicked.connect(handleFive)
        four.clicked.connect(handleFour)
        three.clicked.connect(handleThree)
        two.clicked.connect(handleTwo)
        one.clicked.connect(handleOne)
        back.clicked.connect(handleBackspace)

if __name__ == '__main__':

    import sys
    app = QtGui.QApplication(sys.argv)
    window = MainWindow()
    window.setWindowTitle("LoginWindow")
    window.resize(130, 180)
    window.setMaximumSize(130, 180)
    window.setMinimumSize(130, 180)
    window.show()
    sys.exit(app.exec_())