python窗体程序例子_实例24 基本QMainWindow主窗口程序

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

120624075081571.gif

具体实现代码如下:

# -*- 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行编辑工具条的实现与文件工具条类似。

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

120624075081572.gif

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

工具条是一个可移动的窗口,它可停靠的区域由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用法,以后还会再详细讲解。logo.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值