本实例实现一个基本主窗口程序,包含一个菜单条,一个工具栏,中央可编辑窗体及状态栏。实现的效果图如下所示。
具体实现代码如下:
- # -*- 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
文件内容如下:
- <!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版本