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

PyQt4 精彩实例分析* 实例24 基本QMainWindow主窗口程序

2013-09-22 11:12 537 查看
本实例实现一个基本主窗口程序,包含一个菜单条,一个工具栏,中央可编辑窗体及状态栏。实现的效果图如下所示。



具体实现代码如下:

[python] view
plaincopy

# -*- coding: utf-8 -*-  

from PyQt4.QtGui import *  

from PyQt4.QtCore import *  

import sys  

import qrc_resource  

  

QTextCodec.setCodecForTr(QTextCodec.codecForName("utf8"))  

  

class MainWindow(QMainWindow):  

    def __init__(self,parent=None):  

        super(MainWindow,self).__init__(parent)  

        self.setWindowTitle("QMainWindow")  

        self.text=QTextEdit()  

        self.setCentralWidget(self.text)  

          

        self.createActions()  

        self.createMenus()  

        self.createToolBars()  

          

    def createActions(self):  

        self.fileOpenAction=QAction(QIcon(":/fileopen.png"),self.tr("打开"),self)  

        self.fileOpenAction.setShortcut("Ctrl+O")  

        self.fileOpenAction.setStatusTip(self.tr("打开一个文件"))  

        self.connect(self.fileOpenAction,SIGNAL("triggered()"),self.slotOpenFile)  

  

        self.fileNewAction=QAction(QIcon(":/filenew.png"),self.tr("新建"),self)  

        self.fileNewAction.setShortcut("Ctrl+N")  

        self.fileNewAction.setStatusTip(self.tr("新建一个文件"))  

        self.connect(self.fileNewAction,SIGNAL("triggered()"),self.slotNewFile)  

          

        self.fileSaveAction=QAction(QIcon(":/filesave.png"),self.tr("保存"),self)  

        self.fileSaveAction.setShortcut("Ctrl+S")  

        self.fileSaveAction.setStatusTip(self.tr("保存文件"))  

        self.connect(self.fileSaveAction,SIGNAL("triggered()"),self.slotSaveFile)  

  

        self.exitAction=QAction(QIcon(":/filequit.png"),self.tr("退出"),self)  

        self.exitAction.setShortcut("Ctrl+Q")  

        self.setStatusTip(self.tr("退出"))  

        self.connect(self.exitAction,SIGNAL("triggered()"),self.close)  

  

        self.cutAction=QAction(QIcon(":/editcut.png"),self.tr("剪切"),self)  

        self.cutAction.setShortcut("Ctrl+X")  

        self.cutAction.setStatusTip(self.tr("剪切到粘贴板"))  

        self.connect(self.cutAction,SIGNAL("triggered()"),self.text.cut)  

  

        self.copyAction=QAction(QIcon(":/editcopy.png"),self.tr("复制"),self)  

        self.copyAction.setShortcut("Ctrl+C")  

        self.copyAction.setStatusTip(self.tr("复制到粘贴板"))  

        self.connect(self.copyAction,SIGNAL("triggered()"),self.text.copy)  

  

        self.pasteAction=QAction(QIcon(":/editpaste.png"),self.tr("粘贴"),self)  

        self.pasteAction.setShortcut("Ctrl+V")  

        self.pasteAction.setStatusTip(self.tr("粘贴内容到当前处"))  

        self.connect(self.pasteAction,SIGNAL("triggered()"),self.text.paste)  

  

        self.aboutAction=QAction(self.tr("关于"),self)  

        self.connect(self.aboutAction,SIGNAL("triggered()"),self.slotAbout)  

  

    def createMenus(self):  

        fileMenu=self.menuBar().addMenu(self.tr("文件"))  

        fileMenu.addAction(self.fileNewAction)  

        fileMenu.addAction(self.fileOpenAction)  

        fileMenu.addAction(self.fileSaveAction)  

        fileMenu.addAction(self.exitAction)  

  

        editMenu=self.menuBar().addMenu(self.tr("编辑"))  

        editMenu.addAction(self.copyAction)  

        editMenu.addAction(self.cutAction)  

        editMenu.addAction(self.pasteAction)  

  

        aboutMenu=self.menuBar().addMenu(self.tr("帮助"))  

        aboutMenu.addAction(self.aboutAction)  

  

    def createToolBars(self):  

        fileToolBar=self.addToolBar("File")  

        fileToolBar.addAction(self.fileNewAction)  

        fileToolBar.addAction(self.fileOpenAction)  

        fileToolBar.addAction(self.fileSaveAction)  

  

        editTool=self.addToolBar("Edit")  

        editTool.addAction(self.copyAction)  

        editTool.addAction(self.cutAction)  

        editTool.addAction(self.pasteAction)  

  

    def slotNewFile(self):  

        newWin=MainWindow()  

        newWin.show()  

  

    def slotOpenFile(self):  

        fileName=QFileDialog.getOpenFileName(self)  

        if fileName.isEmpty()==False:  

            if self.text.document().isEmpty():  

                self.loadFile(fileName)  

            else:  

                newWin=MainWindow()  

                newWin.show()  

                newWin.loadFile(fileName)  

  

    def loadFile(self,fileName):  

        file=QFile(fileName)  

        if file.open(QIODevice.ReadOnly|QIODevice.Text):  

            textStream=QTextStream(file)  

            while textStream.atEnd()==False:  

                self.text.append(textStream.readLine())  

  

    def slotSaveFile(self):  

        pass  

  

    def slotAbout(self):  

        QMessageBox.about("about me",self.tr("这是我们的第一个例子"))  

          

app=QApplication(sys.argv)  

main=MainWindow()  

main.show()  

app.exec_()  

createActions()函数用于创建所有的动作,createMenus()函数用于创建菜单,createToolBars()函数用于创建工具栏。

第13行新建一个QTextEdit对象。

第14行把QTextEdit作为主窗口的中央窗体。

第16行调用创建动作的函数。

第17行调用创建菜单的函数。

第18行调用创建工具栏的函数。

菜单与工具栏都与QAction类密切相关,工具栏上的功能按钮与菜单中的选项条目相对应,完成相同的功能,使用相同的快捷键与图标。QAction类为用户提供了一个统一的命令接口,无论是从菜单触发还是从工具栏触发,或快捷键触发都调用同样的操作接口,达到同样的目的。

第21-24行实现的是“打开文件”动作,第21行在创建这个动作时,指定了此动作使用的图标,名称以及父窗口。

第22行设置了此动作的快捷键为Ctrl+O。

第23行设定了状态条显示,当鼠标光标移至动作对应的菜单条目或工具栏按钮上时,在状态条上显示“打开文件”的提示。

第24行连接此动作触发时所调用的槽函数slotOpenFile()。

第21行中指定动作所使用的图标时,使用的是QIcon(":/fileopen.png"),需要在此程序之外新建一个QRC的资源文件:resources.qrc

文件内容如下:

[xhtml] view
plaincopy

<!DOCTYPE RCC>  

<RCC version="1.0">  

<qresource>  

<file alias="icon.png">images/icon.png</file>  

<file alias="filenew.png">images/filenew.png</file>  

<file alias="fileopen.png">images/fileopen.png</file>  

<file alias="filesave.png">images/filesave.png</file>  

<file alias="filesaveas.png">images/filesaveas.png</file>  

<file alias="fileclose.png">images/filequit.png</file>  

<file alias="filequit.png">images/filequit.png</file>  

<file alias="editcut.png">images/editcut.png</file>  

<file alias="editcopy.png">images/editcopy.png</file>  

<file alias="editpaste.png">images/editpaste.png</file>  

<file alias="editadd.png">images/editadd.png</file>  

<file alias="editedit.png">images/editedit.png</file>  

<file alias="editdelete.png">images/editdelete.png</file>  

</qresource>  

</RCC>  

同时images文件夹要与同一目录下。

然后使用如下命令,生成一个qrc_resources.py文件,然后在程序中导入。

pyrcc4 -o qrc_resources.py resources.qrc

这些内容,在以后我会拿出来专门解释。

“剪切”,“复制”和“粘贴”动作连接的触发响应槽函数,分别直接使用QTextEdit对象的cut(),copy()和paste()函数即可。

第57行“关于”动作的触发响应槽函数使用的是QApplication的slotabout()。

在创建动作时,也可不指定图标,这类动作一般只在菜单中出现,而不在工具栏上使用。

第60-64行实现文件菜单,Qt4的菜单实现与Qt3有所不同,简化了菜单的实现过程。

第60行直接调用QMainWindow的menuBar()函数即可得到主窗口的菜单条指针,再调用菜单条QMenuBar的addMenu()函数,即完成菜单条中插入一个新菜单fileMenu,fileMenu为一个QMenu类对象。

第61-64行调用QMenu的addAction()函数在菜单中加入菜单条目“打开”,“新建”,“保存”和“退出”。

第66-69行实现编辑菜单。

第70-71行实现帮助菜单。

第75-78行实现文件工具栏,第80-83实现编辑工具栏。

主窗口的工具栏上可以有多个工具条,一般采用一个菜单对应一个工具条的方式,也可根据需要进行工具条的划分。

第75行直接调用QMainWindow的addToolBar()函数即可获得主窗口的工具条对象,每新建一个工具条调用一次addToolBar()函数,赋予不同的名称,即可在主窗口中新增一个工具条。

第76-78行调用QToolBar的addAction()函数在工具条中插入属于本工具条的动作。

第80-83行编辑工具条的实现与文件工具条类似。

两个工具条的显示可以由用户进行选择,在工具栏上单击鼠标右键将弹出工具条显示的选择菜单,如下图所示。



用户对需要显示的工具条进行选择。

工具条是一个可移动的窗口,它可停靠的区域由QToolBar的allowAreas决定,包括Qt.LeftToolBarArea,Qt.RightToolBarArea,Qt.TopToolBarArea,Qt.BottomToolBarArea和Qt.AllToolBarAreas。

默认为Qt.AllToolBarAreas,启动默认出现于主窗口的顶部。

可通过调用setAllowAreas()函数来指定工具条可依靠的区域,如:

fileToolBar.setAllowAreas(Qt.TopToolBarArea|Qt.LeftToolBarArea)

此函数限定文件工具条只可出现在主窗口的顶部或左侧。

工具条也可通过调用setMovable()函数设定工具条的可移动性,如:

fileToolBar.setMovable(False)

指定文件工具条不可移动,只出现于主窗口的顶部。

 

本例中很多槽函数都实现的不全,此例只是展示基本的QMainWindow用法,以后还会再详细讲解。

 

 

注:本文基本上是经过改编的《Linux窗口程序设计--Qt4精彩实例分析》一书的PyQt4 for windows版本
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: