title: Adjust the size (width/height) of a custom QTableWidget
body: <p>I need a <code>QTableWidget</code> based on a <code>QTabelModel</code> and <code>QTableView</code> with some buttons added above the table. See the following figure:</p>
  
  <p><a href="https://i.stack.imgur.com/Clnyy.png" rel="noreferrer"><img src="https://i.stack.imgur.com/Clnyy.png" alt="enter image description here"></a></p>
  
  <p>The width of the <code>QTableWidget</code> should be adjusted so that it is not smaller than a reasonable minimum and not extend beyond the buttons above it; in particular, the size of the columns 1, 2, and 4 should be adjusted to their contents, and the 3rd column, <em>Aberrations</em>, should be expanded to fill in the gap on the right side. I'd like to know how to do this in code.</p>
  
  <p>The following is a minimal example of the code I use for the custom <code>QTableWidget</code> (PyQt5, Python3):</p>
  
  <pre class="lang-python prettyprint-override"><code>from PyQt5 import QtGui, QtCore, QtWidgets
  import numpy as np
  
  #-- Table Model
  class MyTableModel(QtCore.QAbstractTableModel):
  
      def __init__(self, data, parent=None, *args):
          super(MyTableModel, self).__init__(parent)
  
          # table data
          self.table_data = data
          self.rows_nr, self.columns_nr = data.shape
  
          # vertical &amp; horizontal header labels
          self.hheaders = ["Head-{}".format(i) for i in range(self.columns_nr)]
          self.vheaders = ["Row-{}".format(i) for i in range(self.rows_nr)]
  
      # nr of rows
      def rowCount(self, parent):
          return self.rows_nr
  
      # nr of columns
      def columnCount(self, parent):
          return self.columns_nr
  
      # row and column headers
      def headerData(self, section, orientation, role):
          if role == QtCore.Qt.DisplayRole:
              if orientation == QtCore.Qt.Horizontal:
                  return self.hheaders[section]
              #END if
  
          #ELSE:
          return QtCore.QVariant()
  
      # display table contents
      def data(self, index, role=QtCore.Qt.DisplayRole):        
          r_ = index.row()
          c_ = index.column()
  
          if role == QtCore.Qt.DisplayRole:
              return "{}".format(data[r_, c_])
          #ELSE:
          return QtCore.QVariant()
  
      # set data
      def setData(self, index, value, role):
  
          r_ = index.row()
          c_ = index.column()
  
          # editable fields
          if role == QtCore.Qt.EditRole:
              # interprete values
              self.table_data[r_,c_] = str(value)
  
          return True
  
      # view/edit flags
      def flags(self, index):
          r_ = index.row()
          c_ = index.column()
  
          return QtCore.Qt.ItemIsEnabled
  
  
  class MyTableWidget(QtWidgets.QWidget):
      def __init__(self, data, *args):
          super(MyTableWidget, self).__init__(*args)
  
          #-- table model
          tablemodel = MyTableModel(data=data, parent=self)
  
          #-- table view
          tableview = QtWidgets.QTableView()
          tableview.setModel(tablemodel)
          tableview.verticalHeader().hide() # hide vertical/row headers
  
          # size policy
          tableview.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustToContents)
          tableview.setSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
  
          #-- layouts
          #--- buttons
          button_hlayout = QtWidgets.QHBoxLayout()
          button_hlayout.addWidget(QtWidgets.QPushButton("Button 1"))
          button_hlayout.addWidget(QtWidgets.QPushButton("Button 2"))
          button_hlayout.addWidget(QtWidgets.QPushButton("Button 3"))
  
          #--- table
          table_layout = QtWidgets.QVBoxLayout()
          table_layout.addLayout(button_hlayout)
          table_layout.addWidget(tableview)
          self.setLayout(table_layout)
  #----------------------------------------
  
  #-- produce sample data
  data = np.empty(shape=(3,4), dtype=np.object)
  for r in range(3):
      for c in range(4):
          data[r,c] = str(list(range((r+1) * (c+1))))
  
  app = QtWidgets.QApplication([""])
  w = MyTableWidget(data=data)
  w.show()
  app.exec_()
  </code></pre>