Python Qt GUI快速编程-第五章的例子Numbers的python3+pytq5+Qt Designer实现

本文是本人用python3+pytq5+Qt Designer实现python3 Qt GUI快速编程-第五章的例子Numbers,请大家参考。
注:
1,numberformatdlg2.py的self.setAttribute(Qt.WA_DeleteOnClose),关闭dialog就删除了dialog,防止内存溢出。
2,self.decimalMarkerEdit.setInputMask(“X”) #方法可以使Edit控件只允许输入自定义的格式字符串,inputMask参数设置格式化字符串的掩码
3,三个被调用的dialog的第一和第三个,关闭dialog只是隐藏,而第二个则是关闭则删除dialog。
4,第三个dialog采用了传递callback函数。
5,本例共有9个文件:
/home/yrd/eric_workspace/Chapter4_Form/Ui_numberformatdlg1.py
/home/yrd/eric_workspace/Chapter4_Form/Ui_numberformatdlg2.py
/home/yrd/eric_workspace/Chapter4_Form/Ui_numberformatdlg3.py
/home/yrd/eric_workspace/Chapter4_Form/numberformatdlg1.py
/home/yrd/eric_workspace/Chapter4_Form/numberformatdlg2.py
/home/yrd/eric_workspace/Chapter4_Form/numberformatdlg3.py
/home/yrd/eric_workspace/Chapter4_Form/Ui_Form.py
/home/yrd/eric_workspace/Chapter4_Form/Form.py
而Form.py为主程序,界面与逻辑分离


/home/yrd/eric_workspace/Chapter4_Form/Ui_numberformatdlg1.py

# -*- coding: utf-8 -*-
from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_NumberFormatDlg(object):
    def setupUi(self, NumberFormatDlg):
        NumberFormatDlg.setObjectName("NumberFormatDlg")
        NumberFormatDlg.resize(367, 178)
        NumberFormatDlg.setSizeGripEnabled(True)
        self.widget = QtWidgets.QWidget(NumberFormatDlg)
        self.widget.setGeometry(QtCore.QRect(10, 10, 341, 161))
        self.widget.setObjectName("widget")
        self.formLayout = QtWidgets.QFormLayout(self.widget)
        self.formLayout.setContentsMargins(3, 3, 3, 3)
        self.formLayout.setObjectName("formLayout")
        self.thousandsLabel = QtWidgets.QLabel(self.widget)
        self.thousandsLabel.setObjectName("thousandsLabel")
        self.formLayout.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.thousandsLabel)
        self.thousandsEdit = QtWidgets.QLineEdit(self.widget)
        self.thousandsEdit.setObjectName("thousandsEdit")
        self.formLayout.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.thousandsEdit)
        self.decimalMarkerLabel = QtWidgets.QLabel(self.widget)
        self.decimalMarkerLabel.setObjectName("decimalMarkerLabel")
        self.formLayout.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.decimalMarkerLabel)
        self.decimalMarkerEdit = QtWidgets.QLineEdit(self.widget)
        self.decimalMarkerEdit.setObjectName("decimalMarkerEdit")
        self.formLayout.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.decimalMarkerEdit)
        self.decimalPlacesLabel = QtWidgets.QLabel(self.widget)
        self.decimalPlacesLabel.setObjectName("decimalPlacesLabel")
        self.formLayout.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.decimalPlacesLabel)
        self.decimalPlacesSpinBox = QtWidgets.QSpinBox(self.widget)
        self.decimalPlacesSpinBox.setObjectName("decimalPlacesSpinBox")
        self.formLayout.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.decimalPlacesSpinBox)
        self.redNegativesCheckBox = QtWidgets.QCheckBox(self.widget)
        self.redNegativesCheckBox.setObjectName("redNegativesCheckBox")
        self.formLayout.setWidget(3, QtWidgets.QFormLayout.LabelRole, self.redNegativesCheckBox)
        self.buttonBox = QtWidgets.QDialogButtonBox(self.widget)
        self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Ok)
        self.buttonBox.setObjectName("buttonBox")
        self.formLayout.setWidget(4, QtWidgets.QFormLayout.FieldRole, self.buttonBox)
        self.thousandsLabel.setBuddy(self.thousandsEdit)
        self.decimalMarkerLabel.setBuddy(self.decimalMarkerEdit)
        self.decimalPlacesLabel.setBuddy(self.decimalPlacesSpinBox)

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

    def retranslateUi(self, NumberFormatDlg):
        _translate = QtCore.QCoreApplication.translate
        NumberFormatDlg.setWindowTitle(_translate("NumberFormatDlg", "Dialog"))
        self.thousandsLabel.setText(_translate("NumberFormatDlg", "&Thousands separator"))
        self.decimalMarkerLabel.setText(_translate("NumberFormatDlg", "Decimal &marker"))
        self.decimalPlacesLabel.setText(_translate("NumberFormatDlg", "&Decimal places"))
        self.redNegativesCheckBox.setText(_translate("NumberFormatDlg", "&Red negative numbers"))

/home/yrd/eric_workspace/Chapter4_Form/Ui_numberformatdlg2.py

# -*- coding: utf-8 -*-
from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_NumberFormatDlg(object):
    def setupUi(self, NumberFormatDlg):
        NumberFormatDlg.setObjectName("NumberFormatDlg")
        NumberFormatDlg.resize(367, 178)
        NumberFormatDlg.setSizeGripEnabled(True)
        self.layoutWidget = QtWidgets.QWidget(NumberFormatDlg)
        self.layoutWidget.setGeometry(QtCore.QRect(10, 10, 344, 161))
        self.layoutWidget.setObjectName("layoutWidget")
        self.formLayout = QtWidgets.QFormLayout(self.layoutWidget)
        self.formLayout.setContentsMargins(3, 3, 3, 3)
        self.formLayout.setObjectName("formLayout")
        self.thousandsLabel = QtWidgets.QLabel(self.layoutWidget)
        self.thousandsLabel.setObjectName("thousandsLabel")
        self.formLayout.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.thousandsLabel)
        self.thousandsEdit = QtWidgets.QLineEdit(self.layoutWidget)
        self.thousandsEdit.setObjectName("thousandsEdit")
        self.formLayout.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.thousandsEdit)
        self.decimalMarkerLabel = QtWidgets.QLabel(self.layoutWidget)
        self.decimalMarkerLabel.setObjectName("decimalMarkerLabel")
        self.formLayout.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.decimalMarkerLabel)
        self.decimalMarkerEdit = QtWidgets.QLineEdit(self.layoutWidget)
        self.decimalMarkerEdit.setObjectName("decimalMarkerEdit")
        self.formLayout.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.decimalMarkerEdit)
        self.decimalPlacesLabel = QtWidgets.QLabel(self.layoutWidget)
        self.decimalPlacesLabel.setObjectName("decimalPlacesLabel")
        self.formLayout.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.decimalPlacesLabel)
        self.decimalPlacesSpinBox = QtWidgets.QSpinBox(self.layoutWidget)
        self.decimalPlacesSpinBox.setObjectName("decimalPlacesSpinBox")
        self.formLayout.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.decimalPlacesSpinBox)
        self.redNegativesCheckBox = QtWidgets.QCheckBox(self.layoutWidget)
        self.redNegativesCheckBox.setObjectName("redNegativesCheckBox")
        self.formLayout.setWidget(3, QtWidgets.QFormLayout.LabelRole, self.redNegativesCheckBox)
        self.buttonBox = QtWidgets.QDialogButtonBox(self.layoutWidget)
        self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Apply|QtWidgets.QDialogButtonBox.Close)
        self.buttonBox.setObjectName("buttonBox")
        self.formLayout.setWidget(4, QtWidgets.QFormLayout.FieldRole, self.buttonBox)
        self.thousandsLabel.setBuddy(self.thousandsEdit)
        self.decimalMarkerLabel.setBuddy(self.decimalMarkerEdit)
        self.decimalPlacesLabel.setBuddy(self.decimalPlacesSpinBox)

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

    def retranslateUi(self, NumberFormatDlg):
        _translate = QtCore.QCoreApplication.translate
        NumberFormatDlg.setWindowTitle(_translate("NumberFormatDlg", "Dialog"))
        self.thousandsLabel.setText(_translate("NumberFormatDlg", "&Thousands separator"))
        self.decimalMarkerLabel.setText(_translate("NumberFormatDlg", "Decimal &marker"))
        self.decimalPlacesLabel.setText(_translate("NumberFormatDlg", "&Decimal places"))
        self.redNegativesCheckBox.setText(_translate("NumberFormatDlg", "&Red negative numbers"))

/home/yrd/eric_workspace/Chapter4_Form/Ui_numberformatdlg3.py

# -*- coding: utf-8 -*-
from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_NumberFormatDlg(object):
    def setupUi(self, NumberFormatDlg):
        NumberFormatDlg.setObjectName("NumberFormatDlg")
        NumberFormatDlg.resize(367, 158)
        NumberFormatDlg.setSizeGripEnabled(True)
        self.layoutWidget = QtWidgets.QWidget(NumberFormatDlg)
        self.layoutWidget.setGeometry(QtCore.QRect(10, 10, 341, 141))
        self.layoutWidget.setObjectName("layoutWidget")
        self.formLayout = QtWidgets.QFormLayout(self.layoutWidget)
        self.formLayout.setContentsMargins(3, 3, 3, 3)
        self.formLayout.setObjectName("formLayout")
        self.thousandsLabel = QtWidgets.QLabel(self.layoutWidget)
        self.thousandsLabel.setObjectName("thousandsLabel")
        self.formLayout.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.thousandsLabel)
        self.thousandsEdit = QtWidgets.QLineEdit(self.layoutWidget)
        self.thousandsEdit.setObjectName("thousandsEdit")
        self.formLayout.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.thousandsEdit)
        self.decimalMarkerLabel = QtWidgets.QLabel(self.layoutWidget)
        self.decimalMarkerLabel.setObjectName("decimalMarkerLabel")
        self.formLayout.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.decimalMarkerLabel)
        self.decimalMarkerEdit = QtWidgets.QLineEdit(self.layoutWidget)
        self.decimalMarkerEdit.setObjectName("decimalMarkerEdit")
        self.formLayout.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.decimalMarkerEdit)
        self.decimalPlacesLabel = QtWidgets.QLabel(self.layoutWidget)
        self.decimalPlacesLabel.setObjectName("decimalPlacesLabel")
        self.formLayout.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.decimalPlacesLabel)
        self.decimalPlacesSpinBox = QtWidgets.QSpinBox(self.layoutWidget)
        self.decimalPlacesSpinBox.setObjectName("decimalPlacesSpinBox")
        self.formLayout.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.decimalPlacesSpinBox)
        self.redNegativesCheckBox = QtWidgets.QCheckBox(self.layoutWidget)
        self.redNegativesCheckBox.setObjectName("redNegativesCheckBox")
        self.formLayout.setWidget(3, QtWidgets.QFormLayout.LabelRole, self.redNegativesCheckBox)
        self.thousandsLabel.setBuddy(self.thousandsEdit)
        self.decimalMarkerLabel.setBuddy(self.decimalMarkerEdit)
        self.decimalPlacesLabel.setBuddy(self.decimalPlacesSpinBox)

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

    def retranslateUi(self, NumberFormatDlg):
        _translate = QtCore.QCoreApplication.translate
        NumberFormatDlg.setWindowTitle(_translate("NumberFormatDlg", "Dialog"))
        self.thousandsLabel.setText(_translate("NumberFormatDlg", "&Thousands separator"))
        self.decimalMarkerLabel.setText(_translate("NumberFormatDlg", "Decimal &marker"))
        self.decimalPlacesLabel.setText(_translate("NumberFormatDlg", "&Decimal places"))
        self.redNegativesCheckBox.setText(_translate("NumberFormatDlg", "&Red negative numbers"))

/home/yrd/eric_workspace/Chapter4_Form/numberformatdlg1.py

# -*- coding: utf-8 -*-

"""
Module implementing NumberFormatDlg.
"""

from PyQt5.QtCore import pyqtSlot
from PyQt5.QtWidgets import QDialog,QMessageBox,QDialogButtonBox

from Ui_numberformatdlg1 import Ui_NumberFormatDlg


class NumberFormatDlg(QDialog, Ui_NumberFormatDlg):
    """
    Class documentation goes here.
    """
    def __init__(self, format,parent=None):
        """
        Constructor

        @param parent reference to the parent widget
        @type QWidget
        """
        super(NumberFormatDlg, self).__init__(parent)
        self.setupUi(self)


        self.thousandsEdit.setText(format["thousandsseparator"])
        self.decimalMarkerEdit.setText(format["decimalmarker"])
        self.decimalPlacesSpinBox.setRange(0, 6)
        self.decimalPlacesSpinBox.setValue(format["decimalplaces"])
        self.redNegativesCheckBox.setChecked(format["rednegatives"])

        self.format = format.copy()    

        self.buttonBox.accepted.connect(self.accept)
        self.buttonBox.rejected.connect(self.reject)


        self.setWindowTitle("Set Number Format (Modal)")        


    def accept(self):
        class ThousandsError(Exception): pass
        class DecimalError(Exception): pass
        Punctuation = frozenset(" ,;:.")

        thousands = str(self.thousandsEdit.text())
        decimal = str(self.decimalMarkerEdit.text())
        try:
            if len(decimal) == 0:
                raise DecimalError("The decimal marker may not be "
                                   "empty.")
            if len(thousands) > 1:
                raise ThousandsError("The thousands separator may "
                                     "only be empty or one character.")
            if len(decimal) > 1:
                raise DecimalError("The decimal marker must be "
                                   "one character.")
            if thousands == decimal:
                raise ThousandsError("The thousands separator and "
                              "the decimal marker must be different.")
            if thousands and thousands not in Punctuation:
                raise ThousandsError("The thousands separator must "
                                     "be a punctuation symbol.")
            if decimal not in Punctuation:
                raise DecimalError("The decimal marker must be a "
                                   "punctuation symbol.")
        except ThousandsError as e:
            QMessageBox.warning(self, "Thousands Separator Error",
                                str(e))
            self.thousandsEdit.selectAll()
            self.thousandsEdit.setFocus()
            return
        except DecimalError as e:
            QMessageBox.warning(self, "Decimal Marker Error", str(e))
            self.decimalMarkerEdit.selectAll()
            self.decimalMarkerEdit.setFocus()
            return

        self.format["thousandsseparator"] = thousands
        self.format["decimalmarker"] = decimal
        self.format["decimalplaces"] = (
                self.decimalPlacesSpinBox.value())
        self.format["rednegatives"] = (
                self.redNegativesCheckBox.isChecked())
        QDialog.accept(self)


    def numberFormat(self):
        return self.format

/home/yrd/eric_workspace/Chapter4_Form/numberformatdlg2.py

# -*- coding: utf-8 -*-

"""
Module implementing NumberFormatDlg.
"""

from PyQt5.QtCore import pyqtSlot,Qt,QRegExp,pyqtSignal
from PyQt5.QtWidgets import QDialog,QDialogButtonBox,QMessageBox
from PyQt5.QtGui import QRegExpValidator

from Ui_numberformatdlg2 import Ui_NumberFormatDlg


class NumberFormatDlg(QDialog, Ui_NumberFormatDlg):
    """
    Class documentation goes here.
    """
    changed = pyqtSignal()
    def __init__(self,format,parent=None):
        """
        Constructor

        @param parent reference to the parent widget
        @type QWidget
        """
        super(NumberFormatDlg, self).__init__(parent)
        self.setupUi(self)
        self.setAttribute(Qt.WA_DeleteOnClose)

        punctuationRe = QRegExp(r"[ ,;:.]")
        self.thousandsEdit.setText(format["thousandsseparator"])
        self.thousandsEdit.setMaxLength(1)
        self.thousandsEdit.setValidator(
            QRegExpValidator(punctuationRe, self))        

        self.decimalMarkerEdit.setText(format["decimalmarker"])        
        self.decimalMarkerEdit.setMaxLength(1)
        self.decimalMarkerEdit.setValidator(
            QRegExpValidator(punctuationRe, self))
        self.decimalMarkerEdit.setInputMask("X")  #方法可以使Edit控件只允许输入自定义的格式字符串,inputMask参数设置格式化字符串的掩码      

        self.decimalPlacesSpinBox.setRange(0, 6)
        self.decimalPlacesSpinBox.setValue(format["decimalplaces"])        

        self.redNegativesCheckBox.setChecked(format["rednegatives"])        

        self.format = format

        self.buttonBox.button(QDialogButtonBox.Apply).clicked.connect(self.apply)
        self.buttonBox.button(QDialogButtonBox.Close).clicked.connect(self.reject)
        self.setWindowTitle("Set Number Format (Modeless)")        

    def apply(self):
        thousands = str(self.thousandsEdit.text())
        decimal = str(self.decimalMarkerEdit.text())
        if thousands == decimal:
            QMessageBox.warning(self, "Format Error",
                    "The thousands separator and the decimal marker "
                    "must be different.")
            self.thousandsEdit.selectAll()
            self.thousandsEdit.setFocus()
            return
        if len(decimal) == 0:
            QMessageBox.warning(self, "Format Error",
                    "The decimal marker may not be empty.")
            self.decimalMarkerEdit.selectAll()
            self.decimalMarkerEdit.setFocus()
            return

        self.format["thousandsseparator"] = thousands
        self.format["decimalmarker"] = decimal
        self.format["decimalplaces"] = (
                self.decimalPlacesSpinBox.value())
        self.format["rednegatives"] = (
                self.redNegativesCheckBox.isChecked())
        self.changed.emit()  

/home/yrd/eric_workspace/Chapter4_Form/numberformatdlg3.py

# -*- coding: utf-8 -*-

"""
Module implementing NumberFormatDlg.
"""

from PyQt5.QtCore import pyqtSlot,Qt,QRegExp
from PyQt5.QtWidgets import QDialog,QDialogButtonBox,QMessageBox
from PyQt5.QtGui import QRegExpValidator
from Ui_numberformatdlg3 import Ui_NumberFormatDlg


class NumberFormatDlg(QDialog, Ui_NumberFormatDlg):
    """
    Class documentation goes here.
    """
    def __init__(self, format,callback,parent=None):
        """
        Constructor

        @param parent reference to the parent widget
        @type QWidget
        """
        super(NumberFormatDlg, self).__init__(parent)
        self.setupUi(self)

        punctuationRe = QRegExp(r"[ ,;:.]")
        self.thousandsEdit.setText(format["thousandsseparator"])
        self.thousandsEdit.setMaxLength(1)
        self.thousandsEdit.setValidator(
            QRegExpValidator(punctuationRe, self))        

        self.decimalMarkerEdit.setText(format["decimalmarker"])        
        self.decimalMarkerEdit.setMaxLength(1)
        self.decimalMarkerEdit.setValidator(
            QRegExpValidator(punctuationRe, self))
        self.decimalMarkerEdit.setInputMask("X")  #方法可以使Edit控件只允许输入自定义的格式字符串,inputMask参数设置格式化字符串的掩码      

        self.decimalPlacesSpinBox.setRange(0, 6)
        self.decimalPlacesSpinBox.setValue(format["decimalplaces"])        

        self.redNegativesCheckBox.setChecked(format["rednegatives"])     

        self.format = format
        self.callback = callback

        self.thousandsEdit.textEdited.connect(self.checkAndFix)
        self.decimalMarkerEdit.textEdited.connect(self.checkAndFix)
        self.decimalPlacesSpinBox.valueChanged.connect(self.apply)
        self.redNegativesCheckBox.toggled.connect(self.apply)
        self.setWindowTitle("Set Number Format ('Live')")        


    def checkAndFix(self):
        thousands = str(self.thousandsEdit.text())
        decimal = str(self.decimalMarkerEdit.text())
        if thousands == decimal:
            self.thousandsEdit.clear()
            self.thousandsEdit.setFocus()
        if len(decimal) == 0:
            self.decimalMarkerEdit.setText(".")
            self.decimalMarkerEdit.selectAll()
            self.decimalMarkerEdit.setFocus()
        self.apply()


    def apply(self):
        self.format["thousandsseparator"] = (
                str(self.thousandsEdit.text()))
        self.format["decimalmarker"] = (
                str(self.decimalMarkerEdit.text()))
        self.format["decimalplaces"] = (
                self.decimalPlacesSpinBox.value())
        self.format["rednegatives"] = (
                self.redNegativesCheckBox.isChecked())
        self.callback()

/home/yrd/eric_workspace/Chapter4_Form/Ui_Form.py

# -*- coding: utf-8 -*-
from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(553, 358)
        Form.setSizeGripEnabled(True)
        self.layoutWidget = QtWidgets.QWidget(Form)
        self.layoutWidget.setGeometry(QtCore.QRect(11, 11, 531, 341))
        self.layoutWidget.setObjectName("layoutWidget")
        self.horizontalLayout = QtWidgets.QHBoxLayout(self.layoutWidget)
        self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.table = QtWidgets.QTableWidget(self.layoutWidget)
        self.table.setObjectName("table")
        self.table.setColumnCount(0)
        self.table.setRowCount(0)
        self.horizontalLayout.addWidget(self.table)
        self.verticalLayout = QtWidgets.QVBoxLayout()
        self.verticalLayout.setObjectName("verticalLayout")
        self.formatButton1 = QtWidgets.QPushButton(self.layoutWidget)
        self.formatButton1.setObjectName("formatButton1")
        self.verticalLayout.addWidget(self.formatButton1)
        self.formatButton2 = QtWidgets.QPushButton(self.layoutWidget)
        self.formatButton2.setObjectName("formatButton2")
        self.verticalLayout.addWidget(self.formatButton2)
        self.formatButton3 = QtWidgets.QPushButton(self.layoutWidget)
        self.formatButton3.setObjectName("formatButton3")
        self.verticalLayout.addWidget(self.formatButton3)
        spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
        self.verticalLayout.addItem(spacerItem)
        self.horizontalLayout.addLayout(self.verticalLayout)

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

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Numbers"))
        self.formatButton1.setText(_translate("Form", "Set Number Format... (&Modal)"))
        self.formatButton2.setText(_translate("Form", "Set Number Format... (Modele&ss)"))
        self.formatButton3.setText(_translate("Form", "Set Number Format... (\'&Live\')"))

/home/yrd/eric_workspace/Chapter4_Form/Form.py

# -*- coding: utf-8 -*-

"""
Module implementing Form.
"""
import math
import random
import string
from PyQt5.QtCore import pyqtSlot,Qt
from PyQt5.QtWidgets import QDialog,QApplication,QTableWidgetItem

from Ui_Form import Ui_Form
import sys
import numberformatdlg1
import numberformatdlg2
import numberformatdlg3

class Form(QDialog, Ui_Form):
    """
    Class documentation goes here.
    """
    X_MAX = 26
    Y_MAX = 60    
    def __init__(self, parent=None):
        """
        Constructor

        @param parent reference to the parent widget
        @type QWidget
        """
        super(Form, self).__init__(parent)
        self.setupUi(self)
        self.numberFormatDlg = None
        self.format = dict(thousandsseparator=",", decimalmarker=".",
                           decimalplaces=2, rednegatives=False)
        self.numbers = {}
        for x in range(self.X_MAX):
            for y in range(self.Y_MAX):
                self.numbers[(x, y)] = (10000 * random.random()) - 5000        
        self.formatButton1.clicked.connect(self.setNumberFormat1)
        self.formatButton2.clicked.connect(self.setNumberFormat2)
        self.formatButton3.clicked.connect(self.setNumberFormat3)

        self.refreshTable()


    def refreshTable(self):
        self.table.clear()
        self.table.setColumnCount(self.X_MAX)
        self.table.setRowCount(self.Y_MAX)
        self.table.setHorizontalHeaderLabels(
                list(string.ascii_uppercase))
        for x in range(self.X_MAX):
            for y in range(self.Y_MAX):
                fraction, whole = math.modf(self.numbers[(x, y)])#返回x的整数部分与小数部分
                sign = "-" if whole < 0 else ""
                whole = "{0}".format(int(math.floor(abs(whole))))#整数部分
                digits = []
                for i, digit in enumerate(reversed(whole)):
                    if i and i % 3 == 0:
                        digits.insert(0, self.format["thousandsseparator"])
                    digits.insert(0, digit)
                if self.format["decimalplaces"]:
                    fraction = "{0:.7f}".format(abs(fraction))
                    fraction = (self.format["decimalmarker"] +
                            fraction[2:self.format["decimalplaces"] + 2])
                else:
                    fraction = ""
                text = "{0}{1}{2}".format(sign, "".join(digits), fraction)
                item = QTableWidgetItem(text)
                item.setTextAlignment(Qt.AlignRight|
                                      Qt.AlignVCenter)
                if sign and self.format["rednegatives"]:
                    item.setBackground(Qt.red) #Qt5 use setBackground
                self.table.setItem(y, x, item)


    def setNumberFormat1(self):
        dialog = numberformatdlg1.NumberFormatDlg(self.format, self)
        if dialog.exec_():
            self.format = dialog.numberFormat()
            self.refreshTable()

    def setNumberFormat2(self):
        dialog = numberformatdlg2.NumberFormatDlg(self.format, self)
        dialog.changed.connect(self.refreshTable)
        dialog.show()

    def setNumberFormat3(self):
        if self.numberFormatDlg is None:
            self.numberFormatDlg = numberformatdlg3.NumberFormatDlg(
                    self.format, self.refreshTable, self)
        self.numberFormatDlg.show()
        self.numberFormatDlg.raise_()
        self.numberFormatDlg.activateWindow()
if __name__ == "__main__":
    app = QApplication(sys.argv)
    dlg=Form()
    dlg.show()
    sys.exit(app.exec_())

运行结果:
这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值