ResizeMode столбца с нумерацией в QTableWidget PyQt5
Как изменить ResizeMode столбца с нумерацией в QTableWidget и установить ResizeToContents? С установкой ResizeMode у обычных столбцов проблем нет:
table.setSectionResizeMode(0, QtWidgets.QHeaderView.ResizeToContents)
Но как сделать то же самое со столбцами с автонумерацией? Я пересмотрела все похожие вопросы в интернете, но не нашла ответа. Зачем это нужно? Так как по умолчанию почему-то нумерация залазит за грани:
Это двузначные числа, а чем они больше, тем больше это наложение, при появлении тысяч последнюю цифру уже почти не видно. Что я пробовала сделать сама:
1) Я думала, что это будет решением:
table.verticalHeader().setSectionResizeMode(QtWidgets.QHeaderView.ResizeToContents)
Но, данный код растягивает все строки по вертикали, в зависимости от контента. Горизонтально строки с нумерацией не растягиваются.
2) Попытка установить ResizeToContents для всех столбцов:
table.resizeSections(QtWidgets.QHeaderView.ResizeToContents)
Другие столбцы у меня настраиваются отдельно, поэтому на них это не повлияло, но на столбец с нумерацией тоже не повлияло.
3) Если он расположен перед заголовком с индексом 0, то я подумала, что стоит попробовать следующее:
table.setSectionResizeMode(-1, QtWidgets.QHeaderView.ResizeToContents)
С этим кодом скрылись все заголовки.
Почему происходит это наложение и как его исправить или установить правильные настройки заголовка, чтобы подобного наложения не проиходило?
UPDATE:
Я разобралась из-за чего числа из нумерации не вмещаются в колонки:
setStyleSheet('QWidget { font-size: 16px; font-weight: 500; }')
При создании интерфейса в коде, мне не удалось воспроизвести такие же стили, как при использовании Qt Designer. Создание интерфейса в коде:
import sys
from PyQt5.QtWidgets import *
class Window(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('MainWindow')
self.setStyleSheet('QWidget { font-size: 16px; font-weight: 500; }')
self.tableWidget = QTableWidget()
self.tableWidget.setColumnCount(2)
table = self.tableWidget
header = table.horizontalHeader()
header.setSectionResizeMode(0, QHeaderView.Stretch)
header.setSectionResizeMode(1, QHeaderView.Stretch)
for tw in range(0, 200):
row_position = table.rowCount()
table.insertRow(row_position)
table.setItem(row_position, 0, QTableWidgetItem(str(tw)))
table.setItem(row_position, 1, QTableWidgetItem(str(tw)))
self.layout = QVBoxLayout()
self.layout.addWidget(self.tableWidget)
self.setLayout(self.layout)
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
w = Window()
sys.exit(app.exec_())
Его результат:
Код с использованием .ui файла:
import sys
from PyQt5 import uic
from PyQt5.QtWidgets import *
class Window(QMainWindow):
def __init__(self):
super(Window, self).__init__()
uic.loadUi('main.ui', self)
table = self.tableWidget
header = table.horizontalHeader()
header.setSectionResizeMode(0, QHeaderView.Stretch)
header.setSectionResizeMode(1, QHeaderView.Stretch)
for tw in range(0, 200):
row_position = table.rowCount()
table.insertRow(row_position)
table.setItem(row_position, 0, QTableWidgetItem(str(tw)))
table.setItem(row_position, 1, QTableWidgetItem(str(tw)))
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
w = Window()
w.show()
sys.exit(app.exec_())
Результат:
main.ui:
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(1079, 600)
MainWindow.setStyleSheet("QWidget {\n"
" font-size: 16px;\n"
" font-weight: 500;\n"
"}")
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
self.gridLayout.setObjectName("gridLayout")
self.tableWidget = QtWidgets.QTableWidget(self.centralwidget)
self.tableWidget.setStyleSheet("")
self.tableWidget.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustToContents)
self.tableWidget.setAutoScroll(True)
self.tableWidget.setShowGrid(True)
self.tableWidget.setGridStyle(QtCore.Qt.SolidLine)
self.tableWidget.setObjectName("tableWidget")
self.tableWidget.setColumnCount(2)
self.tableWidget.setRowCount(0)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(0, item)
item = QtWidgets.QTableWidgetItem()
item.setTextAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignVCenter)
self.tableWidget.setHorizontalHeaderItem(1, item)
self.tableWidget.verticalHeader().setCascadingSectionResizes(True)
self.tableWidget.verticalHeader().setStretchLastSection(True)
self.gridLayout.addWidget(self.tableWidget, 0, 0, 1, 1)
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
item = self.tableWidget.horizontalHeaderItem(0)
item.setText(_translate("MainWindow", "First"))
item = self.tableWidget.horizontalHeaderItem(1)
item.setText(_translate("MainWindow", "Second"))
Ответы (2 шт):
У меня нет вашего воспроизводимого примера чтобы проверить, так что просто попробуйте изменить verticalHeader() на horizontalHeader():
header = self.table.horizontalHeader()
header.setSectionResizeMode(0, QtWidgets.QHeaderView.ResizeToContents)
или растянуть на всю длину:
header.setSectionResizeMode(0, QtWidgets.QHeaderView.Stretch)
Я не смотрел ваш первый пример, в котором вы создаете интерфейс в коде.
Что касается кода с использованием .ui файла:
глядя на изображение результата работы, которые вы опубликовали, мне показалось, что в таблице используются разные шрифты. Добавив немного пикселей
..................... vv <------------------------------------------------
" font-size: 72px;\n"
" font-weight: 500;\n"
Таки да, вот результат (по крайней мере у меня):
Добавляю в таблицу стилей font-family:
MainWindow.setStyleSheet("QWidget {\n"
" font-size: 16px;\n"
" font-weight: 500;\n"
" font-family: 'MS Shell Dlg 2';\n" <---------------
"}")
Все, у меня вопрос решен:
Почему так происходит в двух ваших вариантах при одинаковых стилях?
У меня недостаточно знаний (на данный момент) объяснить тонкости
использования таблиц стилей в Qt
для конкретных виджетов, поэтому я констатирую факт.
main.py
import sys
from PyQt5 import uic
from PyQt5.Qt import *
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(500, 315)
MainWindow.setStyleSheet("QWidget {\n"
" font-size: 16px;\n"
" font-weight: 500;\n"
" font-family: 'MS Shell Dlg 2';\n"
"}")
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
self.gridLayout.setObjectName("gridLayout")
self.tableWidget = QtWidgets.QTableWidget(self.centralwidget)
self.tableWidget.setStyleSheet("")
self.tableWidget.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustToContents)
self.tableWidget.setAutoScroll(True)
self.tableWidget.setShowGrid(True)
self.tableWidget.setGridStyle(QtCore.Qt.SolidLine)
self.tableWidget.setObjectName("tableWidget")
self.tableWidget.setColumnCount(2)
self.tableWidget.setRowCount(0)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(0, item)
item = QtWidgets.QTableWidgetItem()
item.setTextAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignVCenter)
self.tableWidget.setHorizontalHeaderItem(1, item)
self.tableWidget.verticalHeader().setCascadingSectionResizes(True)
self.tableWidget.verticalHeader().setStretchLastSection(True)
self.gridLayout.addWidget(self.tableWidget, 0, 0, 1, 1)
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
item = self.tableWidget.horizontalHeaderItem(0)
item.setText(_translate("MainWindow", "First"))
item = self.tableWidget.horizontalHeaderItem(1)
item.setText(_translate("MainWindow", "Second"))
class Window(QMainWindow, Ui_MainWindow):
def __init__(self):
super(Window, self).__init__()
# uic.loadUi('q1313498.ui', self)
self.setupUi(self)
table = self.tableWidget
header = table.horizontalHeader()
header.setSectionResizeMode(0, QHeaderView.Stretch)
header.setSectionResizeMode(1, QHeaderView.Stretch)
for tw in range(1, 277):
row_position = table.rowCount()
table.insertRow(row_position)
table.setItem(row_position, 0, QTableWidgetItem(str(tw)))
table.setItem(row_position, 1, QTableWidgetItem(str(tw)))
if __name__ == '__main__':
app = QApplication(sys.argv)
w = Window()
w.show()
sys.exit(app.exec_())




