Как заморозить определенную строку/столбец в QTableWidget python?

У меня есть QTableWidget, сгенерированный QTDesigner, в котором я хочу,

  1. заморозить определенную строку (строка 0,1,2)
  2. заморозить определенный столбец (столбец 0)

Как я могу добиться этого?

РЕДАКТИРОВАТЬ: я думаю, что ответ доступен для реализации на С++, но я не могу заставить его работать на 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_())

Спасибо!


person PyPyVk    schedule 01.04.2020    source источник
comment
Что вы имеете в виду под заморозкой?   -  person musicamante    schedule 01.04.2020
comment
то, как Excel замораживает строку и столбец, я хочу сделать то же самое здесь. если верхняя строка заморожена, она не поднимается вверх при прокрутке вниз и то же самое со столбцом, если вы зафиксируете первый столбец и прокрутите вправо, этот столбец останется внизу слева.   -  person PyPyVk    schedule 01.04.2020
comment
Мммм. То, что вы просите, может быть сделано, но это не так просто реализовать. Документация Qt дает решение для закрепленного столбца ( но это предусмотрено для C++, поэтому вам нужно будет переопределить его в Python), но сделать это для строк также намного сложнее...   -  person musicamante    schedule 01.04.2020
comment
Спасибо @musicamante, но я не очень хорошо знаком с C++. Если бы кто-нибудь, читающий эту ветку, мог помочь, было бы здорово!   -  person PyPyVk    schedule 02.04.2020


Ответы (2)


Если вы все еще ищете ответ. Вот аналогичный код C++, переведенный на python.

person Elan    schedule 29.10.2020

способ, которым Excel фиксирует строку и столбец, я хочу сделать здесь так же. если верхняя строка заморожена, она не поднимается вверх при прокрутке вниз и то же самое со столбцом

Это можно сделать с помощью QTableWidget, используя сигнал currentCellChanged. .connect() его в слот.

Когда текущая ячейка изменена (на currentRow), используйте метод QTableWidget.setRowHidden(), чтобы скрыть предыдущую строку. Заблокируйте сигнал, затем вручную установитеCurrentCell там, где вы хотите (вероятно, после скрытого rpw). Сигнал разблокировки. Также можно манипулировать TableWidget для .ScrollToTop...

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

person Joe Bow    schedule 06.11.2020