本文轉自:http://www.52ij.com/jishu/432.html,轉載請保留連接html
以前說了一下PyQt-Designer生成UI文件轉爲py文件的方法.波哥試了一下,在裝配到本身工程的時候卡住了.我那篇筆記最後也說了,要想用,還有點須要改動的.今天趁自測項目的空閒,寫一下.java
先隨便作一個UI,這裏我直接拖了一個日曆控件過來.app
生成py代碼,以前說過的.函數
新建一個工程.新建一個src包,會自動生成一個__init__.py.工具
把test.py,就是那個ui生成的代碼拷進來.oop
下面是沒有通過改動的代碼,須要注意的幾個地方,作了標記.學習
框起來的(object)表示這個類繼承自object.這裏修改爲QtGui.QMainWindow.至於緣由,也很簡單.在我作實驗的時候,發現生成的兩個方法ui
setupUi和retranslateUi須要傳入一個參數,就是上圖紅線畫出來的,MainWindow,我就想,不如讓這個類自己繼承自QMainWindow,那麼在調用自動生成的方法來初始化窗口的時候,自須要把它自己,也就是self傳進去便可.this
改動以後的代碼以下,加了一個__init__方法,這個在一下子建立窗口對象的時候會自動調用,相似java的構造器.spa
在__init__裏,先調用了父類QMainWindow的構造方法,而後調用了自動生成的兩個方法,注意,傳的是self,由於他本身已是QMainWindow了.
這裏須要調用super(xxx,yyy).__init__(),實際上是一點點試出來的,一開始按照java的習慣去作,沒有這個調用,結果報錯了,才發現它不會自動調用父類構造方法.
下面,在自動生成的那個__init__.py文件裏,寫入以下代碼.
第一句是建立了一個PyQt封裝的QApplication對象,建立的時候,把系統參數傳進去了.顧名思義,這一句建立了一個應用程序對象
第二句是建立一個咱們生成的那個窗口
第三句是顯示窗口
第四句是把應用程序對象的exec_()方法的返回值傳給sys.exit().當點擊關閉窗口的時候,exec_()方法會給sys.exit()一個返回值,讓它關閉程序
這裏多說一句,上面的分析可能有不妥的地方,再深刻學習以後,回過來看的時候會改.
另外,寫完第四點,我靈光一閃,以爲app.exec_()這個方法,應該是一個阻塞方法,它維持着整個程序的運行,當接收到退出操做的時候,纔會返回一個值,而後sys.exit()接到返回值讓整個程序退出.
原來這就是我一直在想的,pyqt沒有tkinter裏的.mainloop()相似方法,怎麼讓程序一直跑起來的呢.原來藏這麼深...
我換了好幾個UI,作了好幾個小工具,因此,上面的步驟重複了好幾回,可是在寫前兩遍的時候,我並無想這麼多,只是以爲這樣能跑起來.知道今天,再一次嘗試,纔有一點點深刻的體會.因此,多用,多思考真的很重要啊...
在這個文件上右鍵run一下,跑起來了...
代碼貼出來:
src/__init__.py from PyQt4 import QtCore, QtGui import sys import test app=QtGui.QApplication(sys.argv) win=test.Ui_MainWindow() win.show() sys.exit(app.exec_()) src/test.py # -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'D:\Program Files\Python2.7\Lib\site-packages\PyQt4\test.ui' # # Created: Mon Mar 04 13:03:57 2013 # by: PyQt4 UI code generator 4.9.6 # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: def _fromUtf8(s): return s try: _encoding = QtGui.QApplication.UnicodeUTF8 def _translate(context, text, disambig): return QtGui.QApplication.translate(context, text, disambig, _encoding) except AttributeError: def _translate(context, text, disambig): return QtGui.QApplication.translate(context, text, disambig) class Ui_MainWindow(QtGui.QMainWindow): def __init__(self): super(Ui_MainWindow,self).__init__() self.setupUi(self); self.retranslateUi(self) def setupUi(self, MainWindow): MainWindow.setObjectName(_fromUtf8("MainWindow")) MainWindow.resize(440, 200) self.centralwidget = QtGui.QWidget(MainWindow) self.centralwidget.setObjectName(_fromUtf8("centralwidget")) self.calendarWidget = QtGui.QCalendarWidget(self.centralwidget) self.calendarWidget.setGeometry(QtCore.QRect(0, 0, 441, 181)) self.calendarWidget.setObjectName(_fromUtf8("calendarWidget")) MainWindow.setCentralWidget(self.centralwidget) self.statusbar = QtGui.QStatusBar(MainWindow) self.statusbar.setObjectName(_fromUtf8("statusbar")) MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None)) |
又到告終尾,這個界面跑起來了,可是點上去是沒有反應的.怎麼把回調函數(事件處理函數)安上去,這個,下次再寫,涉及到pyqt的信號和槽.
總結:
1. 建立scr 文件夾,將目標ui 文件保存到此目錄,複製"C:\Python27\Lib\site-packages\PyQt4\uic\pyuic.py" 到該目錄,新建transform.bat 文件,在裏面寫上 pyuic.py -o test.py test.ui,雙擊運行此文件產生test.py
2. 打開test.py 修改裏面class 的參數爲QtGui.QMainWindow, 並定義構造函數:
def __init__(self):
self.super(Ui_MainWindow,self).__init__()
self.setupUi(self)
self.retranslateUi(self)
3. 在src 中建立包標誌文件__init__.py, 打開在裏面寫上:
from PyQt4 import QtCore, QtGui
import sys
import test
app = QtCore.QApplication(sys,argv)
win = test.Ui_MainWindow()
win = show()
sys.exit(app_exec())