PyQt Редактирование одной конкретной ячейки таблицы
Как реализовать задачу?
Есть таблица, не доступная для редактирования и даже для фокуса. По нажатию первой кнопки:
- Таблица разблокируется
- Определённая ячейка таблицы (пусть, например, (1,1) становится доступна для редактирования
- По нажатию второй кнопки снова вешаются все запреты.
import sys
from PySide6.QtWidgets import *
from PySide6.QtGui import *
from PySide6.QtCore import *
import pandas as pd
table_data = [['Параметр 1', '111', '222'],
['Параметр 2', '333', '444'],
['Параметр 3', '555', '666'],
['Параметр 4', '777', '888']]
class PandasModel(QAbstractTableModel):
def __init__(self, table):
QAbstractTableModel.__init__(self)
data = pd.DataFrame(table)
self._data = data
def rowCount(self, parent=None):
return self._data.shape[0]
def columnCount(self, parnet=None):
return self._data.shape[1]
def data(self, index, role=Qt.DisplayRole):
if index.isValid():
if role == Qt.DisplayRole:
return str(self._data.iloc[index.row(), index.column()])
return None
def headerData(self, col, orientation, role):
if orientation == Qt.Horizontal and role == Qt.DisplayRole:
return self._data.columns[col]
return None
class MyTable(QTableView):
def __init__(self, model:QAbstractTableModel, data, parent=None):
super().__init__(parent)
self.data = data
self.model = model
self.horizontalHeader().setVisible(True)
self.model = model(pd.DataFrame(data, columns=['Параметры', 'Существующие', 'Допустимые']))
self.setModel(self.model)
# запрет фокуса
self.setFocusPolicy(Qt.NoFocus)
# запрет выбора и редактирования
self.setSelectionMode(QAbstractItemView.NoSelection)
self.setSelectionBehavior(QAbstractItemView.SelectRows)
class Main(QWidget):
def __init__(self):
super().__init__()
t = MyTable(PandasModel, table_data)
edit_cell_button = QPushButton('edit cell')
edit_cell_button.clicked.connect(self.handle_edit_cell_button)
disable_access_table_button = QPushButton('disable edit cell')
disable_access_table_button.clicked.connect(self.handle_disable_access_table_button)
vbox = QVBoxLayout()
vbox.addWidget(t)
vbox.addWidget(edit_cell_button)
vbox.addWidget(disable_access_table_button)
self.setLayout(vbox)
# снять запрет на доступ к таблице + ращрешить рерадктировать одну ячейку
def handle_edit_cell_button(self):
pass
# запретить доступ к таблице
def handle_disable_access_table_button(self):
pass
if __name__ == '__main__':
app = QApplication(sys.argv)
window = Main()
window.show()
sys.exit(app.exec())