本实例实现一个基本主窗口程序,包含一个菜单条,一个工具栏,中央可编辑窗体及状态栏。实现的效果图如下所示。
具体实现代码如下:
# -*- coding: utf-8 -*-
fromPyQt4.QtGuiimport*
fromPyQt4.QtCoreimport*
importsys
importqrc_resource
QTextCodec.setCodecForTr(QTextCodec.codecForName("utf8"))
classMainWindow(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()
defcreateActions(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)
defcreateMenus(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)
defcreateToolBars(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)
defslotNewFile(self):
newWin=MainWindow()
newWin.show()
defslotOpenFile(self):
fileName=QFileDialog.getOpenFileName(self)
iffileName.isEmpty()==False:
ifself.text.document().isEmpty():
self.loadFile(fileName)
else:
newWin=MainWindow()
newWin.show()
newWin.loadFile(fileName)
defloadFile(self,fileName):
file=QFile(fileName)
iffile.open(QIODevice.ReadOnly|QIODevice.Text):
textStream=QTextStream(file)
whiletextStream.atEnd()==False:
self.text.append(textStream.readLine())
defslotSaveFile(self):
pass
defslotAbout(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
文件内容如下:
images/icon.png
images/filenew.png
images/fileopen.png
images/filesave.png
images/filesaveas.png
images/filequit.png
images/filequit.png
images/editcut.png
images/editcopy.png
images/editpaste.png
images/editadd.png
images/editedit.png
images/editdelete.png
同时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用法,以后还会再详细讲解。