q操作概述在典型的GUI程序中,用户界面通常使用不同的操作方法来执行相同的操作。 例如,要在一个APP应用程序中创建新文件,请使用菜单栏上的“文件”--“新建”菜单项,或单击工具栏上的“新建文件”图标。 这是一个qtoolbutton。pyqt提供了一个QAction类,用于封装用户应该执行的操作。 这样,可以独立地将其与菜单栏、工具栏或快捷键相关联。 这样可以很好地分离接口的操作方法和具体行为,减少代码之间的耦合性,提高可维护性。 简言之,QAction是用于自定义菜单栏、工具栏或快捷键的抽象操作行为。
q操作的常见方法如下:
设置setIcon ()图标; setText () :设置要显示的文本; 设置工具(:设置提示文本; setShortcut (:设置快捷键; setCheckable () :设置check选择模式; 设置setChecked ()选中/禁用(在菜单前选中或不选中)。 q动作的一般信号:
触发:点击时发出,()最常用); hovered :老鼠在上空漂浮时发射这个信号; toggled :如果选择了状态,则checked为True,将发送此参数; changed :如果q action的状态发生变化,则发送。 例如,图标增加或文字改变。 QAction类继承关系:
在测试QAction之前的文章中,添加了一个不带的菜单项,在实践中添加了一系列QAction行为。 但是,在对应的动作中添加槽函数,并不具体进行该动作,在本篇中实现了其具体操作。
将notepad.py的原始代码扩展到基础上,完成基本的文本编辑器。 具有创建新文件、打开文件、编辑文件、保存文件等基本功能。 完整的代码如下。
importsysfromPyQt5importQtCore,QtGui,qtwidgetsfrompyqt5. qtcoreimportqtfrompyqt5. qtwidgetsimport (qplaintextedit,q ststed qmessagebox (classdemonotepad (qmainwindow ) :def__init_ ) self,pareetepad )。 self(_init_ ) (parent )窗口标题集self.setWindowTitle (实战PyQt5:QActionDemo-记事本) )窗口大小设置self.resize lf ) :#将文本编辑器设置为中央小部件self.txt editor=qplaintextedit (self ) self.init menubar (definit menubar ) sellf 格式菜单=menubar.addmenu (格式(o ) ) helpMenu=menuBar.addMenu (帮助) h ) ) style=QApplication.style 添加图标afile new.seticon (style.standard icon ) qstyle.sp_fileicon ) )快捷方式添加afilenew.setshortcut ) Qt.ctrlqt enu.addaction )文件aFileOpen=QAction ) '打开) (o ) .'文件
aFileOpen.setIcon(style.standardIcon(QStyle.SP_DialogOpenButton)) aFileOpen.setShortcut(Qt.CTRL + Qt.Key_O) aFileOpen.triggered.connect(self.onFileOpen) fileMenu.addAction(aFileOpen) #保存 aFileSave = QAction('保存(&S)', self) aFileSave.setIcon(style.standardIcon(QStyle.SP_DialogSaveButton)) aFileSave.setShortcut(Qt.CTRL + Qt.Key_S) aFileSave.triggered.connect(self.onFileSave) fileMenu.addAction(aFileSave) #另存为 aFileSaveAs = QAction('另存为(&A)...', self) aFileSaveAs.triggered.connect(self.onFileSaveAs) fileMenu.addAction(aFileSaveAs) #间隔线 fileMenu.addSeparator() #退出菜单 aFileExit = QAction('退出(&X)', self) aFileExit.triggered.connect(self.close) fileMenu.addAction(aFileExit) # ==== 编辑部分 ==== # #撤销编辑 aEditUndo = QAction('撤销(&U)',self) aEditUndo.setShortcut(Qt.CTRL + Qt.Key_Z) aEditUndo.triggered.connect(self.txtEditor.undo) editMenu.addAction(aEditUndo) #恢复编辑 aEditRedo = QAction('恢复(&R)', self) aEditRedo.setShortcut(Qt.CTRL + Qt.Key_Y) aEditUndo.triggered.connect(self.txtEditor.redo) editMenu.addAction(aEditRedo) #间隔线 editMenu.addSeparator() #剪切操作 aEditCut = QAction('剪切(&T)', self) aEditCut.setShortcut(Qt.CTRL + Qt.Key_X) aEditCut.triggered.connect(self.txtEditor.cut) editMenu.addAction(aEditCut) #复制操作 aEditCopy = QAction('复制(&C)', self) aEditCopy.setShortcut(Qt.CTRL + Qt.Key_C) aEditCopy.triggered.connect(self.txtEditor.copy) editMenu.addAction(aEditCopy) #粘贴操作 aEditPaste = QAction('粘贴(&P)', self) aEditPaste.setShortcut(Qt.CTRL + Qt.Key_V) aEditPaste.triggered.connect(self.txtEditor.paste) editMenu.addAction(aEditPaste) #删除操作 aEditDel = QAction('删除(&L)', self) aEditDel.setShortcut(Qt.Key_Delete) aEditDel.triggered.connect(self.onEditDelete) editMenu.addAction(aEditDel) #添加分割线 editMenu.addSeparator() #全选操作 aEditSelectAll = QAction('全选(&A)', self) aEditSelectAll.setShortcut(Qt.CTRL + Qt.Key_A) aEditSelectAll.triggered.connect(self.txtEditor.selectAll) editMenu.addAction(aEditSelectAll) # ==== 格式设置部分 ==== # aFmtAutoLine = QAction('自动换行(&W)', self) aFmtAutoLine.setCheckable(True) aFmtAutoLine.setChecked(True) aFmtAutoLine.triggered[bool].connect(self.onFormatAutoLine) formatMenu.addAction(aFmtAutoLine) # ==== 帮助部分 ==== # aHelpAbout = QAction('关于(&A)...', self) aHelpAbout.triggered.connect(self.onHelpAbout) helpMenu.addAction(aHelpAbout) def msgCritical(self, strInfo): dlg = QMessageBox(self) dlg.setIcon(QMessageBox.Critical) dlg.setText(strInfo) dlg.show() def onFileNew(self): self.txtEditor.clear() def onFileOpen(self): path,_ = QFileDialog.getOpenFileName(self, '打开文件', '', '文本文件 (*.txt)') if path: try: with open(path, 'rU') as f: text = f.read() except Exception as e: self.msgCritical(str(e)) else: self.path = path self.txtEditor.setPlainText(text) def onFileSave(self): if self.path is None: return self.onFileSaveAs() self._saveToPath(self.path) def onFileSaveAs(self): path,_ = QFileDialog.getSaveFileName(self, '保存文件', '', '文本文件 (*.txt)') if not path: return self._saveToPath(path) def _saveToPath(self, path): text = self.txtEdit.toPlainText() try: with open(path, 'w') as f: f.write(text) except Exception as e: self.msgCritical(str(e)) else: self.path = path def onEditDelete(self): tc = self.txtEditor.textCursor() #tc.select(QtGui.QTextCursor.BlockUnderCursor) 这样删除一行 tc.removeSelectedText() def onFormatAutoLine(self, autoLine): if autoLine: self.txtEditor.setLineWrapMode(QPlainTextEdit.WidgetWidth) else: self.txtEditor.setLineWrapMode(QPlainTextEdit.NoWrap) def onHelpAbout(self): QMessageBox.information(self, '实战PyQt5', 'PyQt5实现的文本编辑器演示版') if __name__ == '__main__': app = QApplication(sys.argv) window = DemoNotepad() window.show() sys.exit(app.exec())运行结果如下图:
测试QAction
本文知识点 QAction常用函数;打开和保存文件;QPlainExitText常用编辑操作;QAction设置成check状态。前一篇: 实战PyQt5: 041-菜单控件QMenu