根据最后的焦点,使用一个QPushButton和两个QLineEdits

时间:2015-04-10 04:33:52

标签: python pyside qlineedit qpushbutton

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

据我所知,目前我的代码将退格第一行,但是我希望它能删除最近有焦点的行编辑(即如果在退格之前选择了line1,它将退回,如果第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_())

3 个答案:

答案 0 :(得分: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)

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

  

按下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。无法从back函数访问本地作用域last_lineedit

答案 1 :(得分:1)

最好是退格按钮没有窃取焦点。这样,插入符号将在具有焦点的行编辑中保持可见,并且用户可以轻松地查看到底发生了什么。这样做也使代码更简单:

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

答案 2 :(得分:0)

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

我对此进行了测试,并修复了我看到的任何错误,但是嘿,随意使用它。我注意到计算器中存在大量示例,但没有针对键盘或数字键入口的实例。享受!

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