Как установить ширину столбца QTableWidget PySide6 в 15pt?

#python #pyside6

Вопрос:

Я хотел бы создать небольшой табличный виджет с кнопками в столбце # 2. Кнопки тонкие (15pt), поскольку они содержат только T.

Вот небольшой рабочий пример.

 import sys
from PySide6.QtWidgets import (
    QMainWindow, QApplication, QTableWidget, QLabel, QPushButton
)
from PySide6.QtCore import Qt

class MainWindow(QMainWindow):

    def __init__(self):
        super(MainWindow, self).__init__()
        self.setWindowTitle("My App")

        Nrows, Ncols = 5, 3
        table = QTableWidget(Nrows, Ncols, self)

        for col in [0, 2]:
            for row in range(Nrows):
                table.setCellWidget(row, col,
                    QLabel(f"row {row} column {col}")
                )
        for row in range(Nrows):
            push = QPushButton("T")
            push.setFixedWidth(15)
            table.setCellWidget(row, 1,push)

        self.setCentralWidget(table)

app = QApplication(sys.argv)
w = MainWindow()
w.show()
app.exec_()
 

Это приведет к следующему окну.

введите описание изображения здесь

Проблема в том, что я хочу, чтобы при запуске столбец с кнопками тоже был 15pt. Чтобы ширина столбца была той же ширины, что и кнопка.

Две проблемы:

  1. Мне нужно изменить размер при запуске
  2. Изменение размера не уменьшается до 15pt. Кажется, ширина столбца не может быть меньше ок. 20pt.

введите описание изображения здесь

Как это можно решить?

Ответ №1:

Минимальный размер раздела по умолчанию вычисляется по текущему стилю и шрифту.

Вы можете переопределить размер раздела, используя setColumnWidth() :

 table.setColumnWidth(1, 15)
 

Что совпадает с использованием resizeSection заголовка:

 table.horizontalHeader().resizeSection(1, 15)
 

Но вы также должны убедиться, что установлен минимальный раздел, иначе, если пользователь попытается изменить размер раздела, он вернется к минимуму по умолчанию:

 table.horizontalHeader().setMinimumSectionSize(15)
 

Обратите внимание, что вы также можете использовать setSectionResizeMode() (но вы все равно должны установить минимальный размер раздела):

 table.horizontalHeader().setMinimumSectionSize(15)
table.horizontalHeader().setSectionResizeMode(1, QHeaderView.ResizeToContents)
 

Обратите внимание, что ширина кнопки 15 действительно слишком мала, и вы не можете полагаться на шрифт вашего компьютера: у других пользователей могут быть другие стили (которые добавляют большие поля между текстом и границами кнопок) или шрифты больше, чем у вас; вы должны убедиться, что минимальная ширина основана на шрифте и стиле, итакже всегда предоставляйте возможность регулировать размер:

 width = (
    self.fontMetrics().horizontalAdvance("T")
      self.style().pixelMetric(QStyle.PM_ButtonMargin) * 2
      self.style().pixelMetric(QStyle.PM_DefaultFrameWidth) * 2
)

for row in range(Nrows):
    push = QPushButton("T")
    push.setMinimumWidth(width) # set a *minimum* width, not a fixed one
    table.setCellWidget(row, 1, push)
table.horizontalHeader().setMinimumSectionSize(width)
table.setColumnWidth(1, width)
 

Комментарии:

1. Огромное спасибо! Это идеально! И я установил семейство шрифтов и размер, так что 15pt в порядке 🙂

2. Добро пожаловать! Но, извините, нет, это не нормально, так как вы не знаете, установлен ли у пользователя шрифт, установлено ли какое-либо масштабирование шрифта и учитывает ли стиль DPI экрана. Фиксированные размеры и позиции никогда не должны использоваться при отображении текста, если вы действительно не знаете, как это работает. Кроме того, 15 * pt * — это не то же самое, что 15 * px *. Я предлагаю вам провести некоторое исследование различных способов установки размеров шрифтов и размеров пикселей устройства.