#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. Чтобы ширина столбца была той же ширины, что и кнопка.
Две проблемы:
- Мне нужно изменить размер при запуске
- Изменение размера не уменьшается до 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 *. Я предлагаю вам провести некоторое исследование различных способов установки размеров шрифтов и размеров пикселей устройства.