本文是本人用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_())
运行结果: