使用PyQt开发程序时如何从python代码中载入界面文件(*.ui或*.qml):
一,载入*.ui文件:
载入*.ui文件有两种方法:
1.使用pyuic工具将*.ui文件转换成*.py文件(命令格式是python /usr/lib/python2.7/dist-packages/PyQt4/uic/pyuic.py -o [name].py [name].ui,一般默认设置都是这个,如果你的pyuic.py文件路径不是这个请自己修改),然后在需要显示界面的*.py文件中导入该文件,一般自动生成的类名叫做Ui_[fileName],然后你就可以在程序中使用该ui文件了.这种方法优点是载入界面速度快,缺点是需要手动使用pyuic工具更新界面文件,有时候会忘记更新.
示例:
1.1:直接继承生成的界面类,推荐这种,可以直接访问ui中的各种控件,就像直接在__init__函数中用代码创建的一样.
注意ui文件中的顶层类必须和自己的类所继承的基类是同一个类,比如下面的uiFileName.ui文件中的顶层类是QMainWindow,那customWindow类也必须继承自QMainWindow,否则会提示一些函数未定义.
from [uiFileName] import Ui_[className]
class customWindow(PyQt4.QtGui.QMainWindow, Ui_[className]) #多重继承
def __init__(self, parent=None):
super(customWindow, self).__init__(parent)
self.setupUi(self)
self.customLabel.setText('visit widget directly') #访问ui文件中定义的控件
1.2:在自己的类中创建生成的界面类,访问ui中的控件需要通过变量.
from [uiFileName] import Ui_[className]
class customWindow(PyQt4.QtGui.QMainWindow) #只继承一个基类
def __init__(self, parent=None):
super(customWindow, self).__init__(parent)
self.ui = Ui_[className]() #创建一个类
self.ui.setupUi(self)
self.ui.customLabel.setText('visit widget by a variable') #访问ui文件中定义的控件
2.直接使用*.ui文件,在需要显示界面的*.py文件中导入PyQt4.uic,然后在你自己的界面类中加入self.ui = PyQt4.uic.loadUi('[path of *.ui]', self),之后你就可以通过self.ui.[objectName]变量访问该ui文件中的控件了,loadUi这个函数返回的是一个widget类,如果你不使用类的方式调用,你也可以直接show它.这种方法的优点是省去了手动编译*.ui文件的过程,省事,缺点是程序在载入界面的时候稍慢,特别是界面文件内容比较多比较复杂的时候.
示例:
2.1:面向对象式编程
import PyQt4.uic
class customWindow(PyQt4.QtGui.QMainWindow)
def __init__(self, parent=None):
super(customWindow, self).__init__(parent)
self.ui = PyQt4.uic.loadUi('mainwindow.ui', self)
self.ui.customLabel.setText('visit widget by a variable')
2.2:普通方式编程
import PyQt4.uic
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
mWindow = PyQt4.uic.loadUi('mainwindow.ui')
mWindow.customLabel.setText('visit widget by a variable')
mWindow.show()
exit(app.exec())
更详细的说明在PyQt Reference Guide里,在ubuntu中安装该文档(名字是python-qt4-doc)后即可在/usr/share/doc下找到同名目录,其中包括PyQt4的示例程序和说明文档.
二,载入*.qml文件:
在需要显示界面的*.py文件中可以直接当做普通文件从存储目录载入,无需额外操作,以下是例子:
from PyQt4 import QtDeclarative
view = QtDeclarative.QDeclarativeView() #定义一个qml view.
view.rootContext().setContextProperty('window', view) #可以将一个python变量传入qml以便于python和qml的数据交互,这里传入的是view本身,在qml文件里使用window来引用view.
view.setSource(QtCore.QUrl('/qmls/main.qml')) #指定qml文件路径
view.setResizeMode(QtDeclarative.QDeclarativeView.SizeRootObjectToView) #使用qml文件内的尺寸定义作为默认显示尺寸
view.show()
注意:如果使用了Qt资源文件(*.qrc),那么编译前需要先使用pyrcc工具将*.qrc文件转换成*.py文件(命令格式是pyrcc4 -o [name].py [name].qrc),然后在使用该资源文件的*.py文件中导入这个转换后的*.py,即import [fileName],然后上面例子中的setSource可以改成这样:view.setSource(QtCore.QUrl('qrc:/qmls/main.qml'))