QTableWidget 常用设置

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'tableWidget.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.
import sys

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QMainWindow, QApplication, QWidget, QAbstractItemView, QHeaderView, QTableWidgetItem


class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(453, 347)
        self.horizontalLayout = QtWidgets.QHBoxLayout(Form)
        self.horizontalLayout.setContentsMargins(6, 6, 6, 6)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.tableWidget = QtWidgets.QTableWidget(Form)
        self.tableWidget.setRowCount(50)
        self.tableWidget.setColumnCount(4)
        self.tableWidget.setObjectName("tableWidget")
        self.horizontalLayout.addWidget(self.tableWidget)

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Form"))


class MainWin(QWidget, Ui_Form):
    def __init__(self):
        super(MainWin, self).__init__()
        self.setupUi(self)
        self.modify_table_widget()

    def modify_table_widget(self):
        self.tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)  # 设置表格不可编辑
        self.tableWidget.setAlternatingRowColors(True)                      # 表格交替显示不同的颜色

        # s设置表格样式,Win10标题没有下边框问题
        self.tableWidget.setStyleSheet(
            "QHeaderView::section{"
            "border-top:0px solid #E5E5E5;"
            "border-left:0px solid #E5E5E5;"
            "border-right:0.5px solid #E5E5E5;"
            "border-bottom: 0.5px solid #E5E5E5;"
            "background-color:white;"
            "padding:4px;"
            "}"

            "QTableCornerButton::section{"
            "border-top:0px solid #E5E5E5;"
            "border-left:0px solid #E5E5E5;"
            "border-right:0.5px solid #E5E5E5;"
            "border-bottom: 0.5px solid #E5E5E5;"
            "background-color:white;"
            "}"
        )
        # self.tableWidget.setColumnCount(4)  # 设置表格四列
        # self.tableWidget.setRowCount(50)  # 初始化设置50行
        self.tableWidget.setHorizontalHeaderLabels(['time', 'Channel Power', 'Adj Lower Rel', 'Adj Upper Rel'])
        # self.abnormal_table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
        self.tableWidget.verticalHeader().setSectionResizeMode(QHeaderView.Stretch)     # 垂直等分行高
        self.tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)   # 水平等分列宽

        # 第二种方式根据内容自动调整列宽
        # self.tableWidget.horizontalHeader().setSectionResizeMode(0, QHeaderView.ResizeToContents)     # 第一列根据内容设置列宽
        # self.tableWidget.horizontalHeader().setSectionResizeMode(1, QHeaderView.ResizeToContents)     # 第二列根据内容设置列宽
        # self.tableWidget.horizontalHeader().setSectionResizeMode(2, QHeaderView.ResizeToContents)     # 第三列根据内容设置列宽
        # self.tableWidget.horizontalHeader().setStretchLastSection(True)                               # 最后一列自适应拉伸,剩余的空间都被最后一列占据

        curRow = self.tableWidget.rowCount()  # 获取当前行
        self.tableWidget.insertRow(curRow)  # 插入一行,
        self.tableWidget.setItem(curRow, 0, QTableWidgetItem('123'))  # 插入数据
        self.tableWidget.setItem(curRow, 1, QTableWidgetItem('123'))
        self.tableWidget.setItem(curRow, 2, QTableWidgetItem('123'))
        self.tableWidget.setItem(curRow, 3, QTableWidgetItem('123'))

        self.tableWidget.verticalHeader().setVisible(False)       # 隐藏垂直列标题

        # curRow = self.tableWidget.rowCount()  # 获取当前行
        # idx = self.tableWidget.model().index(curRow-1, 0)  # 滚动条跟着变,处于底部
        # self.tableWidget.setCurrentIndex(idx)

        # 下面是另外一种设置滚动条始终处于底部的方法,如果无效,就使用上面的方式
        # idx = self.tableWidget.model().index(self.tableWidget.rowCount() - 1, 0)
        # self.tableWidget.scrollTo(idx)

        # 第三种方法,直接就设置到底部
        self.tableWidget.scrollToBottom()




if __name__ == '__main__':
    # PyQt5高清屏幕自适应设置,以及让添加的高清图标显示清晰,不然designer导入的图标在程序加载时会特别模糊
    QApplication.setAttribute(Qt.AA_EnableHighDpiScaling)
    QApplication.setAttribute(Qt.AA_UseHighDpiPixmaps)
    app = QApplication(sys.argv)
    main_win = MainWin()

    main_win.show()
    sys.exit(app.exec_())









上述demo中动态添加数据时,设置滚动条的位置始终在底部的三种方式,一般都能使用,但是在特殊的UI构造中,方法二跟方法三存在bug,目前还未找到解决办法,下面进行演示

构造UI界面,QWidget界面添加一个QStackWidget, QStackWidget第一个page中添加一个QTableWidget,这时候就会出现bug

方法一:运行正常

curRow = self.tableWidget.rowCount()  # 获取当前行
idx = self.tableWidget.model().index(curRow-1, 0)  # 滚动条跟着变,处于底部
self.tableWidget.setCurrentIndex(idx)
self.tableWidget.item(curRow-1, 0).setSelected(False)       # 取消选中,模拟滚动条实时在最底部

方法二:没有任何效果

# 下面是另外一种设置滚动条始终处于底部的方法,如果无效,就使用上面的方式
idx = self.tableWidget.model().index(self.tableWidget.rowCount() - 1, 0)
self.tableWidget.scrollTo(idx)

方法三:垂直滚动条不会滑动到底部

# 第三种方法,直接就设置到底部
self.tableWidget.scrollToBottom()

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'stackWidget_tableWidgetDemo.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QMainWindow, QApplication, QWidget, QAbstractItemView, QHeaderView, QTableWidgetItem


class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(453, 347)
        self.verticalLayout_2 = QtWidgets.QVBoxLayout(Form)
        self.verticalLayout_2.setObjectName("verticalLayout_2")
        self.stackedWidget = QtWidgets.QStackedWidget(Form)
        self.stackedWidget.setObjectName("stackedWidget")
        self.page = QtWidgets.QWidget()
        self.page.setObjectName("page")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.page)
        self.verticalLayout.setObjectName("verticalLayout")
        self.tableWidget = QtWidgets.QTableWidget(self.page)
        self.tableWidget.setObjectName("tableWidget")
        self.tableWidget.setColumnCount(0)
        self.tableWidget.setRowCount(0)
        self.verticalLayout.addWidget(self.tableWidget)
        self.stackedWidget.addWidget(self.page)
        self.page_2 = QtWidgets.QWidget()
        self.page_2.setObjectName("page_2")
        self.stackedWidget.addWidget(self.page_2)
        self.verticalLayout_2.addWidget(self.stackedWidget)

        self.retranslateUi(Form)
        self.stackedWidget.setCurrentIndex(0)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Form"))


class MainWin(QWidget, Ui_Form):
    def __init__(self):
        super(MainWin, self).__init__()
        self.setupUi(self)
        self.modify_table_widget()

    def modify_table_widget(self):
        self.tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)  # 设置表格不可编辑
        self.tableWidget.setAlternatingRowColors(True)  # 表格交替显示不同的颜色

        # s设置表格样式,Win10标题没有下边框问题
        self.tableWidget.setStyleSheet(
            "QHeaderView::section{"
            "border-top:0px solid #E5E5E5;"
            "border-left:0px solid #E5E5E5;"
            "border-right:0.5px solid #E5E5E5;"
            "border-bottom: 0.5px solid #E5E5E5;"
            "background-color:white;"
            "padding:4px;"
            "}"

            "QTableCornerButton::section{"
            "border-top:0px solid #E5E5E5;"
            "border-left:0px solid #E5E5E5;"
            "border-right:0.5px solid #E5E5E5;"
            "border-bottom: 0.5px solid #E5E5E5;"
            "background-color:white;"
            "}"
        )
        self.tableWidget.setColumnCount(4)  # 设置表格四列
        # self.tableWidget.setRowCount(50)  # 初始化设置50行
        self.tableWidget.setHorizontalHeaderLabels(['time', 'Channel Power', 'Adj Lower Rel', 'Adj Upper Rel'])
        # self.abnormal_table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
        self.tableWidget.verticalHeader().setSectionResizeMode(QHeaderView.Stretch)     # 垂直等分行高
        self.tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)   # 水平等分列宽

        # 第二种方式根据内容自动调整列宽
        # self.tableWidget.horizontalHeader().setSectionResizeMode(0, QHeaderView.ResizeToContents)     # 第一列根据内容设置列宽
        # self.tableWidget.horizontalHeader().setSectionResizeMode(1, QHeaderView.ResizeToContents)     # 第二列根据内容设置列宽
        # self.tableWidget.horizontalHeader().setSectionResizeMode(2, QHeaderView.ResizeToContents)     # 第三列根据内容设置列宽
        # self.tableWidget.horizontalHeader().setStretchLastSection(True)                               # 最后一列自适应拉伸,剩余的空间都被最后一列占据

        for x in range(50):
            curRow = self.tableWidget.rowCount()  # 获取当前行
            self.tableWidget.insertRow(curRow)  # 插入一行,
            self.tableWidget.setItem(curRow, 0, QTableWidgetItem('123'))  # 插入数据
            self.tableWidget.setItem(curRow, 1, QTableWidgetItem('123'))
            self.tableWidget.setItem(curRow, 2, QTableWidgetItem('123'))
            self.tableWidget.setItem(curRow, 3, QTableWidgetItem('123'))

        self.tableWidget.verticalHeader().setVisible(False)       # 隐藏垂直列标题

        # 方法一:动态添加数据,垂直滚动条始终处于底部,在QStackWidget中运行正常
        curRow = self.tableWidget.rowCount()  # 获取当前行
        idx = self.tableWidget.model().index(curRow-1, 0)  # 滚动条跟着变,处于底部
        self.tableWidget.setCurrentIndex(idx)
        self.tableWidget.item(curRow-1, 0).setSelected(False)       # 取消选中,模拟滚动条实时在最底部

        # 方法二:动态添加数据,垂直滚动条始终处于底部,在QStackWidget中无效
        # idx = self.tableWidget.model().index(self.tableWidget.rowCount() - 1, 0)
        # self.tableWidget.scrollTo(idx)

        # 方法三,动态添加数据,垂直滚动条始终处于底部,在QStackWidget中存在bug,不会滑动到底部
        # self.tableWidget.scrollToBottom()


if __name__ == '__main__':
    import sys
    # PyQt5高清屏幕自适应设置,以及让添加的高清图标显示清晰,不然designer导入的图标在程序加载时会特别模糊
    QApplication.setAttribute(Qt.AA_EnableHighDpiScaling)
    QApplication.setAttribute(Qt.AA_UseHighDpiPixmaps)
    app = QApplication(sys.argv)
    main_win = MainWin()

    main_win.show()
    sys.exit(app.exec_())






参考连接:

QT之TableWidget使用记录(标题设置、自适应高度、颜色设置、添加控件等)_BOO2018的博客-CSDN博客_qt tablewidget 设置标题

Python Qt GUI设计:QTableView、QListView、QListWidet、QTableWidget、QTreeWidget和QTreeWidgetltem表格和树类(提升篇—1) - 知乎

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值