放在 QMainWindow 的 Central Widget 中的 QTabWidget 拉伸太多并覆盖了菜单栏

Posted

技术标签:

【中文标题】放在 QMainWindow 的 Central Widget 中的 QTabWidget 拉伸太多并覆盖了菜单栏【英文标题】:QTabWidget put in the Central Widget of QMainWindow is stretching too much and covers the menu bar 【发布时间】:2014-09-02 19:37:02 【问题描述】:

这是一个 QtabWidget 被放入 QMainWindow 的 Central Widget 并且它拉伸太多并且覆盖了菜单栏。至少我看不出布局有什么问题,而且它很简单,但对我不起作用。我知道导入很糟糕:) 我正在使用最新的 PyQt5 for Windows。有什么想法吗?

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】:

问题不在于选项卡小部件:而在于菜单栏。

QMainWindow class 已经有一个 built-in method 用于创建一个男士酒吧,所以你不需要自己创建一个。 (示例中的菜单栏被选项卡小部件覆盖的原因是您没有将其添加到布局中)。

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

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

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

    #---------

【讨论】:

非常感谢 :) 我没有注意到。

以上是关于放在 QMainWindow 的 Central Widget 中的 QTabWidget 拉伸太多并覆盖了菜单栏的主要内容,如果未能解决你的问题,请参考以下文章

PyQt 在 QMainWindow 中创建 QDialog

Python:QMainWindow 对话框关闭后如何关闭(或退出)Python 进程

我在 Python2 的 QMainWindow 中看不到 QLabel 和 QLineEdit 小部件

如何从父级不是 QMainWindow 的 QWidget 访问 QMainWindow

在 Pyqt4 中用不同的 QMainWindow 刷新 QMainWindow

QT:在其他窗口中显示QMainWindow