找回密码
 立即注册
  • QQ空间
  • 回复
  • 收藏

PyQt5:界面搭建

admin 2019-11-7 19:39 329人围观 Qt相关



上期我们介绍了PyQt5的布局,主要涉及到了以下几个知识点:


  • 绝对位置

  • 箱式布局

  • 栅格布局

  • 表单布局

  • 编辑伙伴


今天我们主要讲解一下软件界面的搭建


正文

1
记得中学的时候第一次使用windows系统的电脑,当时的操作系统还是windows98,教学课本上说明了一个窗口程序一般包含基本要素:有最大化、最小化、以及关闭,有菜单栏、工具栏,还有状态栏,以及在中间的主程序界面。如下图所示:



今天我们的任务就是DIY一个自己的软件界面。

2

内容正式开始!

QMainWindow类提供了一个主应用程序窗口。 这使得能够创建具有状态栏,工具栏和菜单栏的经典应用程序框架。

状态栏


这个比较简单,先从这里开始。
#coding=utf-8

from PyQt5.QtWidgets import QApplication, QMainWindow
import sys
classExample(QMainWindow):    def__init__(self):        super().__init__()        self.InitUI()
   defInitUI(self):        self.statusBar().showMessage('准备就绪')        self.setGeometry(300,300,400,300)        self.setWindowTitle('关注微信公众号:学点编程吧--状态栏')        self.show()
 
if __name__ == '__main__':    app = QApplication(sys.argv)    ex = Example()    sys.exit(app.exec_())

执行结果如下:



self.statusBar().showMessage('准备就绪')
要获取状态栏,我们调用QtGui.QMainWindow类的statusBar()方法。 该方法的第一个调用创建一个状态栏。 后续调用返回状态栏对象。 showMessage()在状态栏上显示一条消息。

3

菜单

简单的菜单

#coding=utf-8

from PyQt5.QtWidgets import QApplication, QMainWindow, QAction, qApp
from PyQt5.QtGui import QIcon
import sys
classExample(QMainWindow):    def__init__(self):        super().__init__()        self.InitUI()

   defInitUI(self):        self.statusBar().showMessage('准备就绪')        self.setGeometry(300,300,400,300)        self.setWindowTitle('关注微信公众号:学点编程吧--简单的菜单')        exitAct = QAction(QIcon('exit.png'), '退出(&E)', self)        exitAct.setShortcut('Ctrl+Q')        exitAct.setStatusTip('退出程序')        exitAct.triggered.connect(qApp.quit)        menubar = self.menuBar()        fileMenu = menubar.addMenu('文件(&F)')        fileMenu.addAction(exitAct)        self.show()
if __name__ == '__main__':    app = QApplication(sys.argv)    ex = Example()    sys.exit(app.exec_())

在上面的例子中,我们用一个菜单创建一个菜单。 此菜单将包含一个选择时终止应用程序的操作。 还创建状态栏。 该操作可通过Ctrl + Q快捷方式访问。

执行的结果如下:



exitAct = QAction(QIcon('exit.png'), '退出(&E)', self)exitAct.setShortcut('Ctrl+Q')exitAct.setStatusTip('退出程序')
QAction是使用菜单栏,工具栏或自定义键盘快捷方式执行操作的抽象。在上述三行中,我们创建一个具有特定图标和“退出”标签的动作。此外,为此操作定义了快捷方式。当我们将鼠标指针悬停在菜单项上时,第三行创建状态栏显示在状态栏中。
exitAct.triggered.connect(qApp.quit)
当我们选择这个特定的动作时,发出触发信号。 信号连接到QApplication小部件的quit()方法。 这终止了应用程序。
menubar = self.menuBar()fileMenu = menubar.addMenu('文件(&F)')fileMenu.addAction(exitAct)
menuBar()方法创建一个菜单栏。 我们使用addMenu()创建文件菜单,并使用addAction()添加操作。

上面的代码中我们在退出、文件后面都增加了“&”这个符号,增加这个符号后,当我们按住“Alt+F”的时候就能快速打开文件这个菜单,同理按住“Alt+E”的时候就能退出了。可以试试如果不加这个符号能否成功呢?

4

子菜单


子菜单是另一个菜单中的菜单。类似下图中的样子。



#coding=utf-8

from PyQt5.QtWidgets import QApplication, QMainWindow, QAction, qApp, QMenu
from PyQt5.QtGui import QIcon
import sys
classExample(QMainWindow):    def__init__(self):        super().__init__()        self.InitUI()
   defInitUI(self):        self.statusBar().showMessage('准备就绪')        self.setGeometry(300,300,400,300)        self.setWindowTitle('关注微信公众号:学点编程吧--子菜单')        exitAct = QAction(QIcon('exit.png'), '退出(&E)', self)        exitAct.setShortcut('Ctrl+Q')        exitAct.setStatusTip('退出程序')        exitAct.triggered.connect(qApp.quit)        saveMenu = QMenu('保存方式(&S)', self)        saveAct = QAction(QIcon('save.png'),'保存...', self)        saveAct.setShortcut('Ctrl+S')        saveAct.setStatusTip('保存文件')        saveasAct = QAction(QIcon('saveas.png'),'另存为...(&O)', self)        saveasAct.setStatusTip('文件另存为')        saveMenu.addAction(saveAct)        saveMenu.addAction(saveasAct)        newAct = QAction(QIcon('new.png'),'新建(&N)',self)        newAct.setShortcut('Ctrl+N')        menubar = self.menuBar()        fileMenu = menubar.addMenu('文件(&F)')        fileMenu.addAction(newAct)        fileMenu.addMenu(saveMenu)        fileMenu.addSeparator()        fileMenu.addAction(exitAct)        self.show()
if __name__ == '__main__':    app = QApplication(sys.argv)    ex = Example()    sys.exit(app.exec_())

执行的结果如下:



在这个例子中,我们有三个菜单项: 其中两个位于文件菜单中(新建、退出),另一个位于文件的保存子菜单中。
saveMenu = QMenu('保存方式(&S)', self)
使用QMenu创建新菜单,
saveAct = QAction(QIcon('save.png'),'保存...', self)saveAct.setShortcut('Ctrl+S')saveAct.setStatusTip('保存文件')saveasAct = QAction(QIcon('saveas.png'),'另存为...(&O)', self)saveasAct.setStatusTip('文件另存为')saveMenu.addAction(saveAct)saveMenu.addAction(saveasAct)
两个动作使用addAction()被添加到子菜单中。

5

上下文菜单(context menu)


Windows操作系统中任何地方右击鼠标会出现俗称的“右键菜单”,其实就是指上下文菜单。
#coding=utf-8

from PyQt5.QtWidgets import QApplication, QMainWindow, QAction, qApp, QMenu
from PyQt5.QtGui import QIcon
import sys
classExample(QMainWindow):    def__init__(self):        super().__init__()        self.InitUI()
   defInitUI(self):        self.statusBar().showMessage('准备就绪')        self.setGeometry(300,300,400,300)        self.setWindowTitle('关注微信公众号:学点编程吧--上下文菜单')        exitAct = QAction(QIcon('exit.png'), '退出(&E)', self)        exitAct.setShortcut('Ctrl+Q')        exitAct.setStatusTip('退出程序')        exitAct.triggered.connect(qApp.quit)        saveMenu = QMenu('保存方式(&S)', self)        saveAct = QAction(QIcon('save.png'),'保存...', self)        saveAct.setShortcut('Ctrl+S')        saveAct.setStatusTip('保存文件')        saveasAct = QAction(QIcon('saveas.png'),'另存为...(&O)', self)        saveasAct.setStatusTip('文件另存为')        saveMenu.addAction(saveAct)        saveMenu.addAction(saveasAct)        newAct = QAction(QIcon('new.png'),'新建(&N)',self)        newAct.setShortcut('Ctrl+N')        newAct.setStatusTip('新建文件')        menubar = self.menuBar()        fileMenu = menubar.addMenu('文件(&F)')        fileMenu.addAction(newAct)        fileMenu.addMenu(saveMenu)        fileMenu.addSeparator()        fileMenu.addAction(exitAct)        self.show()
 
   defcontextMenuEvent(self, event):       cmenu = QMenu(self)       newAct = cmenu.addAction("新建")       opnAct = cmenu.addAction("保存")       quitAct = cmenu.addAction("退出")       action = cmenu.exec_(self.mapToGlobal(event.pos()))
      if action == quitAct:           qApp.quit()
     
if __name__ == '__main__':    app = QApplication(sys.argv)    ex = Example()    sys.exit(app.exec_())

单击右键后,执行的效果如下:



要使用上下文菜单,我们必须重新实现contextMenuEvent()方法。
action = cmenu.exec_(self.mapToGlobal(event.pos()))
使用exec_()方法显示上下文菜单。 从事件对象获取鼠标指针的坐标。 mapToGlobal()方法将窗口小部件坐标转换为全局屏幕坐标。
if action == quitAct:    qApp.quit()
如果从上下文菜单返回的操作等于退出操作,我们终止应用程序。

6

工具栏


各项命令都是在菜单栏当中,但是我们可以把一些常用的命令放在工具栏上,例如新建、打开、保存等等。
#coding=utf-8

from PyQt5.QtWidgets import QApplication, QMainWindow, QAction, qApp, QMenu
from PyQt5.QtGui import QIcon
import sys

classExample(QMainWindow):    def__init__(self):        super().__init__()        self.InitUI()
   defInitUI(self):        self.statusBar().showMessage('准备就绪')        self.setGeometry(300,300,400,300)        self.setWindowTitle('关注微信公众号:学点编程吧--上下文菜单')        exitAct = QAction(QIcon('exit.png'), '退出(&E)', self)        exitAct.setShortcut('Ctrl+Q')        exitAct.setStatusTip('退出程序')        exitAct.triggered.connect(qApp.quit)        saveMenu = QMenu('保存方式(&S)', self)        saveAct = QAction(QIcon('save.png'),'保存...', self)        saveAct.setShortcut('Ctrl+S')        saveAct.setStatusTip('保存文件')        saveasAct = QAction(QIcon('saveas.png'),'另存为...(&O)', self)        saveasAct.setStatusTip('文件另存为')        saveMenu.addAction(saveAct)        saveMenu.addAction(saveasAct)        newAct = QAction(QIcon('new.png'),'新建(&N)',self)        newAct.setShortcut('Ctrl+N')        newAct.setStatusTip('新建文件')        menubar = self.menuBar()        fileMenu = menubar.addMenu('文件(&F)')        fileMenu.addAction(newAct)        fileMenu.addMenu(saveMenu)        fileMenu.addSeparator()        fileMenu.addAction(exitAct)        toolbar = self.addToolBar('工具栏')        toolbar.addAction(newAct)        toolbar.addAction(exitAct)        self.show()

if __name__ == '__main__':    app = QApplication(sys.argv)    ex = Example()    sys.exit(app.exec_())

执行的结果如下:



toolbar = self.addToolBar('工具栏')toolbar.addAction(newAct)toolbar.addAction(exitAct)
工具栏使用addToolBar()方法创建。 我们使用addAction()向工具栏添加两个动作对象。

7

最后


我们放一个大招,用Qt设计师来完成类Windows记事本的界面设计,由于文字叙述过于繁琐,所以我们采用录屏的方式(注意看操作),看看下面的视频吧(分辨率较高,建议在电脑或下载后观看,选择超清格式,手机上看会显示模糊)。

点击阅读原文也可以直接下载,密码:8dd0。



ok,今天就到这里,我们下期再约。

如果你想要本次教程中的相关源码,请关注微信公众号:学点编程吧,发送pyqt57,会自动得到相应的百度网盘下载链接。





更多资讯请关注:学点编程吧——你私人的计算机学习顾问!

欢迎各位童鞋留言!


----------------------------------------------------------------------------------------------------------------------
我们尊重原创,也注重分享,文章来源于微信公众号:学点编程吧,建议关注公众号查看原文。如若侵权请联系qter@qter.org。
----------------------------------------------------------------------------------------------------------------------

鲜花

握手

雷人

路过

鸡蛋

yafeilinux和他的朋友们微信公众号二维码

微信公众号

专注于Qt嵌入式Linux开发等。扫一扫立即关注。

Qt开源社区官方QQ群二维码

QQ交流群

欢迎加入QQ群大家庭,一起讨论学习!

我有话说......