PySide6: настройка выравнивания макета портит размер таблицыPython

Программы на Python
Ответить
Anonymous
 PySide6: настройка выравнивания макета портит размер таблицы

Сообщение Anonymous »

Справочная информация
У меня есть проект PySide6, в котором я создаю QTableView (из Pandas DataFrame) с именем table и помещаю его в QWidget с именем table_container и отобразить его вместе с QLabel под названием text внутри QWidget под названием content.
Как вы увидите в коде, я установить максимальную ширину и высоту для таблицы при ее создании.

Моя цель
Внутри content, я хочу, чтобы текст был выровнен по левому краю и по нижнему краю. Кажется, эта часть работает нормально.
Затем я хочу, чтобы table_container заполнил оставшееся пространство содержимого, что, похоже, тоже происходит правильно (я тестировал это временно изменив цвет фона table_container, и он выглядел правильно).
Внутри table_container я хочу, чтобы таблица располагалась по центру по горизонтали и по вертикали. с выравниванием по верху. Вот в этом и проблема.

Проблема
В настоящее время таблица слева- выровнено и вертикально центрировано внутри table_container, а это не то, что мне нужно, и у меня возникли проблемы с его выравниванием по горизонтальному центру и верхнему краю внутри table_container.
Есть два случая отмечая. Случай 1 – это случай, когда таблица по вертикали короче определенного порога, а Случай 2 – случай, когда таблица длиннее по вертикали этого порога.
Из того, что я наблюдал, Я предполагаю, что аналогичный горизонтальный порог также существует.
Случай 1
Здесь я использую голову DataFrame ( первые пять строк) для создания таблицы.
Вот как это выглядит с текущим кодом (код см. ниже):
Случай 1, текущее отображение
Добавление кода table_container_layout.setAlignment( table, Qt.AlignTop) для get_content() в файле 2 дает следующее:
Случай 1, добавление Qt.AlignTop
Добавление вместо этого кода table_container_layout.setAlignment(table, Qt.AlignHCenter | Qt.AlignTop) для get_content() в файле 2 дает следующее (таблица прокручивается по горизонтали):
Случай 1, добавление Qt.AlignHCenter и Qt.AlignTop
Случай 2
Здесь я использую весь DataFrame (891 строка) для создания таблицы.
Вот как это выглядит с текущим кодом (таблица прокручивается по вертикали):
Случай 2, текущее отображение
Добавление кода table_container_layout.setAlignment(table, Qt.AlignTop) к get_content() в файле 2 приводит к такому результату (таблица расположена вертикально). прокручиваемый):
Случай 2, добавление Qt.AlignTop
Вместо этого добавлен код table_container_layout.setAlignment(table, Qt.AlignHCenter | Qt.AlignTop) для get_content() в файле 2 дает следующее (таблица прокручивается по горизонтали и вертикали):
Случай 2, добавление Qt.AlignHCenter и Qt.AlignTop

Дополнительное тестирование
Я добавил это в get_content(), чтобы распечатать ширину и высоту таблицы. Задержка добавлена ​​для того, чтобы приложение успело обновить макет.
def delayed_check():
print('table height: ', table.height())
print('table width: ', table.width())

QTimer.singleShot(0, delayed_check)

Я получил несколько интересных результатов. Столбцы следующей таблицы — это количество строк, которые я использовал для создания таблицы. Строки таблицы показывают, использовал ли я table_container_layout.setAlignment(table), и если да, то установил ли я выравнивание
как Qt.AlignTop или как Qt.AlignHCenter | Qt.AlignTop. Ячейки показывают (ширину, высоту) таблицы, напечатанную с помощью Delayed_check. Ячейки со звездочкой (*) — это случаи, когда таблица отображалась целиком и поэтому ее нельзя было прокручивать (и прокрутка не требовалась), тогда как во всех остальных случаях использовалась либо вертикальная, либо горизонтальная прокрутка, либо и то, и другое.



'голова'
10 строк
15 строк
500 строк< /th>
'все'




выравнивание таблицы не установлено
(173, 1218)*
(323, 1218)*
(473, 1224)*
(665, 1234)
(665, 1234)


Qt.AlignTop
(173, 1218)*
(192, 1218)
(192 , 1224)
(192, 1234)
(192, 1234)


Qt.AlignHCenter | Qt.AlignTop
(173, 256)$
(192, 256)
(192 , 256)
(192, 256)
(192, 256)




Заключительное примечание
Я повозился с этим и пробовал разные вещи, но ничего из того, что я сделал, не имело горизонтально центрированной и выровненной по верху таблицы, не испортив высоту и ширину таблицы. Как мне заставить это работать?

Мой код
Это соответствующие части файла 1.
Здесь я создаю таблицу:
def create_data_table_from_dataframe(filepath, display_mode = None):
df = import_dataframe(filepath)

if display_mode == 'all':
df_to_display = df
elif display_mode == 'head':
df_to_display = df.head()
elif display_mode == 'tail':
df_to_display = df.tail()
elif isinstance(display_mode, int):
df_to_display = df.head(display_mode)
else:
df_to_display = df

table = QTableView()
model = PandasDFTableModel(df_to_display)

table.setModel(model)

table.setAlternatingRowColors(True)

# calculate the total table height (header + row heights + 2)
table_height = table.horizontalHeader().height() + sum(table.rowHeight(row) for row in range(table.model().rowCount(QModelIndex()))) + 2

# set the maximum height of the table
table.setMaximumHeight(table_height)

# calculate the total table width (index + column widths + 2)
table_width = table.verticalHeader().width() + sum(table.columnWidth(col) for col in range(table.model().columnCount(QModelIndex()))) + 2

# set the maximum width of the table
table.setMaximumWidth(table_width)

return table

Здесь я определяю модель таблицы:
class PandasDFTableModel(QAbstractTableModel):
def __init__(self, data):
super().__init__()
self._data = data

def data(self, index, role):
if role == Qt.DisplayRole:
value = self._data.iloc[index.row(), index.column()]
return str(value)

def rowCount(self, index):
return self._data.shape[0]

def columnCount(self, index):
return self._data.shape[1]

def headerData(self, section, orientation, role):
# section is the index of the column/row
if role == Qt.DisplayRole:
if orientation == Qt.Horizontal:
return str(self._data.columns[section])

if orientation == Qt.Vertical:
return str(self._data.index[section])

В другом файле, Файле 2, я создаю экземпляр таблицы и добавляю его в макет:
def get_content(self):
content = QWidget()

layout = QVBoxLayout()
layout.setContentsMargins(0, 0, 0, 0)
layout.setSpacing(10)

content.setLayout(layout)

table_container = QWidget()

table_container_layout = QVBoxLayout()
table_container_layout.setContentsMargins(0, 0, 0, 0)
table_container_layout.setSpacing(0)

table_container.setLayout(table_container_layout)
table_container.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)

table = create_data_table_from_dataframe(app_state.initialize_session_preview_dataset_path, 'head')

text = QLabel('Testing')

table_container_layout.addWidget(table)

layout.addWidget(table_container)
layout.addWidget(text)

layout.setAlignment(text, Qt.AlignLeft)

return content


Подробнее здесь: https://stackoverflow.com/questions/791 ... table-size
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»