您的位置:首页 > 编程语言 > Qt开发

PyQt

2015-05-31 22:57 204 查看
PyQt
sf2gis@163.com
2015年4月24日

1 目标:Python和Qt配合使用

2 原理:将Qt的库转化为Python库.

PyQt使用SIP将所有Qt的库转换为对应的Python文件。可以在程序中由Python直接调用。

3 方法:SIP

SIP将C/C++的库转换为Python文件,由其它Python直接调用。专为Pyqt开发,其它场合使用较少。

3.1 SIP:用于C/C++的Python转化库。

目标:将C/C++的库转化为Python的库。

3.1.1安装方法

环境:Win7+VS2010

下载SIP:官网。

配置:使用命令行cd到sip的目录下,

python configure.py --show-platform将显示所有支持的环境。

python configure.py --platform win32-msvc2010使用选定环境编译

编译:使用vc2010的命令提示符cd到sip的目录下,

nmake:make

nmake makefile install:编译 安装。

测试:sip -h 能够正常执行说明安装成功。

参考:http://blog.csdn.net/sunny2038/article/details/7237630

4 方法:PyQt

4.1 目标:将Qt转换为Python

4.2 原理:将所有Qt库的类一一映射为Python的类。使用方法与Qt完全一致。

4.3 方法:

参考: http://www.qaulau.com/books/PyQt4_Tutorial/introduction.html

4.3.1安装:需先安装SIP(参见方法:SIP

下载PyQt并安装。

安装完成后可以直接使用。

4.3.2文档、API参考

安装完成后,在开始菜单中可以看到其类参考及其它相关文档。

4.3.3使用方法:与Qt一致

使用前将Qt的对应库导入工程中。

from PyQt4 importQtGui,QtCore

4.3.4应用程序:QApplication

在此模块中,将搭建程序的入口状态和模块调用。

需要创建QApplication作为Gui的应用对象,并调用exec_()启动消息循环。

示例:

if"__main__"==__name__:

app = QtGui.QApplication(sys.argv)

。。。

sys.exit(app.exec_())

4.3.5QtGui对象:QMainWindow、QWidget

4.3.5.1 组件:QWidget。

在QtGui模块中。

常用控件参考:http://www.qaulau.com/books/PyQt4_Tutorial/widgets.html

示例:参见:创建一个Widget类,具有添加退出按钮,显示对话框和居中显示的功能。

4.3.5.2 主窗口:QMainWindow

在QtGui模块中。包含菜单、工具栏、状态栏等。

示例:

from PyQt4 import QtGui

from PyQt4.QtGui importQStatusBar



classMainWindow(QtGui.QMainWindow):

def __init__(self):

QtGui.QMainWindow.__init__(self)

self.setWindowTitle("MainWindowXX_XX")

self.statusBar().showMessage("status_XXX")

菜单:menuBar()获取当前主菜单。addMenu()添加菜单项。

工具栏: addToolBar()。

状态栏:statusBar()。

示例:参见创建主窗体,带有工具条,菜单和状态栏。

4.3.5.3 对话框:QDialog

与Qt一致。

示例:

def openFile(self):

dlg =QtGui.QFileDialog.getOpenFileName(self,"OpenFile","","Text(*.txt)")

print(dlg.toLocal8Bit())

4.3.6Qt信号-槽:QtCore.SIGNAL(“名称()”)

默认的信号-槽与Qt一致。

示例:

btnQuit = QtGui.QPushButton("Quit")

# self.connect(btnQuit,QtCore.SIGNAL("clicked()"),QtCore.SLOT("close()"))

btnQuit.clicked.connect(self.close)

自定义信号:

使用QtCore.pyqtSignal()声明或者直接使用QtCore.emit(“信号()”)。

参考:http://www.cnblogs.com/codeio/archive/2011/08/30/2159030.html

示例:

sigXXX = QtCore.pyqtSignal()//define

def mousePressEvent(self,event):

#self.emit(QtCore.SIGNAL("sigXXX()"))//define and emit

self.sigXXX.emit()//emit



自定义槽

使用@QtCore.pyqtSlot()修饰器或者使用connect方式直斥调用函数。

参考:http://www.linuxzen.com/pyqt4-xin-hao-he-cao-xiang-jie.html

示例:

class MainWindow(QtGui.QMainWindow):

sigXXX = QtCore.pyqtSignal()

def __init__(self):

QtGui.QMainWindow.__init__(self)

self.setWindowTitle("MainWindowXX_XX")

self.statusBar().showMessage("status_XXX")

self.createActions()

# self.connect(self,QtCore.SIGNAL("sigXXX()"),self,QtCore.SLOT("handleXXX()"))#right, connect to slot

#self.connect(self,QtCore.SIGNAL("sigXXX()"),self,QtCore.SLOT("handleYYY()"))#wrong,can not connect to fun

# self.sigXXX.connect(self.handleXXX)#right, connect to slot

self.sigXXX.connect(self.handleYYY)#wright,connect to fun



@QtCore.pyqtSlot()

def handleXXX(self):

self.setWindowTitle("XXX-1")



def handleYYY(self):

self.setWindowTitle("YYY-2")

4.3.7Qt布局

注意,在QMainWindow中设置布局时,应该先设置centralWidget(),再设置中央控件的layout。

def addLayoutWidget(self):

btnQuit = QtGui.QPushButton("Quit")

self.connect(btnQuit,QtCore.SIGNAL("clicked()"),QtCore.SLOT("close()"))

lbl1 = QtGui.QLabel("Label1")



hBox = QtGui.QHBoxLayout()

hBox.addWidget(lbl1)

hBox.addWidget(btnQuit)



vBox = QtGui.QVBoxLayout()

vBox.addStretch(1)

vBox.addStretch()

vBox.addLayout(hBox)

vBox.addWidget(QtGui.QLabel("Label2"))

vBox.addWidget(QtGui.QLabel("Label3"))

self.setCentralWidget(QtGui.QWidget(self))

self.centralWidget().setLayout(vBox)

4.3.8使用QtDesigner生成的ui作为GUI

1) 在QtDesigner中生成UI文件。

2) 使用pyuic4生成ui.py

pyuic4 -o ui.py test.ui

3) 将py导入应用

from PyQt4 import QtGui

import ui

classDlg(QtGui.QDialog,ui.Ui_Dialog):

def __init__(self):

super(Dlg,self).__init__()

self.setupUi(self)

4) 在应用中构造ui的对应类

使用ui中的ui_类作为基类生成对应类。

示例:

from PyQt4 import QtGui

import ui

classDlg(QtGui.QDialog,ui.Ui_Dialog):

def __init__(self):

super(Dlg,self).__init__()

self.setupUi(self)

4.4 示例

4.4.1创建一个Widget类,具有添加退出按钮,显示对话框和居中显示的功能。

import sys

from PyQt4 importQtGui,QtCore



class Widget(QtGui.QWidget):

def __init__(self,parent=None):

QtGui.QWidget.__init__(self,parent)

self.setGeometry(200,100,200,500)

self.setWindowTitle("XXX_YYYY")

self.setWindowIcon(QtGui.QIcon("xx.png"))

self.setToolTip("ToolTipHahahaha")



def addWidget(self):

btn =QtGui.QPushButton("Quit",self)

self.connect(btn,QtCore.SIGNAL("clicked()"),QtGui.qApp,QtCore.SLOT("quit()"))



def showMessage(self):

reply =QtGui.QMessageBox.question(self,"title","question",QtGui.QMessageBox.Yes|QtGui.QMessageBox.No,QtGui.QMessageBox.Yes)

if reply == QtGui.QMessageBox.Yes:

print("accept")

def move2Center(self):

screenRect =QtGui.QDesktopWidget().screenGeometry()

self.move(screenRect.width()/2,screenRect.height()/2)

4.4.2 创建主窗体,带有工具条,菜单和状态栏。

from PyQt4 import QtGui,QtCore

from PyQt4.QtGui importQStatusBar



classMainWindow(QtGui.QMainWindow):

def __init__(self):

QtGui.QMainWindow.__init__(self)

self.setWindowTitle("MainWindowXX_XX")

self.statusBar().showMessage("status_XXX")

self.createActions()



def createActions(self):

self.actClose =QtGui.QAction("ActionXY",self)

self.actClose.setToolTip("Tip_xxx")

self.actClose.setStatusTip("statusTipYYYY")

self.actClose.setShortcut("Ctrl+I")

self.connect(self.actClose,QtCore.SIGNAL("triggered()"),QtCore.SLOT("close()"))



def addMenu(self):

menu= self.menuBar()

file =menu.addMenu("&File");

file.addAction(self.actClose)



def addTool(self):

toolBar = self.addToolBar("Quit")

toolBar.addAction(self.actClose)



if"__main__"==__name__:

app = QtGui.QApplication(sys.argv)

win = MainWindow.MainWindow()

win.addMenu()

win.addTool()

win.show()

sys.exit(app.exec_())
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: