Проблемы с размером QGroupBox / QTableWidget

Ниже приведен пример кода PyQt5, из-за которого у меня возникают проблемы с правильным размером группового поля или таблицы (не знаю, какой из них является проблемой).

По сути, у меня есть диалоговое окно с вертикальным расположением. Он всегда будет отображать групповое поле, содержащее таблицу A. Таблица A всегда будет иметь длину ровно 1 строка. 2-й групповой блок содержит таблицу B, которая представляет собой переменное количество строк, и групповой блок будет отображаться только в том случае, если таблица B содержит хотя бы 1 строку. В таблице A всегда будет 3 столбца, а в таблице B всегда будет 2 столбца.

Проблемы, по которым мне нужна помощь:

  1. Я хочу, чтобы групповое поле A изменило размер до таблицы A. Прямо сейчас его размер составляет примерно половину размера окна. Я понимаю, почему по умолчанию это так, но все, что я пытался переопределить, потерпело неудачу.
  2. Таблица B представляет собой переменный размер, содержащий N строк данных, из которых X строк являются видимыми. Я хочу, чтобы он был размером с min (N, X) строк. Если пользователь растягивает окно по вертикали, он может увеличить X. Я не знаю, что такое X, но где-то между 5 и 10 строками. Было бы неплохо, если бы пользователю не разрешалось растягивать окно за пределы N строк.

Заранее спасибо!

import sys

from PyQt5 import QtCore, QtWidgets, QtGui
from PyQt5.QtWidgets import  *
from PyQt5.QtCore import Qt

nrows = 6

class TablesDialog(QDialog):
    def __init__(self):
        super().__init__()

    def set_header(self, table, cols):
        header = table.horizontalHeader()
        header.setDefaultAlignment(Qt.AlignLeft)
        
        for c in range(cols):
            header.setSectionResizeMode(c, QtWidgets.QHeaderView.Stretch)

    def setupUi(self, nrows):
        
        self.setObjectName("Dialog")
        self.resize(600, 600)
        self.dlgLayout = QVBoxLayout()
        self.sumLayout = QVBoxLayout()
        self.detLayout = QGridLayout()

        self.sumGBox = QGroupBox("Group Box Table A")
        self.detGBox = QGroupBox("Group Box Table B")
        
        # assign the form to each group box
        self.sumGBox.setLayout( self.sumLayout )
        self.detGBox.setLayout( self.detLayout )        

        # summary table
        self.stable = QTableWidget()
        self.stable.setColumnCount(3)
        self.stable.setRowCount(1)
        self.stable.verticalHeader().setVisible(0)
        # set stable header
        self.stable.setHorizontalHeaderLabels(
            ['Total', 'Passed', 'Failed'])
        self.set_header(self.stable, 3)

        # Populate summary table
        cell = QTableWidgetItem("6")
        self.stable.setItem(0, 0, cell)
        cell = QTableWidgetItem("4")
        self.stable.setItem(0, 1, cell)
        cell = QTableWidgetItem("2")
        self.stable.setItem(0, 2, cell)
        self.sumLayout.addWidget(self.stable)

        # detail table
        self.dtable = QTableWidget()
        self.dtable.setColumnCount(2)
        self.dtable.setRowCount(nrows)

        # set table header
        self.dtable.setHorizontalHeaderLabels(
            ['Name', 'Result'])
        self.dtable.setSelectionBehavior(QtWidgets.QTableView.SelectRows)

        self.set_header(self.dtable, 2)
        
        self.detLayout.addWidget(self.dtable)

        for r in range(nrows):
            cell = QTableWidgetItem("Row %d-0" %r)
            self.dtable.setItem(r, 0, cell)
            cell = QTableWidgetItem("Row %d-1" %r)            
            self.dtable.setItem(r, 1, cell)
            
        # Add OK button
        self.buttonBox = QtWidgets.QDialogButtonBox(self)
        self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
        self.buttonBox.setStandardButtons(QDialogButtonBox.Ok)
        self.buttonBox.setObjectName("buttonBox")

        self.dlgLayout.addWidget(self.sumGBox )
        if nrows > 0:
            self.dlgLayout.addWidget(self.detGBox )
        
        self.dlgLayout.addWidget(self.buttonBox )

        self.buttonBox.accepted.connect(self.accept)
        self.buttonBox.rejected.connect(self.reject)
        QtCore.QMetaObject.connectSlotsByName(self)
        self.setLayout(self.dlgLayout)


if len(sys.argv) == 2:
    nrows = int(sys.argv[1])

app = QApplication(sys.argv)
dlg = TablesDialog()
dlg.setupUi(nrows)
dlg.show()

app.exec_()

person Kory    schedule 22.08.2020    source источник