Can't resize containers in scrollArea

Maurizio Berti maurizio.berti at gmail.com
Fri Aug 27 17:33:53 BST 2021


Well, you are setting a Fixed horizontal policy on the tables, which means
that they cannot be "shrunk" even if they could, and they will then use
their default size hint (which is usually 256x192 for widgets that inherit
from QAbstractScrollArea, so, all item views).

Assuming that the table contents are not going to change, the solution is
to set a fixed width based on the contents, and the width is computed by
the sum of:

- the horizontal header length();
- the vertical header size hint width;
- the vertical scroll bar size hint width;
- the frame width of the view, multiplied by two (left and right side);

            width = (
                h_header.length() +
                table.verticalHeader().sizeHint().width() +
                table.verticalScrollBar().sizeHint().width() +
                table.frameWidth() * 2
            )
            table.setFixedWidth(width)

Note that the above will only work *after* setting the header labels *and*
filling the whole table.

A better implementation would use a subclass of the table widget and update
the fixed width whenever the model changes (row/column amount, data
changed).

On an unrelated matter, please consider that you should **NEVER** modify
the files generated by pyuic, and you should instead implement the logic
(including the dynamic table creation) in a separate script, and then use a
subclass of QMainWindow (or the QWidget subclass used in Designer, like
QDialog for instance) *and* the imported form class, as suggested for the
multiple inheritance method in the official PyQt guidelines about using
Designer: https://www.riverbankcomputing.com/static/Docs/PyQt5/designer.html

Maurizio

Il giorno ven 27 ago 2021 alle ore 14:27 paparucino <paparucino at gmail.com>
ha scritto:

> Hello, I'm new to the list and besides apologizing for any errors please
> correct me so I can improve.
> My problem is that I can't delete the white space after the table with
> the data. Pls look at the attached drawing.
> The script I use is the one below.
> I noticed that whatever the value used for the various sizes (apart from
> MainWindow.resize (900, 650)) none of them affect the size of both the
> internal table and its container. I guess they are default values and I
> am not able to change them.
> Any help is appreciated.
>
> ===================
>
> import calendar
> from functions import *
> from PyQt5 import QtCore, QtGui, QtWidgets
> from PyQt5.QtWidgets import QMainWindow, QApplication, QPushButton
>
>
> class SpecialStyledItemDelegate(QtWidgets.QStyledItemDelegate):
>      def __init__(self, parent=None):
>          super().__init__(parent)
>          self._values = dict()
>
>      def add_text(self, text, row):
>          self._values[row] = text
>
>      def initStyleOption(self, option, index):
>          super().initStyleOption(option, index)
>          row = index.row()
>          if row in self._values:
>              option.text = self._values[row]
>              option.displayAlignment = QtCore.Qt.AlignCenter
>
>
> class Ui_MainWindow(QMainWindow):
>      def __init__(self):
>          super().__init__()
>          self.setupUi(self)
>
>      def setupUi(self, MainWindow):
>
>          MainWindow.setObjectName("MainWindow")
>          MainWindow.resize(900, 650)
>          self.centralwidget = QtWidgets.QWidget(MainWindow)
>          self.centralwidget.setObjectName("centralwidget")
>
>          self.horizontalLayout = QtWidgets.QHBoxLayout(self.centralwidget)
>          self.horizontalLayout.setObjectName("horizontalLayout")
>
>          self.scrollArea = QtWidgets.QScrollArea(self.centralwidget)
>          self.scrollArea.setWidgetResizable(True)
>          self.scrollArea.setObjectName("scrollArea")
>          self.scrollAreaWidgetContents = QtWidgets.QWidget()
>          #self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0,
> 0, 0))
> self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents")
>          self.layout = QtWidgets.QHBoxLayout(self.scrollAreaWidgetContents)
>          #self.layout.setContentsMargins(0, 0, 0, 0)
>          self.layout.setObjectName("layout")
>
>
>          conn = x
>          cursor = conn.cursor(buffered=True, dictionary=True)
>          mese = '9'
>          anno = '2021'
>
>          self.alphamese = Functions.convert_number_month[mese]
>          daysinmonth = calendar.monthrange(int(anno), int(mese))[1]
>          query = "SELECT * FROM `alldata` WHERE anno = '%s' AND mese =
> '%s'" % (anno, mese)
>          cursor.execute(query)
>          search = cursor.fetchall()
>          zz = 'table_'
>          cc = 0
>          for row in search:
>              self.vol_name = row['nome']
>              self.c_query = "SELECT grp FROM volontari WHERE cognome =
> '%s'" % (self.vol_name)
>              cursor.execute(self.c_query)
>              self.grp = cursor.fetchall()
>              for val in self.grp:
>                  table ='zz%s'%(str(cc))
>                  cc = cc+1
>                  self.group = val['grp']
>                  if self.group == 'C':
>
>                      table = QTableWidget(self.scrollAreaWidgetContents)
>                      table.setGeometry(QtCore.QRect(0, 5, 150, 597))
>                      sizePolicy =
> QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed,
> QtWidgets.QSizePolicy.Expanding)
>                      #sizePolicy.setHorizontalStretch(50)
>                      #sizePolicy.setVerticalStretch(50)
> #sizePolicy.setHeightForWidth(table.sizePolicy().hasHeightForWidth())
>                      table.setSizePolicy(sizePolicy)
>                      table.setObjectName("StripTable")
>                      table.setRowCount(33)
>                      table.setColumnCount(3)
>
>                      self.special_delegate = SpecialStyledItemDelegate()
>                      table.setItemDelegate(self.special_delegate)
>
>                      h_header = table.horizontalHeader()
>                      h_header.hide()
>                      for i in range(h_header.count() - 1):
>                          h_header.setSectionResizeMode(i,
> QtWidgets.QHeaderView.ResizeToContents)
>                      h_header.setSectionResizeMode(2,
> QtWidgets.QHeaderView.Fixed)
>                      v_header = table.verticalHeader()
>                      v_header.hide()
>                      v_header.setDefaultSectionSize(17)
>
>                      table.setSpan(1, 0, 1, 3)
>                      table.setSpan(0, 0, 1, 3)
>
>                      zz = 1
>                      self.m_query = "SELECT * FROM `alldata` WHERE anno
> = '%s' AND mese = '%s' AND nome = '%s'" % (
>                      anno, mese, self.vol_name)
>                      cursor.execute(self.m_query)
>                      result = cursor.fetchall()
>                      self.special_delegate.add_text(self.vol_name, 0)
>                      self.special_delegate.add_text(self.alphamese, 1)
>
>                      #daysinmonth = 30
>                  while zz <= daysinmonth:
>                      for inrow in result:
>                          ##
>                          # Writes data in cell tables
>                          ##
>                          day = 'd' + str(zz)
>                          self.value = inrow[day]
>                          a_date = datetime.date(int(anno), int(mese), zz)
>                          self.dow = a_date.strftime("%a")
>                          self.dow = Functions.convert_en_it[self.dow]
>                          if (self.dow == 'Sun' or self.dow == 'Sat') and (
>                                  self.value == 'P' or self.value == 'D'
> or self.value == 'F' or self.value == 'B'):
>                              self.value = Functions.eva_mp1[self.value]
>                          else:
>                              self.value = Functions.eva_mp[self.value]
>                          table.setItem(zz + 1, 0,
> QtWidgets.QTableWidgetItem(str(zz)))
>                          table.setItem(zz + 1, 1,
> QtWidgets.QTableWidgetItem(self.dow))
>                          item = QtWidgets.QTableWidgetItem(self.value)
> item.setTextAlignment(QtCore.Qt.AlignCenter)
>                          table.setItem(zz + 1, 2, item)
>                          zz += 1
>              self.layout.addWidget(table)
>
> self.scrollArea.setWidget(self.scrollAreaWidgetContents)
>              self.horizontalLayout.addWidget(self.scrollArea)
>              MainWindow.setCentralWidget(self.centralwidget)
>
>              self.retranslateUi(MainWindow)
>              QtCore.QMetaObject.connectSlotsByName(MainWindow)
>
>      def retranslateUi(self, MainWindow):
>          _translate = QtCore.QCoreApplication.translate
>          MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
>
>
>
>
>      def show_new_window(self):
>          print('Printato')
>          pass
>
> app = QApplication(sys.argv)
>
> window = Ui_MainWindow()
> window.show()
>
> app.exec()
>
>
>
>

-- 
È difficile avere una convinzione precisa quando si parla delle ragioni del
cuore. - "Sostiene Pereira", Antonio Tabucchi
http://www.jidesk.net
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://www.riverbankcomputing.com/pipermail/pyqt/attachments/20210827/ff828d70/attachment-0001.htm>


More information about the PyQt mailing list