PyQt5 GUI编程(QMainWindow与QWidget模块结合使用)
一.简介
QWidget是所有用户界面对象的基类,而QMainWindow
用于创建主应用程序窗口的类。它是QWidget
的一个子类,提供了创建具有菜单栏、工具栏、状态栏等的主窗口所需的功能。上篇主要介绍了基本使用,创建窗口时都是继承单个模块,本章主要介绍下两个模块的结合使用。
二.具体用法
1.我们先来创建一个类来继承QMainWindow实现一个简单的窗口
import sys from PyQt5.QtWidgets import QApplication, QMainWindow class FileChooserApp(QMainWindow): def __init__(self): super().__init__() self.initUI() def initUI(self): # 设置窗口的标题和大小 self.setWindowTitle('文件选择器') self.setGeometry(300, 300, 500, 500) if __name__ == '__main__': app = QApplication(sys.argv) ex = FileChooserApp() ex.show() sys.exit(app.exec_())
2.在主窗口中添加一个文本编辑器,使用垂直布局来分布展示
def initUI(self): ql = QTextEdit() central_widget = QWidget() self.setCentralWidget(central_widget) # 创建一个中心部件 vbox = QVBoxLayout(central_widget) # 创建一个垂直布局 vbox.addWidget(ql) vbox.addStretch(1) central_widget.setLayout(vbox) # 添加到布局器中
上述中我们在主窗口中创建一个中心部件将实例化后的central_widget 添加进去,这样就可以设置我们想要的布局了。
3.具体效果
三.实例
import sys from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QFileDialog, QMainWindow, QAction, QTextEdit class FileChooserApp(QMainWindow): def __init__(self): super().__init__() self.ql = QTextEdit() self.initUI() def initUI(self): action = QAction('打开', self) # 创建QAction实例 action.setShortcut('Ctrl+a') # 设置快捷键操 action.triggered.connect(self.openFileNameDialog) menubar = self.menuBar() # 创建一个菜单栏 menu_open = menubar.addMenu('文件') # 设置菜单栏tab menu_open.addAction(action) # 关联事件 action_updata = QAction('删除', self) # 创建QAction实例 action_updata.setShortcut('Ctrl+d') # 设置快捷键操 action_updata.triggered.connect(self.text_del) action_a = QAction('保存', self) # 创建QAction实例 action_a.triggered.connect(self.ctrl_s) menubar_updata = self.menuBar() # 创建一个菜单栏 menu_updata = menubar_updata.addMenu('编辑') # 设置菜单栏tab menu_updata.addAction(action_updata) # 关联事件 menu_updata.addAction(action_a) # 关联事件 central_widget = QWidget() self.setCentralWidget(central_widget) vbox = QVBoxLayout(central_widget) # 创建一个垂直布局 vbox.addWidget(self.ql) vbox.addStretch(1) central_widget.setLayout(vbox) # 设置窗口的标题和大小 self.setWindowTitle('文件选择器') self.setGeometry(300, 300, 500, 500) def ctrl_s(self): print(self.ql.toPlainText()) options = QFileDialog.Options() options |= QFileDialog.DontUseNativeDialog fileName, _ = QFileDialog.getSaveFileName(self, "保存文件", "C://", "Text Files (*.txt)", options=options) if fileName: with open(fileName, 'w', encoding='utf8') as file: file.write(self.ql.toPlainText()) def text_del(self): self.ql.clear() def openFileNameDialog(self): # 打开文件对话框并获取文件路径 options = QFileDialog.Options() # 初始化 options |= QFileDialog.DontUseNativeDialog # 使用pyqt对话框 fileName, _ = QFileDialog.getOpenFileName(self, "对话框标题", "C://", "All Files (*);;Text Files (*.txt);;Text Files (*.py)", options=options) # 打开一个对话框 """ C://设置打开的目录,”“模式当前py目录 "All Files (*);;Text Files (*.txt);;Text Files (*.py)" 设置选择文件的类型 """ if fileName: with open(fileName, mode="r", encoding="utf8") as f: self.ql.setText(f.read()) if __name__ == '__main__': app = QApplication(sys.argv) ex = FileChooserApp() ex.show() sys.exit(app.exec_())
上述中创建了两个菜单栏,分别是打开和编辑,内置功能是打开txt文件后读取内容显示在文本框中,文本框中内容可以进行清空和保存。