[Python] Editing overlays and borders for classic windows notepad

Discussão em 'Python' iniciado por Stack, Dezembro 6, 2024.

  1. Stack

    Stack Membro Participativo

    making a notepad clone of windows and cant get the tabs border to be the same border as the menubar

    from PyQt6.QtCore import Qt
    from PyQt6.QtGui import QIcon, QAction
    from PyQt6.QtWidgets import QApplication, QWidget, QVBoxLayout, QTextEdit, QFileDialog, QMenuBar, QPushButton, QLabel, QHBoxLayout, QStackedWidget

    class Notepad(QWidget):
    def __init__(self):
    super().__init__()

    self.setWindowTitle("Notepad with Tabs")
    self.setGeometry(100, 100, 800, 600)
    self.setWindowIcon(QIcon("icon.png")) # Ensure you have the correct icon.png file

    # Remove default title bar
    self.setWindowFlags(Qt.WindowType.FramelessWindowHint)

    # Main layout
    self.main_layout = QVBoxLayout(self)
    self.main_layout.setContentsMargins(0, 0, 0, 0)

    # Create the custom title bar with file menu
    self.create_custom_title_bar()

    # Create a stacked widget to manage content for each "tab"
    self.stacked_widget = QStackedWidget()
    self.main_layout.addWidget(self.stacked_widget)

    # Initialize the first tab
    self.new_file()

    def create_custom_title_bar(self):
    # Custom title bar layout
    title_bar_layout = QVBoxLayout()

    # Title bar top section
    title_bar_top = QHBoxLayout()

    # Add the application icon to the title bar (left side)
    self.icon_button = QLabel(self)
    self.icon_button.setPixmap(QIcon("icon.png").pixmap(16, 16)) # Ensure you have the correct icon.png file
    title_bar_top.addWidget(self.icon_button)

    # Add the window title
    self.window_title = QLabel("Notepad", self)
    self.window_title.setStyleSheet("color: white; font-size: 12px;")
    title_bar_top.addWidget(self.window_title)

    # Add a container for tab buttons (title bar tabs)
    self.tab_buttons_container = QHBoxLayout()
    title_bar_top.addLayout(self.tab_buttons_container)

    # Add a "New Tab" button to the right of the tab names
    self.new_tab_button = QPushButton("+", self)
    self.new_tab_button.clicked.connect(self.new_file)
    self.new_tab_button.setStyleSheet("background-color: transparent; border: none; color: white; font-size: 18px;")
    title_bar_top.addWidget(self.new_tab_button)

    # Add a spacer to push minimize, maximize buttons to the right
    title_bar_top.addStretch()

    # Minimize button (right side)
    self.minimize_button = QPushButton("_", self)
    self.minimize_button.clicked.connect(self.showMinimized)
    self.minimize_button.setFixedSize(25, 25) # Set fixed size
    self.minimize_button.setStyleSheet("background-color: transparent; border: none; color: white; font-size: 12px;")
    title_bar_top.addWidget(self.minimize_button)

    # Maximize button (right side)
    self.maximize_button = QPushButton("⬜", self)
    self.maximize_button.clicked.connect(self.showMaximized)
    self.maximize_button.setFixedSize(25, 25) # Set fixed size
    self.maximize_button.setStyleSheet("background-color: transparent; border: none; color: white; font-size: 12px;")
    title_bar_top.addWidget(self.maximize_button)

    # Close button (right side)
    self.close_button = QPushButton("X", self)
    self.close_button.clicked.connect(self.close)
    self.close_button.setFixedSize(25, 25) # Set fixed size
    self.close_button.setStyleSheet("background-color: transparent; border: none; color: white; font-size: 12px;")
    title_bar_top.addWidget(self.close_button)

    title_bar_layout.addLayout(title_bar_top)

    # Set the custom title bar layout to the window's layout
    self.main_layout.addLayout(title_bar_layout)

    def create_file_menu_bar(self, parent_widget):
    # Create a custom file menu bar
    menu_bar = QMenuBar(parent_widget)
    menu_bar.setStyleSheet("""
    background-color: #333333;
    color: white;
    border-bottom: 2px solid #444444;
    padding: 5px;
    font-size: 10px; # Lower font size for the menu items
    """)

    # Create File menu
    file_menu = menu_bar.addMenu("File")

    # Add actions to the File menu
    new_action = QAction("New", parent_widget)
    new_action.triggered.connect(self.new_file)
    file_menu.addAction(new_action)

    open_action = QAction("Open", parent_widget)
    open_action.triggered.connect(self.open_file)
    file_menu.addAction(open_action)

    return menu_bar

    def new_file(self):
    # Create a new tab with a text editor
    tab_content_widget = QWidget()
    tab_layout = QVBoxLayout(tab_content_widget)

    # Create the custom file menu bar and add it to the layout
    menu_bar = self.create_file_menu_bar(tab_content_widget)
    tab_layout.addWidget(menu_bar)

    # Create the text editor and add it to the layout
    text_edit = QTextEdit(self)
    text_edit.setStyleSheet("""
    background-color: #222222;
    color: white;
    font-family: Arial;
    font-size: 12px;
    border: 2px solid #444444;
    border-radius: 5px;
    """)
    tab_layout.addWidget(text_edit)

    # Apply border around the entire tab content (including menu bar and text editor)
    tab_content_widget.setStyleSheet("""
    border: 3px solid #444444;
    border-radius: 5px;
    padding: 5px;
    """)

    # Add this content to the stacked widget
    self.stacked_widget.addWidget(tab_content_widget)

    # Create a tab button for the title bar
    self.create_tab_button(tab_content_widget)

    def open_file(self):
    # Open a file dialog to select a file to open
    file_path, _ = QFileDialog.getOpenFileName(self, "Open File", "", "Text Files (*.txt);;All Files (*)")
    if file_path:
    with open(file_path, 'r') as file:
    content = file.read()

    # Create new tab and add content
    tab_content_widget = QWidget()
    tab_layout = QVBoxLayout(tab_content_widget)

    # Create the custom file menu bar and add it to the layout
    menu_bar = self.create_file_menu_bar(tab_content_widget)
    tab_layout.addWidget(menu_bar)

    # Create the text editor, set content, and add it to the layout
    text_edit = QTextEdit(self)
    text_edit.setText(content)
    text_edit.setStyleSheet("""
    background-color: #222222;
    color: white;
    font-family: Arial;
    font-size: 12px;
    border: 2px solid #444444;
    border-radius: 5px;
    """)
    tab_layout.addWidget(text_edit)

    # Apply border around the entire tab content (including menu bar and text editor)
    tab_content_widget.setStyleSheet("""
    border: 3px solid #444444;
    border-radius: 5px;
    padding: 5px;
    """)

    # Add this content to the stacked widget
    self.stacked_widget.addWidget(tab_content_widget)

    # Create a tab button for the title bar
    self.create_tab_button(tab_content_widget)

    def create_tab_button(self, tab_content_widget):
    # Create a button for the new tab in the title bar
    tab_button = QPushButton(f"Tab {self.stacked_widget.count()}", self)
    tab_button.setStyleSheet("""
    background-color: transparent;
    color: white;
    border: 1px solid #444444;
    padding: 5px;
    font-size: 14px;
    """)
    tab_button.clicked.connect(lambda: self.select_tab(tab_content_widget))
    self.tab_buttons_container.addWidget(tab_button)

    def select_tab(self, tab_content_widget):
    # Switch the active tab by changing the displayed widget in the stacked widget
    index = self.stacked_widget.indexOf(tab_content_widget)
    self.stacked_widget.setCurrentIndex(index)

    # Initialize the application
    app = QApplication(sys.argv)
    window = Notepad()
    window.show()
    sys.exit(app.exec())




    how do i get the borders like windows notepad

    [​IMG]

    [​IMG]

    how do i get the borders to one compared to windows where the tab and the menubar file dropdown are one border opened. do i do it from the menubar instead because that isnt working

    Continue reading...

Compartilhe esta Página