本文是对Python Qt GUI快速编程的第6章的例子MainWindow改写成python3+PyQt5的编码。改动中,本人发现了不少的坑要改动,下文大概列出一些需要更改的重点,并且附上改动后的代码,代码在Python3.5+PyQt5.7的环境下运行并测试正常。请大家参考学习。
此实例有以下程序:
/home/yrd/eric_workspace/charter6/Ui_newimagedlg.py
/home/yrd/eric_workspace/charter6/newimagedlg.py
/home/yrd/eric_workspace/charter6/helpform.py
/home/yrd/eric_workspace/charter6/resizedlg.py
/home/yrd/eric_workspace/charter6/mainwindow.py
资源文件:
/home/yrd/eric_workspace/charter6/resources.qrc
/home/yrd/eric_workspace/charter6/images
/home/yrd/eric_workspace/charter6/help
可在网路上寻找作者这本书的的代码资源获得资源文件。
重点内容:
1,因为settings.value(“RecentFiles”)本身就是list类型,故
self.recentFiles = settings.value(“RecentFiles”).toStringList()
改动为
self.recentFiles=settings.value(“RecentFiles”)
2,类型转换问题
self.restoreGeometry(
settings.value("MainWindow/Geometry").toByteArray())
self.restoreState(settings.value("MainWindow/State").toByteArray())
改动为
self.restoreGeometry(
QByteArray(settings.value("MainWindow/Geometry")))
self.restoreState(QByteArray(settings.value("MainWindow/State")))
3,引入库的问题,有很多,只列一个例子:
from PyQt5.QtPrintSupport import QPrinter,QPrintDialog
4,实例中的坑,QFileDialog.getSaveFileName和QFileDialog.getOpenFileName所返回的结果是一个tupple。第一为文件名,第二个为文件类型。
fname,tpye = QFileDialog.getSaveFileName(self,
"Image Changer - Save Image", fname,
"Image files ({0})".format(" ".join(formats)))
fname,tpye = QFileDialog.getOpenFileName(self,
"Image Changer - Choose Image", dir,
"Image files ({0})".format(" ".join(formats)))
5,PyQt5开发中应该以python的字符串类型取代Qstring类型。self.recentFiles是list类型,故用append或insert而非prepend。
def addRecentFile(self, fname):
if fname is None:
return
if not self.recentFiles.contains(fname):
self.recentFiles.prepend(QString(fname))
while self.recentFiles.count() > 9:
self.recentFiles.takeLast()
改成
def addRecentFile(self, fname):
if fname is None:
return
if fname not in self.recentFiles:
self.recentFiles.insert(0,fname)
while len(self.recentFiles) > 9:
self.recentFiles.pop()
6,信号槽的问题,现举个例子:
self.connect(action, SIGNAL(“triggered()”),self.loadFile)
改成
action.triggered[bool].connect(self.loadFile)
槽self.loadFile根据实际情况也做了些变动。
需要通过pyrcc5将resources.qrc转换成py文件,并在主程序引入。
pyrcc5 -o resources_rc.py resources.qrc
/home/yrd/eric_workspace/charter6/resources.qrc
<!DOCTYPE RCC><RCC version="1.0">
<qresource>
<file alias="filenew.png">images/filenew.png</file>
<file alias="fileopen.png">images/fileopen.png</file>
<file alias="filesave.png">images/filesave.png</file>
<file alias="filesaveas.png">images/filesaveas.png</file>
<file alias="fileprint.png">images/fileprint.png</file>
<file alias="filequit.png">images/filequit.png</file>
<file alias="editinvert.png">images/editinvert.png</file>
<file alias="editswap.png">images/editswap.png</file>
<file alias="editzoom.png">images/editzoom.png</file>
<file alias="editmirror.png">images/editmirror.png</file>
<file alias="editunmirror.png">images/editunmirror.png</file>
<file alias="editmirrorhoriz.png">images/editmirrorhoriz.png</file>
<file alias="editmirrorvert.png">images/editmirrorvert.png</file>
<file alias="back.png">images/back.png</file>
<file alias="home.png">images/home.png</file>
<file alias="icon.png">images/icon.png</file>
<file>help/editmenu.html</file>
<file>help/filemenu.html</file>
<file>help/index.html</file>
</qresource>
</RCC>
/home/yrd/eric_workspace/charter6/Ui_newimagedlg.py
# -*- coding: utf-8 -*-
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_NewImageDlg(object):
def setupUi(self, NewImageDlg):
NewImageDlg.setObjectName("NewImageDlg")
NewImageDlg.resize(287, 214)
self.gridlayout = QtWidgets.QGridLayout(NewImageDlg)
self.gridlayout.setContentsMargins(9, 9, 9, 9)
self.gridlayout.setSpacing(6)
self.gridlayout.setObjectName("gridlayout")
self.buttonBox = QtWidgets.QDialogButtonBox(NewImageDlg)
self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Ok)
self.buttonBox.setObjectName("buttonBox")
self.gridlayout.addWidget(self.buttonBox, 5, 1, 1, 2)
spacerItem = QtWidgets.QSpacerItem(269, 16, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
self.gridlayout.addItem(spacerItem, 4, 0, 1, 3)
self.colorLabel = QtWidgets.QLabel(NewImageDlg)
self.colorLabel.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.colorLabel.setFrameShadow(QtWidgets.QFrame.Raised)
self.colorLabel.setText("")
self.colorLabel.setScaledContents(True)
self.colorLabel.setObjectName("colorLabel")
self.gridlayout.addWidget(self.colorLabel, 3, 1, 1, 1)
self.label_3 = QtWidgets.QLabel(NewImageDlg)
self.label_3.setObjectName("label_3")
self.gridlayout.addWidget(self.label_3, 3, 0, 1, 1)
self.colorButton = QtWidgets.QPushButton(NewImageDlg)
self.colorButton.setObjectName("colorButton")
self.gridlayout.addWidget(self.colorButton, 3, 2, 1, 1)
self.brushComboBox = QtWidgets.QComboBox(NewImageDlg)
self.brushComboBox.setObjectName("brushComboBox"