我想知道如何從我用QtDesigner創建的.ui文件生成OOP風格的Python代碼。針對OOP風格的Qt .ui文件的Python代碼生成器?
我想說的是,pyuic4生成的代碼不是OOP風格:小部件不會成爲QtGui類的子類。代碼很難閱讀和擴展。
我想要封裝所有子窗口小部件,佈局和函數的類。
我們來看一個簡單的例子。這個主窗口包含一個滑塊和一個液晶顯示器,並且它們以明顯的方式相連。
首先,這是由pyuic4生成的代碼:
from PyQt4 import QtCore, QtGui
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(268, 186)
self.centralwidget = QtGui.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.gridLayout = QtGui.QGridLayout(self.centralwidget)
self.gridLayout.setObjectName("gridLayout")
self.horizontalSlider = QtGui.QSlider(self.centralwidget)
self.horizontalSlider.setOrientation(QtCore.Qt.Vertical)
self.horizontalSlider.setObjectName("horizontalSlider")
self.gridLayout.addWidget(self.horizontalSlider, 0, 1, 1, 1)
self.lcdNumber = QtGui.QLCDNumber(self.centralwidget)
self.lcdNumber.setObjectName("lcdNumber")
self.gridLayout.addWidget(self.lcdNumber, 0, 2, 1, 1)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtGui.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 268, 25))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtGui.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QObject.connect(self.horizontalSlider, QtCore.SIGNAL("valueChanged(int)"), self.lcdNumber.display)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
MainWindow = QtGui.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
我手動編輯的,以我的風格麼:
from PyQt4 import QtCore, QtGui
class MainWindow(QtGui.QMainWindow):
def __init__(self):
QtGui.QMainWindow.__init__(self)
self.setObjectName("MainWindow")
self.resize(268, 186)
self.centralwidget = QtGui.QWidget(self)
self.centralwidget.setObjectName("centralwidget")
self.gridLayout = QtGui.QGridLayout(self.centralwidget)
self.gridLayout.setObjectName("gridLayout")
self.horizontalSlider = QtGui.QSlider(self.centralwidget)
self.horizontalSlider.setOrientation(QtCore.Qt.Vertical)
self.horizontalSlider.setObjectName("horizontalSlider")
self.gridLayout.addWidget(self.horizontalSlider, 0, 1, 1, 1)
self.lcdNumber = QtGui.QLCDNumber(self.centralwidget)
self.lcdNumber.setObjectName("lcdNumber")
self.gridLayout.addWidget(self.lcdNumber, 0, 2, 1, 1)
self.setCentralWidget(self.centralwidget)
self.menubar = QtGui.QMenuBar(self)
self.menubar.setGeometry(QtCore.QRect(0, 0, 268, 25))
self.menubar.setObjectName("menubar")
self.setMenuBar(self.menubar)
self.statusbar = QtGui.QStatusBar(self)
self.statusbar.setObjectName("statusbar")
self.setStatusBar(self.statusbar)
self.retranslateUi()
QtCore.QObject.connect(self.horizontalSlider, QtCore.SIGNAL("valueChanged(int)"), self.lcdNumber.display)
QtCore.QMetaObject.connectSlotsByName(self)
def retranslateUi(self):
self.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
main_window = MainWindow()
main_window.show()
sys.exit(app.exec_())
這可以由代碼生成器來完成,而不需要枯燥的編輯。我的問題是:是否有這樣的代碼生成器可用?
你應該** **不修改自動生成的文件。 「代碼很難閱讀和擴展。」做**不**保留,因爲你**不**應該觸摸該代碼*在所有*。由'pyuic'產生的輸出意味着被用作父類。在你的情況下,你可以使用'class MainWindow(QMainWindow,Ui_MainWindow):'然後在你的'__init__'中調用'setupUi(self)',這樣就完成了。無需查看生成的代碼。 – Bakuriu
@Bakuriu,謝謝你的回答! :)「MainWindow類(QMainWindow,Ui_MainWindow)'是令人驚訝但非常好的! – user3202179
我不明白爲什麼這是「不是OOP風格」。一個好的面向對象設計規則是贊成構造而不是繼承,這正是這樣做的。當前模式實際上是在Qt4中引入的,與Qt3相反,在Qt3中生成的小部件是子類。有關更多信息,請參閱http://qt-project.org/doc/qt-4.8/porting4-designer.html。 –