python - 如何按比例调整 QTableView 中的列宽?

标签 python resize multiple-columns pyqt5 qtableview

我想按比例更改 QTableView 小部件中所有列的列宽,以便每列具有相同的宽度,而不管数据如何。例如,如果一个表格有三列,每列的宽度应该始终为可用水平空间的三分之一 - 并且当用户调整对话框大小时,宽度应该自动更新。

到目前为止,我只设法将列的大小调整为它们的内容,这不是我想要的。这是我到目前为止的代码:

主界面

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Dialog</class>
 <widget class="QDialog" name="Dialog">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>624</width>
    <height>329</height>
   </rect>
  </property>
  <property name="sizePolicy">
   <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
    <horstretch>0</horstretch>
    <verstretch>0</verstretch>
   </sizepolicy>
  </property>
  <property name="windowTitle">
   <string>Dialog</string>
  </property>
  <layout class="QVBoxLayout" name="verticalLayout">
   <item>
    <layout class="QHBoxLayout" name="horizontalLayout">
     <item>
      <widget class="QTableView" name="tableView">
       <property name="alternatingRowColors">
        <bool>true</bool>
       </property>
       <property name="selectionBehavior">
        <enum>QAbstractItemView::SelectRows</enum>
       </property>
      </widget>
     </item>
     <item>
      <layout class="QVBoxLayout" name="verticalLayout_2">
       <item>
        <widget class="QPushButton" name="btnPopulate">
         <property name="text">
          <string>Populate</string>
         </property>
        </widget>
       </item>
      </layout>
     </item>
    </layout>
   </item>
  </layout>
 </widget>
 <tabstops>
  <tabstop>btnPopulate</tabstop>
 </tabstops>
 <resources/>
 <connections/>
</ui>

测试.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys, os
from PyQt5 import uic
from PyQt5.QtGui import QStandardItemModel
from PyQt5.QtWidgets import QDialog, QApplication, QHeaderView

class GUI(QDialog):

    def __init__(self):
        super(GUI, self).__init__()
        dirname = os.path.dirname(os.path.abspath(__file__))
        uic.loadUi(os.path.join(dirname,'main.ui'), self)
        # button
        self.btnPopulate.clicked.connect(self.populate)
        # table model
        self.header = ['col1', 'col2', 'col3']
        self.QSModel = QStandardItemModel()
        self.QSModel.setColumnCount(3)
        self.QSModel.setHorizontalHeaderLabels(self.header)
        # table view
        self.tableView.setModel(self.QSModel)
        self.tableView.setWordWrap(True)
        self.tableView.horizontalHeader().setStretchLastSection(False)

    def populate(self):
        self.longtext = '''Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla ac tellus nunc. Phasellus imperdiet leo metus, et gravida lacus. Donec metus ligula, elementum at pellentesque pellentesque, suscipit ac nunc.'''
        row = self.QSModel.rowCount()
        for x in range(7):
            self.QSModel.insertRow(row)
            self.QSModel.setData(self.QSModel.index(row, 0), 'Lorem ipsum')
            self.QSModel.setData(self.QSModel.index(row, 1), self.longtext)
            self.QSModel.setData(self.QSModel.index(row, 2), 'Lorem ipsum')
        self.tableView.resizeColumnsToContents()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = GUI()
    window.show()
    sys.exit(app.exec_())

我有以下问题:
  • 如何更改代码以按比例调整列宽?
  • 为什么不 setWordWrap(True)换行?
  • 最佳答案

    这可以通过 setting the section resize mode 来实现.要获得相等的列宽:

    self.tableView.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
    

    要垂直包装内容:
    self.tableView.verticalHeader().setSectionResizeMode(QHeaderView.ResizeToContents)
    

    无需调用resizeToContents , setWordWrapsetStretchLastSection .调用setWordWrap(False)将切换到省略右侧的文本,而不是换行。

    请注意,由于行/列的大小调整是自动完成的,因此用户无法再更改大小或以编程方式更改大小。

    关于python - 如何按比例调整 QTableView 中的列宽?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48317828/

    相关文章:

    Python 2.7-MySQL : Query value won't change while running on infinite loop

    python - python 3中导入函数的范围是什么

    jqgrid全屏切换,窗口宽高

    css - 在 IE11 中调整 SVG 大小

    pandas - 比较各个列的总和并返回最大和最小列 pandas 的名称

    python - 在Python中的logging.conf中设置日志记录级别

    python - 尝试在 mysql 数据库中设置枚举数据类型时出现问题

    asp.net - 具有调整大小的ASP.NET图像上传

    javascript - 使用jquery使一行中的列高度相等

    python - 使用 plotly 或 seaborn 进行多列可视化