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

python 同时被 2 个专栏收录
342 篇文章 0 订阅
46 篇文章 0 订阅

本实例实现一个基本主窗口程序,包含一个菜单条,一个工具栏,中央可编辑窗体及状态栏。实现的效果图如下所示。

具体实现代码如下:

[python]  view plain copy
  1. # -*- coding: utf-8 -*-  
  2. from PyQt4.QtGui import *  
  3. from PyQt4.QtCore import *  
  4. import sys  
  5. import qrc_resource  
  6.   
  7. QTextCodec.setCodecForTr(QTextCodec.codecForName("utf8"))  
  8.   
  9. class MainWindow(QMainWindow):  
  10.     def __init__(self,parent=None):  
  11.         super(MainWindow,self).__init__(parent)  
  12.         self.setWindowTitle("QMainWindow")  
  13.         self.text=QTextEdit()  
  14.         self.setCentralWidget(self.text)  
  15.           
  16.         self.createActions()  
  17.         self.createMenus()  
  18.         self.createToolBars()  
  19.           
  20.     def createActions(self):  
  21.         self.fileOpenAction=QAction(QIcon(":/fileopen.png"),self.tr("打开"),self)  
  22.         self.fileOpenAction.setShortcut("Ctrl+O")  
  23.         self.fileOpenAction.setStatusTip(self.tr("打开一个文件"))  
  24.         self.connect(self.fileOpenAction,SIGNAL("triggered()"),self.slotOpenFile)  
  25.   
  26.         self.fileNewAction=QAction(QIcon(":/filenew.png"),self.tr("新建"),self)  
  27.         self.fileNewAction.setShortcut("Ctrl+N")  
  28.         self.fileNewAction.setStatusTip(self.tr("新建一个文件"))  
  29.         self.connect(self.fileNewAction,SIGNAL("triggered()"),self.slotNewFile)  
  30.           
  31.         self.fileSaveAction=QAction(QIcon(":/filesave.png"),self.tr("保存"),self)  
  32.         self.fileSaveAction.setShortcut("Ctrl+S")  
  33.         self.fileSaveAction.setStatusTip(self.tr("保存文件"))  
  34.         self.connect(self.fileSaveAction,SIGNAL("triggered()"),self.slotSaveFile)  
  35.   
  36.         self.exitAction=QAction(QIcon(":/filequit.png"),self.tr("退出"),self)  
  37.         self.exitAction.setShortcut("Ctrl+Q")  
  38.         self.setStatusTip(self.tr("退出"))  
  39.         self.connect(self.exitAction,SIGNAL("triggered()"),self.close)  
  40.   
  41.         self.cutAction=QAction(QIcon(":/editcut.png"),self.tr("剪切"),self)  
  42.         self.cutAction.setShortcut("Ctrl+X")  
  43.         self.cutAction.setStatusTip(self.tr("剪切到粘贴板"))  
  44.         self.connect(self.cutAction,SIGNAL("triggered()"),self.text.cut)  
  45.   
  46.         self.copyAction=QAction(QIcon(":/editcopy.png"),self.tr("复制"),self)  
  47.         self.copyAction.setShortcut("Ctrl+C")  
  48.         self.copyAction.setStatusTip(self.tr("复制到粘贴板"))  
  49.         self.connect(self.copyAction,SIGNAL("triggered()"),self.text.copy)  
  50.   
  51.         self.pasteAction=QAction(QIcon(":/editpaste.png"),self.tr("粘贴"),self)  
  52.         self.pasteAction.setShortcut("Ctrl+V")  
  53.         self.pasteAction.setStatusTip(self.tr("粘贴内容到当前处"))  
  54.         self.connect(self.pasteAction,SIGNAL("triggered()"),self.text.paste)  
  55.   
  56.         self.aboutAction=QAction(self.tr("关于"),self)  
  57.         self.connect(self.aboutAction,SIGNAL("triggered()"),self.slotAbout)  
  58.   
  59.     def createMenus(self):  
  60.         fileMenu=self.menuBar().addMenu(self.tr("文件"))  
  61.         fileMenu.addAction(self.fileNewAction)  
  62.         fileMenu.addAction(self.fileOpenAction)  
  63.         fileMenu.addAction(self.fileSaveAction)  
  64.         fileMenu.addAction(self.exitAction)  
  65.   
  66.         editMenu=self.menuBar().addMenu(self.tr("编辑"))  
  67.         editMenu.addAction(self.copyAction)  
  68.         editMenu.addAction(self.cutAction)  
  69.         editMenu.addAction(self.pasteAction)  
  70.   
  71.         aboutMenu=self.menuBar().addMenu(self.tr("帮助"))  
  72.         aboutMenu.addAction(self.aboutAction)  
  73.   
  74.     def createToolBars(self):  
  75.         fileToolBar=self.addToolBar("File")  
  76.         fileToolBar.addAction(self.fileNewAction)  
  77.         fileToolBar.addAction(self.fileOpenAction)  
  78.         fileToolBar.addAction(self.fileSaveAction)  
  79.   
  80.         editTool=self.addToolBar("Edit")  
  81.         editTool.addAction(self.copyAction)  
  82.         editTool.addAction(self.cutAction)  
  83.         editTool.addAction(self.pasteAction)  
  84.   
  85.     def slotNewFile(self):  
  86.         newWin=MainWindow()  
  87.         newWin.show()  
  88.   
  89.     def slotOpenFile(self):  
  90.         fileName=QFileDialog.getOpenFileName(self)  
  91.         if fileName.isEmpty()==False:  
  92.             if self.text.document().isEmpty():  
  93.                 self.loadFile(fileName)  
  94.             else:  
  95.                 newWin=MainWindow()  
  96.                 newWin.show()  
  97.                 newWin.loadFile(fileName)  
  98.   
  99.     def loadFile(self,fileName):  
  100.         file=QFile(fileName)  
  101.         if file.open(QIODevice.ReadOnly|QIODevice.Text):  
  102.             textStream=QTextStream(file)  
  103.             while textStream.atEnd()==False:  
  104.                 self.text.append(textStream.readLine())  
  105.   
  106.     def slotSaveFile(self):  
  107.         pass  
  108.   
  109.     def slotAbout(self):  
  110.         QMessageBox.about("about me",self.tr("这是我们的第一个例子"))  
  111.           
  112. app=QApplication(sys.argv)  
  113. main=MainWindow()  
  114. main.show()  
  115. 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 plain copy
  1. <!DOCTYPE RCC>  
  2. <RCC version="1.0">  
  3. <qresource>  
  4. <file alias="icon.png">images/icon.png</file>  
  5. <file alias="filenew.png">images/filenew.png</file>  
  6. <file alias="fileopen.png">images/fileopen.png</file>  
  7. <file alias="filesave.png">images/filesave.png</file>  
  8. <file alias="filesaveas.png">images/filesaveas.png</file>  
  9. <file alias="fileclose.png">images/filequit.png</file>  
  10. <file alias="filequit.png">images/filequit.png</file>  
  11. <file alias="editcut.png">images/editcut.png</file>  
  12. <file alias="editcopy.png">images/editcopy.png</file>  
  13. <file alias="editpaste.png">images/editpaste.png</file>  
  14. <file alias="editadd.png">images/editadd.png</file>  
  15. <file alias="editedit.png">images/editedit.png</file>  
  16. <file alias="editdelete.png">images/editdelete.png</file>  
  17. </qresource>  
  18. </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版本

  • 0
    点赞
  • 0
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值