Добавление виджета со списком в QTableView в Pyqt5 - PullRequest
0 голосов
/ 06 марта 2019

Я работаю над добавлением виджета поля со списком в столбец 1 QTableView, но по какой-то причине поле со списком не отображается. Я пытаюсь вставить виджет со списком в качестве первого элемента в каждой строке для каждого столбца, заменяя «combobox_insert». Кроме того, я был бы признателен, если бы кто-то мог указать направление для заголовков редактирования для каждой строки, таких как «высокий», «средний» и «низкий». Я приложил код здесь ниже.

from PyQt5.QtGui import *
from PyQt5.Qt import *
import sys, csv

class Window (QWidget):
    def __init__ (self):
        QWidget.__init__(self, None)
        self.setWindowTitle('Table')

class View (Window):
    def __init__ (self, parent=None):
        super(View, self).__init__()


        self.setFixedSize(850, 500)


        self.tableView = QTableView()
        self.tableView.clicked.connect(self.viewClicked)


        self.tableView.setStyleSheet("QTableView{gridline-color: black}")

        self.headers = ["▽", "High", "Medium", "Low"] 
        combo_box_options = ["Option 1","Option 2","Option 3"]
        combo = QComboBox()
        for t in combo_box_options:
                combo.addItem(t)
        tableData0 = [
                     [QCheckBox(''), "combobox_insert", "value", "norm_value"  ], [QCheckBox(''), "combobox_insert", "value", "norm_value" ],
                     [QCheckBox(''), "combobox_insert", "value", "norm_value" ],
                     ]


        self.model = MyTableModel(tableData0, self.headers)
        self.tableView.setModel(self.model)
        #self.model.setVerticalHeaderLabels(['High', 'Medium', 'Low'])


        self.selectRow = self.model.rowCount(QModelIndex())


        self.filters = "CSV files (*.csv)"


        self.fileName = None


        self.buttonNew = QPushButton('NEW', self)
        self.buttonAdd = QPushButton('add', self)
        self.buttonDell = QPushButton('Del', self)


        self.group = QButtonGroup()
        self.group.addButton(self.buttonNew)
        self.group.addButton(self.buttonAdd)
        self.group.addButton(self.buttonDell)


        self.buttonNew.clicked.connect(self.handleNew)

        self.buttonAdd.clicked.connect(self.insertRows)
        self.buttonDell.clicked.connect(self.removeRows)


        layout = QHBoxLayout()

        layout.addWidget(self.buttonNew)

        layout.addWidget(self.buttonAdd)
        layout.addWidget(self.buttonDell)


        Vlayout = QVBoxLayout()
        Vlayout.addWidget(self.tableView)
        Vlayout.addLayout(layout)


        self.setLayout(Vlayout)

    #saving processing0-> save as a csv


    def handleNew(self):
        print ("handleNew")
        self.fileName = ''

        defaultValue =[
        [QCheckBox(''), "combobox_insert", "value", "norm_value"]
        ]

        self.model = None
        self.model = MyTableModel(defaultValue, self.headers)
        print(defaultValue)
        self.tableView.setModel(self.model)

    #View insert and add line to model 1 above the selected line
    def insertRows(self, position, rows=1, index=QModelIndex()):
        print("position: %d"%position)
        print("rows: %d" % rows)
        print("rowCount: %d" % self.model.rowCount(QModelIndex()))

        position = self.selectRow
        self.model.beginInsertRows(QModelIndex(), position, position + rows - 1)
        for row in range(rows):
            self.model.list.insert(position, [QCheckBox(''), "combobox_insert", "value", "norm_value"])

        self.model.endInsertRows()
        return True

    #Delete the row at the selected position from the model
    def removeRows(self, position, rows=1, index=QModelIndex()):
        print("Removing at position: %s"%position)
        position = self.selectRow
        self.model.beginRemoveRows(QModelIndex(), position, position + rows - 1)
        self.model.list = self.model.list[:position] + self.model.list[position + rows:]
        self.model.endRemoveRows()
        return True

    def viewClicked(self, indexClicked):
        print('indexClicked() row: %s  column: %s'%(indexClicked.row(), indexClicked.column() ))
        self.selectRow = indexClicked.row()

class MyTableModel(QAbstractTableModel):

    def __init__(self, list, headers = [], parent = None):
        QAbstractTableModel.__init__(self, parent)
        self.list = list
        self.headers = headers

    def rowCount(self, parent):
        return len(self.list)

    def columnCount(self, parent):
        return len(self.list[0])

    def flags(self, index):
        row = index.row()
        column = index.column()
        if column == 0:
            return Qt.ItemIsUserCheckable | Qt.ItemIsEnabled
        else:
            return Qt.ItemIsEditable | Qt.ItemIsEnabled | Qt.ItemIsSelectable

    def data(self, index, role):

        row = index.row()
        column = index.column()

        if role == Qt.EditRole:
            return self.list[row][column]

        if role == Qt.CheckStateRole and column == 0:

            if self.list[row][column].isChecked():
                return QVariant(Qt.Checked)
            else:
                return QVariant(Qt.Unchecked)



        if role == Qt.DisplayRole:

            row = index.row()
            column = index.column()
            value = self.list[row][column]

            return value

    def setData(self, index, value, role = Qt.EditRole):
        row = index.row()
        column = index.column()

        if role == Qt.EditRole:
            self.list[row][column] = value
            self.dataChanged.emit(index, index)
            return True

        if role == Qt.CheckStateRole and column == 0:
            self.list[row][column] = QCheckBox('')
            if value == Qt.Checked:
                self.list[row][column].setChecked(True)
            else:
                self.list[row][column].setChecked(False)
            self.dataChanged.emit(index, index)
            return True
        return False


    def headerData(self, section, orientation, role):

        if role == Qt.DisplayRole:

            if orientation == Qt.Horizontal:

                if section < len(self.headers):
                    return self.headers[section]
                else:
                    return "not implemented"
            else:
                return "%d" % (section + 1)

if __name__ == '__main__':

    app = QApplication(sys.argv)
    table = View()
    table.show()
    app.exec_()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...