微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Qt:为什么在 QMainWindow 中添加状态栏会搞乱大小调整?

如何解决Qt:为什么在 QMainWindow 中添加状态栏会搞乱大小调整?

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

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

Properly sized window

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

Improperly sized window

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

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

代码如下。它在 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_()

解决方法

PyQt5-5.15.1 中,如果您添加

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

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

您使用哪个版本或PyQt5

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。