Python Qt GUI快速编程第六章代码分析

这是我敲的Python Qt Gui快速编程第六章上的代码,以后可能要用到其中一些,如果忘记了就来这里看看。
#coding=utf-8
#d                                                                                              import os
import platform
import  sys
from PyQt4.QtGui import *
from PyQt4.QtCore import *
__version__= "1.0.0"

class MainWindow(QMainWindow):
    def fileNew(self):
        print 1
    def addActions(self, target,actions):
        for action in actions:
            if action is None:
                target.addSeparator()
            else :
                target.addAction(action)
    def createAction(self,text,slot=None,shortcut=None,icon=None,tip=None,
                     checkable=False,signal="triggered()"):
        action  =   QAction(text,self)
        if icon is not None:
            action.setIcon(QIcon("web.png"))
        if shortcut is not None:
            action.setShortcut(shortcut)
        if tip is not None:
            action.setToolTip(tip)
            action.setStatusTip(tip)
        if slot is not None:
            self.connect(action,SIGNAL(signal),slot)
        if checkable:
            action.setCheckable(True)
        return action
    def __init__(self,parent=None):
        super(MainWindow, self).__init__(parent)
        self.image  =   QImage()
        self.dirty  =   False       #作为标志用来说明图片是否未保存修改。
        self.filename   =   None        #作为标志,用来说明是没有图片还是有尚未保存的新创建图片。
        self.mirroredvertically =   False   #在实现镜像的时候会用到。
        self.mirroredhorizontally   =   False

        #设置主窗口部件
        self.imageLabel =   QLabel("123456")
        self.imageLabel.setMinimumSize(200,200)
        self.imageLabel.setAlignment(Qt.AlignCenter)#设置图片水平和垂直居中对齐。
        self.imageLabel.setContextMenuPolicy(Qt.ActionsContextMenu) #查阅了API文档,明白了
        self.setCentralWidget(self.imageLabel)      #查阅了 API文档,明白了这个方法可以对主窗口中心区域的窗口部件进行布局,也可以重定义该窗口的父对象

        #设置停靠窗口,
        logDockWidget   =   QDockWidget("Log", self)    #停靠窗口不能放进布局中,所以除了窗口标题外,还要给定父对象。
        logDockWidget.setObjectName("LogDockWidget")
        logDockWidget.setAllowedAreas(Qt.LeftDockWidgetArea|#用这个方法限制其停靠区域
                                      Qt.RightDockWidgetArea)
        self.listWidget =   QListWidget()       #创建列表窗口
        logDockWidget.setWidget(self.listWidget)        #将列表窗口放进停靠窗口中
        self.addDockWidget(Qt.RightDockWidgetArea, logDockWidget)       #将停靠窗口添加到主窗口中

        #设置状态栏信息
        self.sizeLabel  =   QLabel("456")
        self.sizeLabel.setFrameStyle(QFrame.StyledPanel|QFrame.Sunken)
        status  =   self.statusBar()
        status.setSizeGripEnabled(False)#
        status.addPermanentWidget(self.sizeLabel,0)       #在查阅了API文档之后,明白了这个意思
        status.showMessage("Ready",10000)

        #创建各个动作,File旗下的和Edit旗下的
        fileNewAction   =   self.createAction("&New",self.fileNew,QKeySequence.New,"web","Create an image file")
        fileOpenAction  =   self.createAction("&Open",self.fileNew,"Ctrl+O","web","open an image file")
        editZoomAction  =   self.createAction("&Zoom",self.fileNew,"Alt+Z","web","Zoom the image")
        editInvertAction    =   self.createAction("&Invert",self.fileNew,"Ctrl+I","web","Invert the image's colors",True,"toggled(bool)")
        editSwapAndBlue =   self.createAction("Sw&ap Red and Blue",self.fileNew,"Ctrl+A","web","Swap the colors of red and blue"
                                              ,True,"toggled(bool)")
        mirrorGroup =   QActionGroup(self)
        editUnMirrorAction  =   self.createAction("&Unmirror",self.fileNew,"Ctrl+U","web","Unmirror the image",True,"toggled(bool)")
        mirrorHorizon   =   self.createAction("Mirror &Horizon",self.fileNew,"Ctrl+H","web","Mirror horizon the image",
                                           False,"toggled(bool)")
        mirrorVertical  =   self.createAction("Mirror &Vertical",self.fileNew,"Ctrl+V","web","Mirror vetrical the image"
                                           ,False,"toggled(bool)")
        mirrorGroup.addAction(editUnMirrorAction)
        mirrorGroup.addAction(mirrorHorizon)
        mirrorGroup.addAction(mirrorVertical)

        menubar = self.menuBar()
        fileMenu = menubar.addMenu('&File')
        fileMenu.addAction(fileNewAction)
        editMenu    =   menubar.addMenu("&Edit")
        self.addActions(editMenu,(editInvertAction,
                                  editSwapAndBlue,editZoomAction))
        mirrorMenu  =   editMenu.addMenu(QIcon("web"),"&Mirror")
        self.addActions(mirrorMenu,(editUnMirrorAction,mirrorHorizon,mirrorVertical))

        fileToolbar =  self.addToolBar("file")  #file是这个工具栏的标题
        fileToolbar.setObjectName("FileToolBar")    #FileToolBar是这个工具栏对象的名字
        self.addActions(fileToolbar,(fileNewAction,fileOpenAction))
        editToolbar =   self.addToolBar("Edit")
        editToolbar.setObjectName("EditToolBar")
        self.addActions(editToolbar,(editInvertAction,editSwapAndBlue,editUnMirrorAction,
                                     mirrorHorizon,mirrorVertical))

        self.zoomSpinBox    =   QSpinBox()
        self.zoomSpinBox.setRange(1,400)
        self.zoomSpinBox.setSuffix("%")
        self.zoomSpinBox.setValue(100)
        self.zoomSpinBox.setToolTip("Zoom the image")
        self.zoomSpinBox.setStatusTip(self.zoomSpinBox.toolTip())
        #self.zoomSpinBox.setFocusPolicy(Qt.NoFocus)
        self.connect(self.zoomSpinBox,
                     SIGNAL("valueChanged(int)"),self.showImage)
        editToolbar.addWidget(self.zoomSpinBox)

        self.addActions(self.imageLabel,(editInvertAction,
                                         editSwapAndBlue,editUnMirrorAction,
                                         mirrorVertical,mirrorHorizon))
    def showImage(self):
        print 2

app =   QApplication(sys.argv)
mainwindow  =   MainWindow()
mainwindow.show()
app.exec_()

1.action  =   QAction(text,self)-----------第21句
每个QObject子类都要有一个父对象(除了顶级窗口),对于窗口部件来说,它们可以通过布局来获得父对象,而对于纯粹的数据对象比如QAction来说,则必须明确地规定其父对象——self
像Qimage不是QObject的子类,所以可以直接:sekf.image=QImage()--------第36句

2.self.setCentralWidget(self.imageLabel)----------第47句
经参考API文档:

The widget argument has it's ownership transferred to Qt.

Sets the given widget to be the main window's central widget.

意思就是括号里面的参数窗口部件的所有权给了MainWindow,就是相当于给它设置了父对象,同时还将imageLabel放在父窗口中间。

3.self.imageLabel.setContextMenuPolicy(Qt.ActionsContextMenu)---------第46句

查得文档,它是这样说的,如果赋予这个参数,那么该窗口将会把该窗口所拥有的动作用在它的右菜单中。

4.logDockWidget = QDockWidget("Log", self) --------------第50句

QdockWidget是停靠窗口类,停靠窗口是不能加入布局的,所以这里需要给它指明父对象。

 
5.logDockWidget.setWidget(self.listWidget)-------第55句
self.addDockWidget(Qt.RightDockWidgetArea, logDockWidget)-------第56句
给停靠窗口里面添加窗口需要用setWidget(),其原型为:def setWidget(self, QWidget)
给主窗口里面添加停靠窗口需要用addDockWidget,其原型为:
def addDockWidget(self, Qt_DockWidgetArea, QDockWidget, Qt_Orientation=None)
6.status.setSizeGripEnabled(False)--------第62句

这个属性保存的是在状态条右下方的QSizeGrip是否有效。

可以让状态条右下方的QSizeGrip生效或者失效。默认它是生效的。

通过setSizeGripEnabled()设置属性值并且通过isSizeGripEnabled()来获得属性值。

7.status.addPermanentWidget(self.sizeLabel,0)-------第63句

查阅参考文档:

The widget argument has it's ownership transferred to Qt.

Adds the given widget permanently to this status bar, reparenting the widget if it isn't already a child of this QStatusBar object. The stretch parameter is used to compute a suitable size for the given widget as the status bar grows and shrinks. The default stretch factor is 0, i.e giving the widget a minimum of space.

Permanently means that the widget may not be obscured by temporary messages. It is is located at the far right of the status bar.

意思就是将self.sizeLabel的父对象设置成status,并且如果self.sizeLabel不是QStatusBar的子类的话,那么就重新排列结构。

后面的Int型参数代表占用status bar的相对位置大小,其中permanently意味着该窗口不会被临时信息覆盖,该窗口呆在状态栏最右边。

8.status.showMessage("Ready",10000)-----第64句。

后面的参数表示该信息在状态栏显示的时间,10000ms就是10s。

9.mirrorGroup = QActionGroup(self)-----第73句。

该句创建了一个动作群组的对象,同上,需要给它指定一个父对象。

动作群组可以管理一系列的可选型动作,并可确保它所管理的动作只要有一个是开的,那么其他的动作全为关的。

10.menubar = self.menuBar()----第83句

同创建状态栏一样,第一次调用menuBar的时候也会创建菜单栏。

menuBar()函数属于QMainWindow这个类,其原型为:def menuBar(self),返回值类型为:menuBar(self) -> QMenuBar

statusBar()函数属于QMainWindow这个类,其原型为:def statusBar(self),返回值类型为:

statusBar(self) -> QStatusBar

11.editMenu    =   menubar.addMenu("&Edit")----第86句
mirrorMenu  =   editMenu.addMenu(QIcon("web"),"&Mirror")-----第89句
self.addActions(mirrorMenu,(editUnMirrorAction,mirrorHorizon,mirrorVertical))---第90句
第一句表示给主菜单里面添加“Edit”这个选项。
第二句表示给editMenu里面添加一个子菜单。 
第三句表示给子菜单里面添加动作。
一二两句同样是addMenu这个函数,但是所属的类是不同的,第一个函数属于的类是QMenuBar,第二个函数属于QMenu。
12.fileToolbar =  self.addToolBar("file")-----第92句
   主窗口里面添加工具栏利用addToolBar这个函数,
   该句的原型addToolBar(self, QString) -> QToolBar,这个QString是该工具栏的标题
13.fileToolbar.setObjectName("FileToolBar")-----第93句
该句给工具栏对象设置了名字,其作用是帮助PyQt区分多个数量的工具栏
就像停靠窗口一样,logDockWidget.setObjectName("LogDockWidget")----第51句
14.self.addActions(editToolbar,(editInvertAction,editSwapAndBlue,editUnMirrorAction,----第97句
                             mirrorHorizon,mirrorVertical))
给工具栏添加动作。
QWidget类都有一个addAction方法,可被QMenu,QMenuBar,QToolBar类继承,这就是为什么可以向这些类添加动作的原因
15.editToolbar.addWidget(self.zoomSpinBox)----109句
查阅文档:

The widget argument has it's ownership transferred to Qt.

Adds the given widget to the toolbar as the toolbar's last item.

The toolbar takes ownership of widget.

利用完此方法后,该选值框的父对象设定为工具栏,并把该选值框放到工具栏的最后一项。

16.self.addActions(self.imageLabel,(editInvertAction, editSwapAndBlue,editUnMirrorAction, mirrorVertical,mirrorHorizon))

将动作添加到imageLabel中,

self.imageLabel.setContextMenuPolicy(Qt.ActionsContextMenu)----第46句
该句的右菜单为该imageLabel的动作。

所以在imageLabel中右键,则会弹出该窗口所有的动作指令。另外,只要动作里面没有None就可以这样执行,

因为QWidget类里面没有addSeparator这个方法。

PythonQT GUI快速编程源码是一种用于创建用户界面的开源框架。该框架结合Python编程语言和QT库的功能,使开发人员能够快速而轻松地创建交互式和响应式的应用程序。 在使用Python QT GUI快速编程源码时,开发人员可以利用QT库提供的各种可视化组件和工具,如按钮、文本框、表格等,来设计和布局应用程序的用户界面。开发人员可以使用Python语言编写代码来定义这些组件的行为和特性,如何响应用户的操作,以及如何处理和操作数据。 使用Python QT GUI快速编程源码的好处之一是它的易用性和灵活性。开发人员可以通过简单地拖放和调整组件来设计用户界面,而无需编写复杂的布局和样式代码。此外,开发人员还可以根据应用程序的需要自定义和扩展这些组件,以实现更高级的功能和效果。 Python QT GUI快速编程源码还提供了丰富的事件处理和信号槽机制。开发人员可以定义各种事件和信号,并将它们与特定的处理函数关联起来。这使得开发人员能够轻松地实现用户界面的交互性和动态性,例如根据用户的操作更新界面内容、响应按钮点击事件等。 总的来说,Python QT GUI快速编程源码是一个强大而灵活的开发框架,可帮助开发人员快速创建功能强大且易用的用户界面。无论是开发小型工具还是大型应用程序,使用Python QT GUI快速编程源码都能带来高效和可维护的开发体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值