QTabWidget放在QMainWindow的中央组件中,拉伸过大覆盖了菜单栏

2 投票
1 回答
1239 浏览
提问于 2025-04-19 10:56

就是这样,一个QtabWidget被放到了QMainWindow的中央小部件里,但它拉伸得太大,覆盖了菜单栏。至少我觉得布局没什么问题,设置起来也很简单,但就是不管用。我知道导入的部分有点麻烦 :) 我在Windows上使用的是最新的PyQt5。有什么想法吗?

from PyQt5.Qt import *


class MainWindow(QMainWindow):

def __init__(self, parent=None):
    super(MainWindow, self).__init__(parent)
    self.setBaseSize(800, 600)
    self.controllerMonitors = []
    self.setWindowTitle("Window")
    sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
    sizePolicy.setHorizontalStretch(0)
    sizePolicy.setVerticalStretch(0)
    sizePolicy.setHeightForWidth(self.sizePolicy().hasHeightForWidth())
    self.setSizePolicy(sizePolicy)
    self.setMinimumSize(QSize(800, 450))

    #--------
    # Menu
    #--------
    self.menuBar = QMenuBar(self)
    self.menuBar.setGeometry(QRect(0, 0, 800, 26))

    self.menu = QMenu(self.menuBar)
    self.menu.setTitle("Файл")

    self.actionSettings = QAction(self)
    self.actionSettings.setText("Настройки")
    self.actionExit = QAction(self)
    self.actionExit.setText("Изход")

    self.menu.addAction(self.actionSettings)
    self.menu.addAction(self.actionExit)

    self.menuBar.addAction(self.menu.menuAction())
    self.menu.addAction(self.actionSettings)
    self.menu.addAction(self.actionExit)

    self.actionExit.triggered.connect(self.close)

    #---------
    # Toolbar
    #---------
    # self.mainToolBar = QToolBar(self)
    # self.mainToolBar.setObjectName("mainToolBar")
    # self.addToolBar(Qt.TopToolBarArea, self.mainToolBar)

    #----------------
    # Central widget
    #----------------
    centralWidget = QWidget(self)
    centralWidgetLayout = QVBoxLayout(centralWidget)
    centralWidget.setLayout(centralWidgetLayout)

    # sizePolicy1 = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred)
    # sizePolicy1.setHorizontalStretch(0)
    # sizePolicy1.setVerticalStretch(0)
    # sizePolicy1.setHeightForWidth(centralWidget.sizePolicy().hasHeightForWidth())
    # centralWidget.setSizePolicy(sizePolicy1)
    centralWidget.setContextMenuPolicy(Qt.NoContextMenu)

    tabContainer = QTabWidget(centralWidget)

    tab1 = QWidget(tabContainer)
    te = QTextEdit(tab1)
    tab1layout = QVBoxLayout(tab1)
    tab1.setLayout(tab1layout)
    tab1layout.addWidget(te)

    tabContainer.addTab(tab1, "Tab 1")
    tabContainer.setCurrentIndex(0)
    centralWidgetLayout.addWidget(tabContainer)

    self.setCentralWidget(centralWidget)

还有main.py

import sys
from PyQt5.QtWidgets import QApplication


from MainWindow import MainWindow


def main(argv):
    app = QApplication(argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec())

if __name__=="__main__":
    main(sys.argv)

1 个回答

1

问题不在于标签控件,而是在于菜单栏。

QMainWindow类已经有一个内置的方法可以用来创建菜单栏,所以你不需要自己去创建一个。(你示例中的菜单栏被标签控件遮住的原因是因为你没有把它添加到布局中)。

你示例中菜单的设置代码可以简化为:

    #--------
    # Menu
    #--------

    self.menu = self.menuBar().addMenu("Файл")
    self.actionSettings = self.menu.addAction("Настройки")
    self.actionExit = self.menu.addAction("Изход")
    self.actionExit.triggered.connect(self.close)

    #---------

撰写回答