python qt:自动调整主窗口大小以适应内容

时间:2016-01-06 15:44:40

标签: qt pyqt resize qtablewidget

我有一个主窗口,其中包含一个主窗口小部件,其中设置了垂直布局。仅为布局添加QTableWidget(暂时)。

当我启动应用程序并在main_window上调用show时,只显示部分QTableWidget。我可以手动扩展窗口以查看所有内容,但我希望窗口的大小很好地适应QTableWidget的大小。

谷歌搜索问题发现很多帖子关于如何使用调整大小到任意大小,并调用resize(int)工作正常,但这不是我要求的

很多其他帖子都不够明确,例如“使用sizePolicy”或“使用frameGeometry”或“使用几何”或“使用sizeHint”。我相信他们所有人都可能是正确的,但这是一个如何令人敬畏的例子。

4 个答案:

答案 0 :(得分:3)

在布局后放置所需的所有元素后,您可以在MainWindow内执行此类操作:

self.setFixedSize(self.layout.sizeHint())

这会将MainWindow的大小设置为布局的大小,这是使用布局中排列的小部件的大小计算的。

答案 1 :(得分:0)

我认为覆盖QTableWidget上的sizeHint()是关键:

import sys
from PyQt5.QtCore import QSize
from PyQt5.QtWidgets import QApplication, QMainWindow, QTableWidget

class Table(QTableWidget):
  def sizeHint(self):
    horizontal = self.horizontalHeader()
    vertical = self.verticalHeader()
    frame = self.frameWidth() * 2
    return QSize(horizontal.length() + vertical.width() + frame,
                 vertical.length() + horizontal.height() + frame)

class Main(QMainWindow):
  def __init__(self, parent=None):
    super(Main, self).__init__(parent)
    top = Table(3, 5, self)
    self.setCentralWidget(top)

if __name__ == '__main__':
  app = QApplication(sys.argv)
  main = Main()
  main.show()
  sys.exit(app.exec_())

答案 2 :(得分:0)

您可以使用sizeHint(),但不能按照其他答案中的说明使用。 sizeHint()返回具有宽度和高度的QSize对象。假设您有一个主窗口mainWindow和一个名为content的小部件。如果您调整大小需要content来变大,则可以像这样使mainWindow适应它:

mainWindow.resize(mainWindow.sizeHint().width,
        mainWindow.size().height() + content.sizeHint().height());

答案 3 :(得分:0)

年纪大了,但我有一段时间经历了,并且看到这里的答案对我来说并不完全有效。

这就是我所做的:

请确保已正确设置“主窗口”的中央小部件,并且布局的父级是中央小部件, 然后根据需要为主窗口/窗口小部件设置一个大小策略。


from PyQt5 import QtCore, QtGui, QtWidgets
import sys

class RandomWidget(QtWidgets.QWidget):

    def __init__(self, parent=None):
        super(RandomWidget, self).__init__(parent)
        self.layout = QtWidgets.QVBoxLayout()
        self.setLayout(self.layout)
        self.ui()
        self.layout.addWidget(self.table)
        self.layout.addWidget(self.table2)

    def ui(self):
        self.table = QtWidgets.QTableWidget()
        self.table.setMinimumSize(800,200)
        self.table2 = QtWidgets.QTableWidget()

class Mainwindow(QtWidgets.QMainWindow):

    def __init__(self):
        self.widget = None
        super(Mainwindow, self).__init__()
        self.setWindowTitle('test')

    def ui(self):
        self.setCentralWidget(self.widget)
        self.show()
    

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    Window = Mainwindow()
    Window.widget = RandomWidget(Window)
    Window.ui()
    sys.exit(app.exec_())