Qt:为啥在 QMainWindow 中添加状态栏会影响大小调整?

Posted

技术标签:

【中文标题】Qt:为啥在 QMainWindow 中添加状态栏会影响大小调整?【英文标题】:Qt: Why does adding a status bar to QMainWindow messes up size adjustment?Qt:为什么在 QMainWindow 中添加状态栏会影响大小调整? 【发布时间】:2021-04-18 08:47:16 【问题描述】:

在一个示例 Qt 应用程序中,我创建了一个 QMainWindow,并以 QTableView 作为其中心小部件(参见问题末尾的代码)。

重要的是,计算主窗口的大小以适合表格:

但是,如果我添加状态栏,则不再计算大小以完全适合表格。有一点table被隐藏了,提示table view添加滚动条:

这似乎不应该发生。仅仅添加一个状态栏不应阻止主窗口相应地适应其内容。

如何避免这种情况而不必手动计算必要的大小(这当然不容易维护,因为每次窗口中的设计和小部件更改时都必须重新计算)?

代码如下。它在 PyQt 中,但不是特定于 Python 的,我相信同样的问题应该出现在 C++ 中。

import sys

from PyQt5 import QtCore, QtWidgets
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QMainWindow, QTableView, QStatusBar

use_status_bar = False  # includes a status bar; but also messes up the size adjustment


class TableModel(QtCore.QAbstractTableModel):
    def __init__(self):
        super().__init__()

    def data(self, index, role=None):
        if role == Qt.DisplayRole:
            return 42

    def rowCount(self, index):
        return 10

    def columnCount(self, index):
        return 4


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("A simple table app")

        self.tableView = QTableView()

        self.model = TableModel()
        self.tableView.setModel(self.model)
        self.tableView.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustToContents)

        if use_status_bar:
            self.setStatusBar(QStatusBar(self))

        self.setCentralWidget(self.tableView)


app = QApplication(sys.argv)
w = MainWindow()
w.show()
app.exec_()

【问题讨论】:

【参考方案1】:

PyQt5-5.15.1 中,如果您添加,它会按预期工作

self.tableView.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
self.tableView.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)

(否则表格左侧和底部会有两个空白区域)。

您使用哪个版本或PyQt5

【讨论】:

我用的是同一个版本。是的,它可以在没有滚动条的情况下工作,但我们不应该仅仅因为我们添加了一个状态栏就必须关闭滚动条来调整窗口大小。 这很奇怪,我无法复制第二张图片,一切正常 感谢您的检查。但是,如果一切正常,您为什么在回答中说它按预期工作 if 一个删除滚动条?而且,顺便说一句,您使用的是哪个操作系统?我在 Windows 10 上。 如果我不删除滚动条,我会在表格旁边看到空白区域,而不是像 image2 上的滚动条。我也是win10。 i.imgur.com/9BcvYif.png

以上是关于Qt:为啥在 QMainWindow 中添加状态栏会影响大小调整?的主要内容,如果未能解决你的问题,请参考以下文章

Qt 向 QMainWindow 添加非菜单栏键盘快捷键

Qt学习三 - 菜单栏工具栏状态栏

Qt 状态栏设置

QT从控件部分知识点整理

QT_4-QMainWindow

5.2.4 添加状态栏