Как я могу изменить объект моей модели, дважды щелкнув его в представлении

У меня есть QTableView, отображающий QAbstractTableModel, который представляет мой список объектов. Один атрибут моего объекта является логическим (isExpired), я просто хочу изменить этот атрибут при двойном щелчке по определенной ячейке в представлении таблицы. Итак, в myTableView. Если дважды щелкнуть ячейку в столбце isExpired строки, соответствующей моему объекту номер 1, я хочу, чтобы этот атрибут изменился с False на True.

import sys
import os
from PyQt5.QtWidgets import QApplication
from PyQt5.QtWidgets import QTableView
from PyQt5.QtCore import QAbstractTableModel, Qt
import pandas as pd

class Test:
def __init__(self):
    self.id = ""
    self.isExpired = ""

def toDataframe(self):
    return{
        'Id': self.id,
        'isExpired': self.isExpired}

class Tests:
def __init__(self):
    self.tests = []
    test1 = Test()
    test1.id = 1
    test1.isExpired = False
    self.tests.append(test1)

def toDataframe(self):
    tickets_df = pd.DataFrame.from_records([t.toDataframe() for t in self.tests])
    tickets_df = tickets_df[['Id', 'isExpired']]
    return tickets_df


class MyTableView(QTableView):
def __init__(self, *args):
    QTableView.__init__(self, *args)


# Table model
class TicketGUI(QAbstractTableModel):
def __init__(self):
    QAbstractTableModel.__init__(self)
    self.tickets = Tests()
    data = self.tickets.toDataframe()
    self._data = data

def rowCount(self, parent=None):
    return self._data.shape[0]

def columnCount(self, parent=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()])

def headerData(self, col, orientation, role=Qt.DisplayRole):
    if orientation == Qt.Horizontal and role == Qt.DisplayRole:
        return self._data.columns[col]
    return None

if __name__ == 'main':
app = QApplication(sys.argv)
model = TicketGUI()
view = MyTableView()
view.setModel(model)
view.show()
sys.exit(app.exec_())

person alaintk    schedule 20.08.2019    source источник
comment
Привет, eyllanesc, я отредактировал свой вопрос с минимальным воспроизводимым примером, спасибо.   -  person alaintk    schedule 20.08.2019


Ответы (1)


QTableView (который наследуется от QAbstractItemView) имеет сигнал doubleClicked, который испускается при двойном щелчке по ячейке в таблице и передает QModelIndex, по которому был сделан щелчок. https://doc.qt.io/qt-5/qabstractitemview.html#doubleClicked

Вы должны подключить этот сигнал вашего tableView к функции в вашей модели, и если столбец с вашим логическим полем соответствует индексу, переключите его для соответствующей строки в данных ваших моделей.

person TheKewlStore    schedule 20.08.2019
comment
Спасибо ! Я использовал следующее в своем представлении self.doubleClicked.connect(self.slotDoubleClicked). Когда я дважды щелкаю по ячейке, запускается функция slotDoubleClicked, и она печатает двойной щелчок на консоли. Но как мне теперь получить объект, по которому щелкнули, и изменить его поле? - person alaintk; 20.08.2019
comment
Как я могу получить QModelIndex моего двойного щелчка? - person alaintk; 20.08.2019
comment
добавьте параметр к вашей функции slotDoubleClicked, и он будет равен QModelIndex, который был нажат при вызове. так что-то вроде этого: python def slotDoubleClicked(self, index): if index.isValid(): do_something() Сигналы/слоты в pyqt подключаются, просматривая сигнатуру метода, к которому вы подключаетесь. Он будет передавать параметры сигнала исходя из того, какие параметры принимает ваша функция, а всегда есть несколько перегруженных вариантов, т.е. нет параметров, один параметр, все параметры и т.д. - person TheKewlStore; 20.08.2019
comment
Спасибо ! И последнее, что теперь, когда я получил свой индекс в своем представлении, как я могу изменить содержимое соответствующего объекта? Как я могу использовать модельный метод? - person alaintk; 21.08.2019
comment
вы можете вызвать self.model() в своем классе табличного представления, чтобы получить ссылку на подключенную модель, для которой вы затем можете вызывать функции. - person TheKewlStore; 21.08.2019