You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

请求为PyQt5代码编辑器添加File和Edit基础菜单栏

Adding a Basic Menu Bar to Your QCodeEditor

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, and QAction (these are essential for creating menu bars in PyQt5)
  • Wrapped your QCodeEditor inside a QMainWindow—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

火山引擎 最新活动