如何冻结 QTableWidget python 中的特定行/列?

Posted

技术标签:

【中文标题】如何冻结 QTableWidget python 中的特定行/列?【英文标题】:How to freeze particular row / column in QTableWidget python? 【发布时间】:2020-04-01 16:31:16 【问题描述】:

我有一个由 QTDesigner 生成的 QTableWidget,我想在其中使用,

    冻结特定行(第 0,1,2 行) 冻结特定列(第 0 列)

我怎样才能做到这一点?

编辑:我认为答案可以在 C++ 中实现,但我无法使其适用于 python。 https://doc.qt.io/qt-5/qtwidgets-itemviews-frozencolumn-example.html

我尝试查看堆栈溢出和其他一些平台上的一些线程,但它们都没有 Python 的答案。

Qtdesigner 生成的代码:

from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(428, 285)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.tableWidget = QtWidgets.QTableWidget(self.centralwidget)
        self.tableWidget.setGeometry(QtCore.QRect(20, 20, 391, 231))
        self.tableWidget.setEditTriggers(QtWidgets.QAbstractItemView.AnyKeyPressed|QtWidgets.QAbstractItemView.DoubleClicked|QtWidgets.QAbstractItemView.EditKeyPressed|QtWidgets.QAbstractItemView.SelectedClicked)
        self.tableWidget.setRowCount(5)
        self.tableWidget.setColumnCount(3)
        self.tableWidget.setObjectName("tableWidget")
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(0, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(1, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(2, item)
        self.tableWidget.horizontalHeader().setVisible(True)
        self.tableWidget.verticalHeader().setVisible(False)
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        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", "Name"))
        item = self.tableWidget.horizontalHeaderItem(1)
        item.setText(_translate("MainWindow", "Age"))
        item = self.tableWidget.horizontalHeaderItem(2)
        item.setText(_translate("MainWindow", "City"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

我的脚本:

from PyQt5 import QtWidgets, QtCore
from demo import Ui_MainWindow

class DemoTable(QtWidgets.QMainWindow, Ui_MainWindow):                 
    def __init__(self):
        super(DemoTable, self).__init__()
        self.setupUi(self) 


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    demowindow = DemoTable()   
    demowindow.show()
    sys.exit(app.exec_())

谢谢!

【问题讨论】:

“冻结”是什么意思? excel 冻结行和列的方式,我想在这里做同样的事情。如果顶行被冻结,当你向下滚动时它不会上升并且与列相同,如果你冻结第一列并向右滚动,该列将保持在左下角。 嗯。你所问的可以做到,但实施起来并不容易。 Qt 文档给出了solution for a frozen column(但它是为 C++ 提供的,因此您需要在 Python 中重新实现它),但对行执行此操作也更加困难...... 感谢@musicamante,但我对 C++ 不太熟悉。如果有人阅读此主题可以提供帮助,那就太好了! 【参考方案1】:

如果您仍在寻找答案。 Here是用python翻译的类似C++代码。

【讨论】:

【参考方案2】:

“excel冻结行和列的方式,我想在这里做同样的事情。如果顶行被冻结,当你向下滚动时它不会上升并且与列相同” p>

这可以通过使用“currentCellChanged”信号通过 QTableWidget 来完成。 .connect() 将其连接到一个插槽。

当当前单元格改变(到 currentRow)时,使用 QTableWidget.setRowHidden() 方法隐藏上一行。阻止信号,然后在您想要的位置手动设置CurrentCell(可能在隐藏的rpw之后)。解锁信号。也可以操作 TableWidget 到 .ScrollToTop ...

https://doc.qt.io/qtforpython/PySide2/QtWidgets/QTableWidget.html#PySide2.QtWidgets.PySide2.QtWidgets.QTableWidget.currentCellChanged

【讨论】:

以上是关于如何冻结 QTableWidget python 中的特定行/列?的主要内容,如果未能解决你的问题,请参考以下文章

请教个QTableWidget表头设置问题

请教个QTableWidget表头设置问题

循环遍历行 QTableWidget

如何在 Python 中为 QTableWidget 设置大小提示

如何使用 PyQt5 Python 将 QTableWidget 数据转换为 PDF

Python:如何将 QTableWidget 的列设置为以日期格式显示