【问题标题】:Use one QPushButton with two QLineEdits, depending on last focus使用一个 QPushButton 和两个 QLineEdits,取决于最后一个焦点
【发布时间】:2015-04-10 04:33:51
【问题描述】:

我有一个窗口,里面有两个 QLineEdit。它们是第 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_())

【问题讨论】:

    标签: python pyside qlineedit qpushbutton


    【解决方案1】:

    您可以通过使用editingFinished 信号和对与backspace 函数相关联的行编辑进行一些操作来完成此操作。

    我将发布整个代码块,然后解释我在下面所做的更改。

    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)
    

    然后我们将设置line1line2editingFinished 信号。

    当按下 Return 或 Enter 键或行编辑失去焦点时会发出此信号。

    我们将使用“失去焦点”部分,因为当按下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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多