参考
声明:本文大部分内容来自网络。
参考1:https://blog.csdn.net/seniorwizard/article/details/109820641
参考2:https://zhuanlan.zhihu.com/p/32407887/
QAction简要说明
- 在一个典型的GUI程序中,在用户界面上,常常使用不同的操作方式来完成同一个事情。
- 例如在一个应用中创建一个新文件,可以使用菜单条里的"文件"–>"新建"菜单项来完成,也可以点击工具栏上的"新建文件"图标(为一个QToolButton),或者是使用快捷键来完成这个动作。
- PyQt提供QAction类来封装用户需要执行的动作,这样不管是菜单栏,抑或是工具条栏,还是快捷键,都可以独立地和和这个动作相关联。
- 这样就很好地做到了界面操作方式和具体行为动作的分离,代码之间的耦合性减少,可维护性良好。一句话,QAction是一个用于菜单栏、工具栏或自定义快捷键的抽象动作行为。
QAction常用方法
方法 | 说明 |
---|
setIcon() | 设置图标 |
setText() | 设置要显示的文字 |
setToolTip() | 设置提示文字 |
setShortcut() | 设置快捷键 |
setCheckable() | 设置成check选择模式 |
setChecked() | 设置成选中/未选中(菜单前打勾或不打勾) |
QAction常用信号
方法 | 说明 |
---|
triggered | 点击时发射信号,( 最常用) |
hovered | 鼠标悬浮上空时发射该信号 |
toggled | 如果状态为选中,则checked为True,该参数会被发送 |
changed | 只要QAction状态发生改变就会发送,如多了个图标,换了文字等 |
QAction举例
- 在建立menuBar中增加menu时,或者创建QAction对象时,可以直接指定快捷键,addMenu(‘文件(&F)’),act_file_open = QAction(‘打开(&O)…’, self)。
- 设置图标的时候,可以用标准图标,如setIcon(QApplication.style().standardIcon(QStyle.SP_FileIcon))
- 另一种设置快捷键的方式:setShortcut(Qt.CTRL + Qt.Key_N)
import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import (QApplication, QMainWindow,
QAction, QPlainTextEdit, QStyle, QFileDialog,
QMessageBox)
class ToolButton(QMainWindow):
def __init__(self):
super().__init__()
self.path = None
self.setWindowTitle("ToolButton and QAction Demo")
self.resize(500, 400)
self.init_ui()
def init_ui(self):
self.text_editor = QPlainTextEdit(self)
self.setCentralWidget(self.text_editor)
mbar = self.menuBar()
m_file = mbar.addMenu('文件(&F)')
m_edit = mbar.addMenu('编辑(&E)')
m_format = mbar.addMenu('格式(&O)')
m_help = mbar.addMenu('帮助(&H)')
style = QApplication.style()
act_file_new = QAction('新建(&N)', self)
act_file_new.setIcon(style.standardIcon(QStyle.SP_FileIcon))
act_file_new.setShortcut(Qt.CTRL + Qt.Key_N)
act_file_new.triggered.connect(self.slot_file_new)
m_file.addAction(act_file_new)
act_file_open = QAction('打开(&O)...', self)
act_file_open.setIcon(style.standardIcon(QStyle.SP_DialogOpenButton))
act_file_open.setShortcut(Qt.CTRL + Qt.Key_O)
act_file_open.triggered.connect(self.slot_file_open)
m_file.addAction(act_file_open)
act_file_save = QAction('保存(&S)', self)
act_file_save.setIcon(style.standardIcon(QStyle.SP_DialogSaveButton))
act_file_save.setShortcut(Qt.CTRL + Qt.Key_S)
act_file_save.triggered.connect(self.slot_file_save)
m_file.addAction(act_file_save)
act_file_saveas = QAction('另存为(&A)...', self)
act_file_saveas.triggered.connect(self.slot_file_saveas)
m_file.addAction(act_file_saveas)
m_file.addSeparator()
aFileExit = QAction('退出(&X)', self)
aFileExit.triggered.connect(self.close)
m_file.addAction(aFileExit)
act_edit_undo = QAction('撤销(&U)', self)
act_edit_undo.setShortcut(Qt.CTRL + Qt.Key_Z)
act_edit_undo.triggered.connect(self.text_editor.undo)
m_edit.addAction(act_edit_undo)
aEditRedo = QAction('恢复(&R)', self)
aEditRedo.setShortcut(Qt.CTRL + Qt.Key_Y)
act_edit_undo.triggered.connect(self.text_editor.redo)
m_edit.addAction(aEditRedo)
m_edit.addSeparator()
act_edit_cut = QAction('剪切(&T)', self)
act_edit_cut.setShortcut(Qt.CTRL + Qt.Key_X)
act_edit_cut.triggered.connect(self.text_editor.cut)
m_edit.addAction(act_edit_cut)
act_edit_copy = QAction('复制(&C)', self)
act_edit_copy.setShortcut(Qt.CTRL + Qt.Key_C)
act_edit_copy.triggered.connect(self.text_editor.copy)
m_edit.addAction(act_edit_copy)
act_edit_paste = QAction('粘贴(&P)', self)
act_edit_paste.setShortcut(Qt.CTRL + Qt.Key_V)
act_edit_paste.triggered.connect(self.text_editor.paste)
m_edit.addAction(act_edit_paste)
act_edit_del = QAction('删除(&L)', self)
act_edit_del.setShortcut(Qt.Key_Delete)
act_edit_del.triggered.connect(self.slot_edit_delete)
m_edit.addAction(act_edit_del)
m_edit.addSeparator()
act_edit_select_all = QAction('全选(&A)', self)
act_edit_select_all.setShortcut(Qt.CTRL + Qt.Key_A)
act_edit_select_all.triggered.connect(self.text_editor.selectAll)
m_edit.addAction(act_edit_select_all)
act_fmt_auto_line = QAction('自动换行(&W)', self)
act_fmt_auto_line.setCheckable(True)
act_fmt_auto_line.setChecked(True)
act_fmt_auto_line.triggered.connect(self.slot_format_auto_line)
m_format.addAction(act_fmt_auto_line)
act_help_about = QAction('关于(&A)...', self)
act_help_about.triggered.connect(self.slot_help_about)
m_help.addAction(act_help_about)
def msg_critical(self, strInfo):
dlg = QMessageBox(self)
dlg.setIcon(QMessageBox.Critical)
dlg.setText(strInfo)
dlg.show()
def slot_file_new(self):
self.text_editor.clear()
def slot_file_open(self):
path, _ = QFileDialog.getOpenFileName(self, '打开文件', '', '文本文件 (*.txt)')
if path:
try:
with open(path, 'rU') as f:
text = f.read()
except Exception as e:
self.msg_critical(str(e))
else:
self.path = path
self.text_editor.setPlainText(text)
def slot_file_save(self):
if self.path is None:
return self.slot_file_saveas()
self._saveToPath(self.path)
def slot_file_saveas(self):
path, _ = QFileDialog.getSaveFileName(self, '保存文件', '', '文本文件 (*.txt)')
if not path:
return self._slot_save_to_path(path)
def _slot_save_to_path(self, path):
text = self.text_editor.toPlainText()
try:
with open(path, 'w') as f:
f.write(text)
except Exception as e:
self.msg_critical(str(e))
else:
self.path = path
def slot_edit_delete(self):
tc = self.text_editor.textCursor()
tc.removeSelectedText()
def slot_format_auto_line(self, autoLine):
if autoLine:
self.text_editor.setLineWrapMode(QPlainTextEdit.WidgetWidth)
else:
self.text_editor.setLineWrapMode(QPlainTextEdit.NoWrap)
def slot_help_about(self):
QMessageBox.information(self, '实战PyQt5', 'PyQt5实现的文本编辑器演示版')
if __name__ == '__main__':
app = QApplication(sys.argv)
window = ToolButton()
window.show()
sys.exit(app.exec())