Ниже приведен пример кода PyQt5, из-за которого у меня возникают проблемы с правильным размером группового поля или таблицы (не знаю, какой из них является проблемой).
По сути, у меня есть диалоговое окно с вертикальным расположением. Он всегда будет отображать групповое поле, содержащее таблицу A. Таблица A всегда будет иметь длину ровно 1 строка. 2-й групповой блок содержит таблицу B, которая представляет собой переменное количество строк, и групповой блок будет отображаться только в том случае, если таблица B содержит хотя бы 1 строку. В таблице A всегда будет 3 столбца, а в таблице B всегда будет 2 столбца.
Проблемы, по которым мне нужна помощь:
- Я хочу, чтобы групповое поле A изменило размер до таблицы A. Прямо сейчас его размер составляет примерно половину размера окна. Я понимаю, почему по умолчанию это так, но все, что я пытался переопределить, потерпело неудачу.
- Таблица 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_()