请求为PyQt5代码编辑器添加File和Edit基础菜单栏
Hey there! No problem at all—adding a basic menu bar to your code editor is straightforward. We just need to wrap your QCodeEditor in a QMainWindow (since that's where menu bars live in PyQt5) and add the File/Edit menus with placeholder actions (no functionality yet, just as you asked).
Here's the modified full code with the menu bar included:
#!/usr/bin/python3 # QcodeEditor.py by acbetter. # -*- coding: utf-8 -*- from PyQt5.QtCore import Qt, QRect, QSize from PyQt5.QtWidgets import (QWidget, QPlainTextEdit, QTextEdit, QMainWindow, QMenu, QAction) # Added required menu components from PyQt5.QtGui import QColor, QPainter, QTextFormat class QLineNumberArea(QWidget): def __init__(self, editor): super().__init__(editor) self.codeEditor = editor def sizeHint(self): return QSize(self.codeEditor.lineNumberAreaWidth(), 0) def paintEvent(self, event): self.codeEditor.lineNumberAreaPaintEvent(event) class QCodeEditor(QPlainTextEdit): def __init__(self, parent=None): super().__init__(parent) self.lineNumberArea = QLineNumberArea(self) self.blockCountChanged.connect(self.updateLineNumberAreaWidth) self.updateRequest.connect(self.updateLineNumberArea) self.cursorPositionChanged.connect(self.highlightCurrentLine) self.updateLineNumberAreaWidth(0) def lineNumberAreaWidth(self): digits = 1 max_value = max(1, self.blockCount()) while max_value >= 10: max_value /= 10 digits += 1 space = 3 + self.fontMetrics().width('9') * digits return space def updateLineNumberAreaWidth(self, _): self.setViewportMargins(self.lineNumberAreaWidth(), 0, 0, 0) def updateLineNumberArea(self, rect, dy): if dy: self.lineNumberArea.scroll(0, dy) else: self.lineNumberArea.update(0, rect.y(), self.lineNumberArea.width(), rect.height()) if rect.contains(self.viewport().rect()): self.updateLineNumberAreaWidth(0) def resizeEvent(self, event): super().resizeEvent(event) cr = self.contentsRect() self.lineNumberArea.setGeometry(QRect(cr.left(), cr.top(), self.lineNumberAreaWidth(), cr.height())) def highlightCurrentLine(self): extraSelections = [] if not self.isReadOnly(): selection = QTextEdit.ExtraSelection() lineColor = QColor(Qt.yellow).lighter(160) selection.format.setBackground(lineColor) selection.format.setProperty(QTextFormat.FullWidthSelection, True) selection.cursor = self.textCursor() selection.cursor.clearSelection() extraSelections.append(selection) self.setExtraSelections(extraSelections) def lineNumberAreaPaintEvent(self, event): painter = QPainter(self.lineNumberArea) painter.fillRect(event.rect(), Qt.lightGray) block = self.firstVisibleBlock() blockNumber = block.blockNumber() top = self.blockBoundingGeometry(block).translated(self.contentOffset()).top() bottom = top + self.blockBoundingRect(block).height() height = self.fontMetrics().height() while block.isValid() and (top <= event.rect().bottom()): if block.isVisible() and (bottom >= event.rect().top()): number = str(blockNumber + 1) painter.setPen(Qt.black) painter.drawText(0, top, self.lineNumberArea.width(), height, Qt.AlignRight, number) block = block.next() top = bottom bottom = top + self.blockBoundingRect(block).height() blockNumber += 1 if __name__ == '__main__': import sys from PyQt5.QtWidgets import QApplication app = QApplication(sys.argv) # Create a main window to host the menu bar and editor main_window = QMainWindow() codeEditor = QCodeEditor() main_window.setCentralWidget(codeEditor) # Build the menu bar menu_bar = main_window.menuBar() # Add File menu with placeholder actions file_menu = menu_bar.addMenu("File") file_menu.addAction(QAction("New", main_window)) file_menu.addAction(QAction("Open", main_window)) file_menu.addAction(QAction("Save", main_window)) # Add Edit menu with placeholder actions edit_menu = menu_bar.addMenu("Edit") edit_menu.addAction(QAction("Cut", main_window)) edit_menu.addAction(QAction("Copy", main_window)) edit_menu.addAction(QAction("Paste", main_window)) main_window.show() sys.exit(app.exec_())
Key Changes Made:
- Added imports for
QMainWindow,QMenu, andQAction(these are essential for creating menu bars in PyQt5) - Wrapped your
QCodeEditorinside aQMainWindow—this is the standard way to add menu bars to PyQt applications - Created the File and Edit menus, each with common placeholder actions (they won't do anything when clicked, but they'll display as requested)
When you run this code, you'll see the menu bar at the top of the window with File and Edit dropdowns containing the placeholder options.
内容的提问来源于stack exchange,提问作者Amith Magajikondi




