前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Pyqt 主窗口(QMainWindow)简介

Pyqt 主窗口(QMainWindow)简介

作者头像
用户6021899
发布2019-08-14 17:38:07
1.7K0
发布2019-08-14 17:38:07
举报

PyQt 主窗口(QMainWindow)主要包括五大部分:

  • 中心窗口部件:可以是单个部件,也可是复合部件,位于主窗口的中心,是用户操作的主要区域。
  • 菜单栏:一般位于主窗口的顶部,可以调用程序中的绝大多数命令的部件。
  • 停靠窗口:可停靠于中心窗口部件的四周,或自由浮动于顶级窗口之上的窗口,可从一个位置拖动到另一个位置。很多程序没有停靠窗口。
  • 工具栏:可容纳工具栏按钮和标签,组合框,微调框等其他部件的复合部件的部件,可调用程序中最常用的命令。默认位于菜单栏下方。实际上可停靠于中心窗口部件的四周,比停靠窗口更靠外。
  • 状态栏:位于主窗口的底部的部件,用来显示一些提示消息。还可以嵌入其他部件显示额外的信息。

下面我写了一个简单的例子,只实现了极少数的功能,仅供参考。后续会详细介绍主窗口(QMainWindow)程序各个部分的写法。推荐在浏览器中打开并横屏查看代码。

import sys from PyQt5.QtWidgets import * from PyQt5.QtGui import QColor, QFont, QIcon, QKeySequence from PyQt5.QtCore import Qt, QDate, QTime, QDateTime, QTimer from PyQt5.QtPrintSupport import QPrinter, QPrintDialog, QPrintPreviewDialog import os

class MainWindow(QMainWindow):

def __init__(self, parent = None): super().__init__(parent) self.initUI()

def initUI(self): self.setWindowTitle("主窗口示例") #self.resize(400,250) self.setup_centralWidget() self.setup_dockWidget() self.setup_statusBar()

self.createActions() self.setup_menuBar() self.setup_toolBar()

def setup_centralWidget(self): #设置主窗口中心部件 self.textEdit = QTextEdit()#初始化时换行符无效 self.textEdit.setText("第一行\n第二行\n第三行\n") #self.textEdit.selectAll() self.setCentralWidget(self.textEdit)#指定主窗口中心部件

def createActions(self): #创建动作 #打开文件动作 self.fileOpenAction = QAction(QIcon("open.png"),"&Open",self) # 动作在self中可用 self.fileOpenAction.setShortcut(QKeySequence.Open)#设置标准化快捷键 #self.fileOpenAction.setShortcut("Ctrl+O")# windows 系统下等效于 self.fileOpenAction.setToolTip("打开文件")#工具栏提示文本 self.fileOpenAction.setStatusTip("打开现有的文件")#状态栏提示文本 self.fileOpenAction.triggered.connect(self.fileOpen)

#文件另存为动作 self.fileSaveAsAction = QAction(QIcon("save.png"),"SaveAs",self) # 动作在self中可用 self.fileSaveAsAction.setShortcut(QKeySequence.SaveAs)#设置标准化快捷键 #windows 系统下无快捷键 self.fileSaveAsAction.setToolTip("另存为")#工具栏提示文本 self.fileSaveAsAction.setStatusTip("文件另存为")#状态栏提示文本 self.fileSaveAsAction.triggered.connect(self.fileSaveAs)

#动作分隔符 self.separator = QAction(self) self.separator.setSeparator(True)

def setup_menuBar(self): #文件菜单 self.fileMenu = self.menuBar().addMenu("&File") self.fileMenu.addAction(self.fileOpenAction) self.fileMenu.addAction(self.fileSaveAsAction) #self.fileMenu.addAction(self.separator)

def fileOpen(self): fileName, filetype = QFileDialog.getOpenFileName(self, "打开文件", os.getcwd(), # 设定起始路径为当前目录 "Text Files (*.txt)") # 设置文件扩展名过滤,用双分号间隔 if fileName != "": with open(fileName) as f: self.textEdit.setText(f.read())

def fileSaveAs(self): fileName, filetype = QFileDialog.getSaveFileName(self, "文件另存为", os.getcwd(), # 起始路径 "Text Files (*.txt);;Html Files (*.html)") # 设置文件扩展名过滤,用双分号间隔 if fileName =="": return if filetype=="Text Files (*.txt)": with open(fileName,"w") as f: f.write(self.textEdit.toPlainText()) elif filetype=="Html Files (*.html)": with open(fileName,"w") as f: f.write(self.textEdit.toHtml()) def setup_toolBar(self): fileToolbar = self.addToolBar("File")#添加工具条;可依次添加多个工具条 fileToolbar.addActions((self.fileOpenAction,self.fileSaveAsAction,self.separator))#添加动作 tb_label1 = QLabel("选择什么东东") self.cb = QComboBox() self.cb.addItems(("红","绿","蓝")) fileToolbar.addWidget(tb_label1)#工具条添加部件 fileToolbar.addWidget(self.cb)#工具条添加部件 #...... def setup_dockWidget(self): #设置停靠窗口 self.logDockWidget = QDockWidget("log",self) self.logDockWidget.setAllowedAreas(Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea) self.listWidget = QListWidget() self.logDockWidget.setWidget(self.listWidget) self.addDockWidget(Qt.RightDockWidgetArea, self.logDockWidget)#添加停靠窗口

def setup_statusBar(self): #配置状态栏 self.dateLabel = QLabel() self.dateLabel.setFrameStyle(QFrame.StyledPanel | QFrame.Sunken) self.dateLabel.setText(QDate.currentDate().toString())

self.timeLabel = QLabel() self.timeLabel.setFrameStyle(QFrame.StyledPanel | QFrame.Sunken) self.timeLabel.setText(QTime.currentTime().toString()) self.statusBar().addPermanentWidget(self.dateLabel) self.statusBar().addPermanentWidget(self.timeLabel)

datetime = QDateTime.currentDateTime().toString() self.statusBar().showMessage(datetime,3000) #状态栏在3000ms内显示信息 self.statusBar().showMessage("ready")#状态栏显示信息 timer = QTimer(self)#创建计时器#self timer.timeout.connect(self.updateBySecond) # 计时器超时信号接到用于更新界面的槽 timer.start(1000)#每1000ms发射超时信号 def updateBySecond(self): self.timeLabel.setText(QTime.currentTime().toString()) self.dateLabel.setText(QDate.currentDate().toString())

if __name__ == '__main__': app = QApplication(sys.argv) mw = MainWindow() mw.show() sys.exit(app.exec_())

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-02-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python可视化编程机器学习OpenCV 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档