class ItemsViewTableModel(QtCore.QAbstractTableModel):
    def __init__(self, parent: QtCore.QObject = None) -> None:
        super().__init__(parent)
        self.headers = []
        self.items = []
    
    def setHeaders(self, headers):
        self.beginResetModel()
        self.headers = headers
        self.endResetModel()

    def setItems(self, items):
        self.beginResetModel()
        self.items = items
        self.endResetModel()
    
    def rowCount(self, parent=QtCore.QModelIndex()):
        return len(self.items)
    
    def columnCount(self, parent=QtCore.QModelIndex()):
        return len(self.headers) if self.headers else 0
    
    def data(self, index: QtCore.QModelIndex, role: int = QtCore.Qt.ItemDataRole.DisplayRole):
        if index.isValid() and role == QtCore.Qt.ItemDataRole.DisplayRole:
            return self.items[index.row()][index.column()]
        return None

    def headerData(self, section, orientation, role=QtCore.Qt.ItemDataRole.DisplayRole):
        if orientation == QtCore.Qt.Orientation.Horizontal and role == QtCore.Qt.ItemDataRole.DisplayRole:
            return self.headers[section]
        return None

class Dialog_view_table(QDialog, view_table):
    def __init__(self, header, items, parent=None):
        QDialog.__init__(self, parent)
        self.ui_view_table = view_table()
        self.ui_view_table.setupUi(self)
        self.model = ItemsViewTableModel()
        self.ui_view_table.tableView.setModel(self.model)
        # self.ui_view_table.pushButton.clicked.connect(self.close_window_msg)
        self.setModal(True)
        self.setVisible(True)
        self.model.setHeaders(header)
        self.model.setItems(items)
        font = QtGui.QFont()
        font.setPointSize(14)
        self.ui_view_table.tableView.horizontalHeader().setFont(font)
        self.ui_view_table.tableView.verticalHeader().setFont(font)
        self.ui_view_table.tableView.resizeColumnsToContents()
        self.ui_view_table.tableView.resizeRowsToContents()
        self.resize_table_to_contents()
        self.setMinimumSize(self.size())
        self.setMaximumSize(self.size())
        
    def resize_table_to_contents(self):
        self.ui_view_table.tableView.resizeColumnsToContents()
        self.ui_view_table.tableView.resizeRowsToContents()

        total_width = self.ui_view_table.tableView.verticalHeader().width()
        for column in range(self.model.columnCount()):
            total_width += self.ui_view_table.tableView.sizeHintForColumn(column)

        total_height = self.ui_view_table.tableView.horizontalHeader().height()
        for row in range(self.model.rowCount()):
            total_height += self.ui_view_table.tableView.sizeHintForRow(row)

        if self.ui_view_table.tableView.verticalScrollBar().isVisible():
            total_width += self.ui_view_table.tableView.verticalScrollBar().width()

        if self.ui_view_table.tableView.horizontalScrollBar().isVisible():
            total_height += self.ui_view_table.tableView.horizontalScrollBar().height()

        frame_width = self.ui_view_table.tableView.frameWidth() * 2
        frame_height = self.ui_view_table.tableView.frameWidth() * 2

        # Устанавливаем размер таблицы
        self.ui_view_table.tableView.setFixedWidth(total_width + frame_width)
        self.ui_view_table.tableView.setFixedHeight(total_height + frame_height)

        # Устанавливаем размер диалога для подгонки под таблицу
        print(total_width)
        print(frame_width)
        print(total_height)
        print(frame_height)
        self.setGeometry(100, 100, total_width + frame_width , total_height + frame_height)

    def item_add_table(self):
        self.ui_view_table.tableView.setModel(self.model)

    def close_window_msg(self):
        self.close()

Смотри, у меня почему-то frame_width и frame_height равны 2. Это нормально?