如何存储QLineEdit的字符串,并能够使用QPushButton将存储的字符串添加到QLineEdit?

2024-04-24 03:13:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在为我的计算器实现一个“ANS”按钮,将最后的计算结果添加到QLineEdit中。我计划使用一个self.stored = ''变量,然后在每次调用calculate信号时对其进行更改。但我不知道出了什么问题,可能是存储不正确

我创建了一个计算器的代码示例

import sys
from functools import cached_property, partial
from PyQt6.QtCore import QRect, Qt
from PyQt6.QtGui import QAction
from PyQt6.QtWidgets import *

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.buttons = {}
        self.setWindowTitle("Try")

        central_widget = QWidget()
        self.setCentralWidget(central_widget)

        self.lay = QVBoxLayout(central_widget)
        self.lineedit()

        maps = {"Store": (0, 0), "B": (0, 1), "C": (1, 0), "D": (1, 1), "Return": (2, 0, 1, 2)}
        buttons = self.create_page(maps)
        self.lay.addWidget(buttons)

    def lineedit(self):
        self.le = QLineEdit()
        self.le.setFixedHeight(35)
        self.lay.addWidget(self.le)

    def set_lineedit(self, text):
        self.le.setText(text)
        self.le.setFocus()

    def line(self):
        return self.le.text()

    def create_page(self, map_letters):
        page = QWidget()
        grid_layout = QGridLayout(page)
        for name, pos in map_letters.items():
            if name == 'Return':
                self.buttons[name] = QPushButton(name)
                self.buttons[name].setFixedSize(120, 40)
                grid_layout.addWidget(self.buttons[name], *pos)
            else:
                self.buttons[name] = QPushButton(name)
                self.buttons[name].setFixedSize(40, 40)
                grid_layout.addWidget(self.buttons[name], *pos)
        return page

class Controller:

    def __init__(self, MainWindow):

        self.view = MainWindow
        self.stored = ''
        self.connectSignals()

    def store(self):

        currentText = self.view.line()
        self.stored = currentText

    def buildExpression(self, sub_exp):

        expression = self.view.line() + sub_exp
        self.view.set_lineedit(expression)

    def connectSignals(self):

        for btnText, btn in self.view.buttons.items():
            if btnText not in ['Store', 'Return']:
                btn.clicked.connect(partial(self.buildExpression, btnText))

            self.view.buttons['Return'].clicked.connect(partial(self.buildExpression, self.stored))
            self.view.buttons['Store'].clicked.connect(self.store)

app = QApplication(sys.argv)
w = MainWindow()
Controller(w)
w.show()
app.exec()

它看起来像什么:

What it looks like

所以按钮BCD将它们各自的字母添加到QLineEdit中,然后我希望每次单击按钮“Store”时QLineEdit中的当前文本都存储到变量中,当单击“Return”时,它应该将存储的变量添加到QLineEdit中

假设您单击B,然后单击C,然后单击D,那么现在您的QLineEdit是BCD。 现在单击“存储”,BCD现在必须存储到变量中。 然后,如果单击“返回”,存储的变量现在将添加到QLineEdit中。 因此,您的最终QLineEdit应该是“BCDBCD”

但是“Return”按钮不起作用,因为它不会将“BCD”添加到QLineEdit中


1条回答
网友
1楼 · 发布于 2024-04-24 03:13:28

问题是,当您使用partial时,您表示要在连接时将“stored”的值传递给它,这是一个空字符串,因此您总是添加一个空字符串,这意味着不修改任何内容。逻辑是创建另一个使用当前值“存储”的函数

class Controller:
    def __init__(self, view):
        self.view = view
        self.stored = ""
        self.connectSignals()

    def handleStore(self):
        self.stored = self.view.line()

    def handleReturn(self):
        self.buildExpression(self.stored)

    def buildExpression(self, sub_exp):
        expression = self.view.line() + sub_exp
        self.view.set_lineedit(expression)

    def connectSignals(self):
        for btnText, btn in self.view.buttons.items():
            if btnText == "Return":
                btn.clicked.connect(self.handleReturn)
            elif btnText == "Store":
                btn.clicked.connect(self.handleStore)
            else:
                btn.clicked.connect(partial(self.buildExpression, btnText))

相关问题 更多 >