Pyqt 主窗口(QMainWindow)简介

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_())

原文发布于微信公众号 - Python编程 pyqt matplotlib(wsplovePython)

原文发表时间:2019-02-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券