PyQt

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_())

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

弗里曼的小伙伴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值