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

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

Сообщение Anonymous »

tl;dr
Когда я устанавливаю горизонтальное выравнивание QTableView, ширина таблицы уменьшается, а когда я устанавливаю вертикальное выравнивание, высота таблицы уменьшается.

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

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

Проблема
В настоящее время таблица слева- выровнено и вертикально центрировано внутри table_container, а это не то, что мне нужно, и у меня возникли проблемы с его выравниванием по горизонтальному центру и верхнему краю внутри table_container.
Есть два случая отмечая. Случай 1 — это случай, когда таблица по вертикали короче определенного порога (похоже, 192, см. таблицу в разделе «Дополнительное тестирование»), а Случай 2 — это случай, когда таблица длиннее по вертикали этого порога.
Как видно из таблицы «Дополнительное тестирование», похоже, что горизонтальный порог также существует при ширине 256.
Дело 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, текущий display
Добавление кода 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 строк
'все'
< /tr>



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


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


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



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

Мой код
Это соответствующие части файла 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»