如何冻结 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 中的特定行/列?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Python 中为 QTableWidget 设置大小提示