【问题标题】:How to get information from widgets如何从小部件中获取信息
【发布时间】:2016-08-05 11:23:35
【问题描述】:

我有一个 PyQt 程序,在这个项目中,我根据之前设置的偏好进行了一些计算。

例如,我创建了一个包含以下文件的小型计算器:

example_run_vars.py

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(324, 332)
        self.gridLayout = QtWidgets.QGridLayout(Dialog)
        self.gridLayout.setObjectName("gridLayout")
        self.B = QtWidgets.QLabel(Dialog)
        self.B.setObjectName("B")
        self.gridLayout.addWidget(self.B, 0, 0, 1, 1)
        self.A_val = QtWidgets.QLineEdit(Dialog)
        self.A_val.setObjectName("A_val")
        self.gridLayout.addWidget(self.A_val, 0, 1, 1, 1)
        self.A = QtWidgets.QLabel(Dialog)
        self.A.setObjectName("A")
        self.gridLayout.addWidget(self.A, 1, 0, 1, 1)
        self.B_val = QtWidgets.QLineEdit(Dialog)
        self.B_val.setObjectName("B_val")
        self.gridLayout.addWidget(self.B_val, 1, 1, 1, 1)
        self.Zerocheck = QtWidgets.QCheckBox(Dialog)
        self.Zerocheck.setObjectName("Zerocheck")
        self.gridLayout.addWidget(self.Zerocheck, 1, 2, 1, 1)
        self.math = QtWidgets.QComboBox(Dialog)
        self.math.setObjectName("math")
        self.gridLayout.addWidget(self.math, 2, 1, 1, 1)
        self.math_else = QtWidgets.QComboBox(Dialog)
        self.math_else.setObjectName("math_else")
        self.gridLayout.addWidget(self.math_else, 3, 1, 1, 1)
        self.Run = QtWidgets.QPushButton(Dialog)
        self.Run.setObjectName("Run")
        self.gridLayout.addWidget(self.Run, 4, 1, 1, 1)
        self.Answer = QtWidgets.QLineEdit(Dialog)
        self.Answer.setReadOnly(False)
        self.Answer.setObjectName("Answer")
        self.gridLayout.addWidget(self.Answer, 5, 1, 1, 1)

        self.retranslateUi(Dialog)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
        self.B.setText(_translate("Dialog", "A: "))
        self.A.setText(_translate("Dialog", "B: "))
        self.Zerocheck.setText(_translate("Dialog", "ZeroCheck"))
        self.Run.setText(_translate("Dialog", "Run"))

example.py

import sys, os
from PyQt5 import QtCore, QtGui, QtWidgets
from example_run_vars import Ui_Dialog  

class example(QtWidgets.QDialog):
    def __init__(self, parent=None):
        # QtGui.QWidget.__init__(self, parent)  # PyQt4
        super(example, self).__init__(parent)  # pyQt5
        self.ui = Ui_Dialog() 
        self.ui.setupUi(self)
        self.ui.retranslateUi(self)


        self.ui.math.addItem('Add')
        self.ui.math.addItem('Substract')
        self.ui.math.addItem('Multiply')
        self.ui.math.addItem('Divide')
        self.ui.math.addItem('Power')
        self.ui.math.addItem('Sqrt')
        self.ui.math.activated[str].connect(self.dosomething)

        self.ui.math_else.addItem('math function x')
        self.ui.math_else.activated[str].connect(self.dosomething)

        self.ui.Zerocheck.setChecked(False)
        self.ui.Zerocheck.clicked.connect( self.dosomething)

        self.ui.Run.clicked.connect(self.calculate)

    def a_changed(self):
        pass

    def b_changed(self):
        pass

    def calculate(self):
        # return value in Answer text box
        pass

    def dosomething(self):
        # arbritary thing i realy don't know if i need it...
        pass

if __name__ == "__main__":
    import sys
app = QtWidgets.QApplication(sys.argv)
exampleDialog = QtWidgets.QDialog() 
examplepanel = example()
examplepanel.show()
sys.exit(app.exec_())

这个想法是,当我按下脚本中的运行按钮时,它会在文本框中给出答案。关键是我不知道返回答案的最简单(或编程上最好的)方法是什么。

我知道有两个或树选项:

  1. 每个复选框/组合框/文本框都会执行一些操作并将其放在某处,然后计算按钮会读出此信息。
  2. 计算时,读出所有复选框/组合框/文本框并将其添加到函数中。
  3. 这两者的结合。

处理这种情况的最佳方法是什么,为什么?

【问题讨论】:

    标签: python python-3.x pyqt pyqt5


    【解决方案1】:

    数据已经存储在小部件中,因此制作另一个副本效率低下。此外,您需要为每个单独的小部件设置处理程序,这不必要地复杂。一般来说,最好在进行计算时从小部件中收集所有信息。

    在您的示例中,我建议您将calculate 插槽连接到运行按钮,但摆脱所有其他信号/插槽。然后,您应该为您需要的所有数学运算创建函数。这些函数中的每一个必须有两个参数,它们将从行编辑中获取 A/B 值。为此,您可以使用 operator module 中的一些函数,或者自己编写:

    def add_func(a, b):
        return a + b
    

    然后您可以将这些函数直接链接到组合框项,如下所示:

        self.ui.math.addItem('Add', add_func)
        self.ui.math.addItem('Substract', sub_func)
        self.ui.math.addItem('Multiply', mult_func)
    

    设置好之后,calculate 插槽将如下所示:

        def calculate(self):
            a = float(self.ui.A_val.text())
            b = float(self.ui.B_val.text())
            # get the linked function from the combo-box
            func = self.ui.math.currentData()
            # calculate the answer
            answer = func(a, b)
            # show the new answer
            self.ui.Answer.setText(str(answer))
    

    以这种方式做事可以很容易地添加、删除或重新排序组合框中的功能(即calculate 插槽永远不必更改)。

    【讨论】:

      猜你喜欢
      • 2011-10-12
      • 2020-09-21
      • 1970-01-01
      • 2023-03-07
      • 2020-06-05
      • 1970-01-01
      • 2021-12-04
      • 2012-04-04
      • 2020-09-07
      相关资源
      最近更新 更多