python教程詳解PyQt-Designer生成的UI代碼的裝配【轉載】

本文轉自:http://www.52ij.com/jishu/432.html,轉載請保留連接html

 

以前說了一下PyQt-Designer生成UI文件轉爲py文件的方法.波哥試了一下,在裝配到本身工程的時候卡住了.我那篇筆記最後也說了,要想用,還有點須要改動的.今天趁自測項目的空閒,寫一下.java

先隨便作一個UI,這裏我直接拖了一個日曆控件過來.app

 

日曆控件

 

生成py代碼,以前說過的.函數

 

生成py代碼

 

 

生成py代碼圖2

 

新建一個工程.新建一個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文件裏,寫入以下代碼.

 

自動生成的那個__init__.py文件裏,寫入以下代碼.

 

第一句是建立了一個PyQt封裝的QApplication對象,建立的時候,把系統參數傳進去了.顧名思義,這一句建立了一個應用程序對象

第二句是建立一個咱們生成的那個窗口

第三句是顯示窗口

第四句是把應用程序對象的exec_()方法的返回值傳給sys.exit().當點擊關閉窗口的時候,exec_()方法會給sys.exit()一個返回值,讓它關閉程序

這裏多說一句,上面的分析可能有不妥的地方,再深刻學習以後,回過來看的時候會改.

另外,寫完第四點,我靈光一閃,以爲app.exec_()這個方法,應該是一個阻塞方法,它維持着整個程序的運行,當接收到退出操做的時候,纔會返回一個值,而後sys.exit()接到返回值讓整個程序退出.

原來這就是我一直在想的,pyqt沒有tkinter裏的.mainloop()相似方法,怎麼讓程序一直跑起來的呢.原來藏這麼深...

我換了好幾個UI,作了好幾個小工具,因此,上面的步驟重複了好幾回,可是在寫前兩遍的時候,我並無想這麼多,只是以爲這樣能跑起來.知道今天,再一次嘗試,纔有一點點深刻的體會.因此,多用,多思考真的很重要啊...

在這個文件上右鍵run一下,跑起來了...

 

在這個文件上右鍵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())

相關文章
相關標籤/搜索