如何将桌子放在窗口中心(设置桌子位置)

2024-04-26 17:30:45 发布

您现在位置:Python中文网/ 问答频道 /正文

所以,我正在开发一个应用程序,并使用QTableWidget生成一个表。我想把桌子放在窗户的中央,但我找不到办法,它占用了太多的空间,而且在窗户的左上角卡住了。我将表格和按钮放在QVBoxLayout中,表格(底部和右侧)后有一些空白,然后是远离表格的按钮

这就是它的样子

这就是我想要的

现在我的代码是这样的:

from PyQt5.QtWidgets import  QHeaderView, QPushButton, QMainWindow, QApplication, QMenuBar, QAction, QFileDialog, QWidget, QTableView, QVBoxLayout, QHBoxLayout, QTableWidget, QTableWidgetItem
from PyQt5.QtCore import QAbstractTableModel, Qt
from PyQt5 import QtGui
import sys

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

        self.createWindow()

        self.show()


    def createWindow(self):
        self.setWindowTitle('Pós Graduação')
        self.setWindowIcon(QtGui.QIcon('icon.ico'))
        self.setGeometry(300, 100, 700, 600)

        self.table_widget = TableWidget(self)
        self.setCentralWidget(self.table_widget)


class TableWidget(QWidget):

    def __init__(self, parent):        
        super(TableWidget, self).__init__(parent)
        self.layout = QVBoxLayout(self)
        self.creatingTable(parent)
        #self.setLayout(self.layout)


    def creatingTable(self, parent):

        tableWidget = QTableWidget()


        tableWidget.setRowCount(6)
        tableWidget.setColumnCount(4)

        tableWidget.horizontalHeader().setVisible(False)
        tableWidget.verticalHeader().setVisible(False)

        header = tableWidget.horizontalHeader()       
        header.setSectionResizeMode(2, QHeaderView.ResizeToContents)
        header.setSectionResizeMode(3, QHeaderView.ResizeToContents)

        self.layout.addWidget(tableWidget)
        self.button1 = QPushButton("Button 1")
        self.layout.addWidget(self.button1)
        self.setLayout(self.layout)


if __name__ == '__main__':
    App = QApplication(sys.argv)
    App.setStyle('Fusion')
    window = MyApp()
    sys.exit(App.exec())

Tags: fromimportselfinitdefsyspyqt5表格
1条回答
网友
1楼 · 发布于 2024-04-26 17:30:45

项目视图有一个Qt的默认大小“提示”,这是小部件建议的最适合显示其内容并使其尽可能可用的大小。此外,每个小部件都有一个^{}属性,它告诉小部件作为布局的一部分时的行为(如果它收缩、增长、具有固定大小等)

像QTableWidget(及其祖先QTableView)这样的项目视图并没有显式地公开它们的内容,这是出于显而易见的原因:一个表可能有数千行和数千列,布局不应该真正关心它们

为了能够根据其内容调整表的大小,表必须循环浏览所有内容,要做到这一点,最好在内容改变大小时进行。最好的方法可能是连接到模型和头提供的信号,并在每次激发它们时设置一个固定的大小,通过子类化可以更好地实现这一点

class TableWidgetSubclass(QTableWidget):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # update the size each time columns or rows are changed
        self.model().columnsInserted.connect(self.updateSize)
        self.model().columnsRemoved.connect(self.updateSize)
        self.model().rowsInserted.connect(self.updateSize)
        self.model().rowsRemoved.connect(self.updateSize)

        # the same, when a section is resized; note that Qt requires some "time"
        # to do so, so the call to the update function has to be delayed
        self.horizontalHeader().sectionResized.connect(lambda: QTimer.singleShot(0, self.updateSize))
        self.verticalHeader().sectionResized.connect(lambda: QTimer.singleShot(0, self.updateSize))

        # ensure that the widget uses only the maximum required size
        self.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Maximum)

        # and disable the scrollbars
        self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)

    def updateSize(self):
        width = 0
        header = self.horizontalHeader()
        # go through each column and add its size
        for s in range(self.model().columnCount()):
            width += header.sectionSize(s)

        height = 0
        header = self.verticalHeader()
        # the same for rows
        for s in range(self.model().rowCount()):
            height += header.sectionSize(s)

        size = QSize(width, height)
        # since we've connected a lot of signals and the model could still
        # be empty when calling this slot, ensure that the size is valid
        if size.isValid():
            self.setFixedSize(size)

最后,当向布局添加小部件时,它通常会使用尽可能多的空间。如果没有,则根据默认的左上角对齐。要避免这种情况,请通过指定对齐方式添加小部件:

class TableWidget(QWidget):

    def __init__(self, parent):        
        super(TableWidget, self).__init__(parent)
        QVBoxLayout(self)
        self.creatingTable(parent)

    def creatingTable(self, parent):

        tableWidget = TableWidgetSubclass()
        # ...
        self.layout().addWidget(tableWidget, alignment=Qt.AlignCenter)
        self.button1 = QPushButton("Button 1")
        self.layout().addWidget(self.button1, alignment=Qt.AlignCenter)

the centered table

注意:正如您所看到的,我没有使用self.layout =,然后我使用了self.layout()。这有两个原因:

  1. 您应该永远不要覆盖基本类属性(layout是每个QWidget的属性)
  2. 将目标属性添加到布局构造函数时,该布局将自动应用于小部件,并且无需再次使用setLayout,因为它已经隐式调用了

相关问题 更多 >