когда редактирование QStyledItemDelegate выполнено, как позволить его родительскому виджету автоматически добавить новую строку в qtableview? - PullRequest
0 голосов
/ 07 апреля 2020

Я столкнулся с проблемой в моем python2 .7 + PyQt5 + win7,

, мой вопрос:

, если я нажимаю пункт «Нажмите здесь, чтобы добавить путь» в qtableview, и затем выберите файл, нажмите ок, он поместит этот абсолютный путь к файлу в qtableview. и на этот раз, если я щелкну по любому другому элементу, я бы хотел автоматически добавить новую строку в qtableview.

, если я продолжу щелкать по второму пункту «Нажмите здесь, чтобы добавить путь», и выбор файла завершен , и заполнение файла в qtableview завершено, если щелкнуть любой другой элемент, он также снова добавит новую строку.

...

и т. д.

p1

from PyQt5 import QtCore    
from PyQt5 import QtGui     
from PyQt5 import QtWidgets 

class ClickDelegate(QtWidgets.QStyledItemDelegate):
    blankText = '<Click here to add path>'

    def openFileDialog(self, lineEdit):
        if not self.blankText.startswith(lineEdit.text()):  
            currentPath = lineEdit.text()
        else:       
            currentPath = ''
        path, _ = QtWidgets.QFileDialog.getOpenFileName(lineEdit.window(), 
            'Select file', currentPath)
        if path:
            lineEdit.setText(path)

    def createEditor(self, parent, option, index):
        editor = QtWidgets.QWidget(parent)

        layout = QtWidgets.QHBoxLayout(editor)
        layout.setContentsMargins(0, 0, 0, 0)
        layout.setSpacing(0)

        editor.lineEdit = QtWidgets.QLineEdit(self.blankText)
        layout.addWidget(editor.lineEdit)
        editor.setFocusProxy(editor.lineEdit)
        editor.lineEdit.installEventFilter(self)

        button = QtWidgets.QToolButton(text='...')
        layout.addWidget(button)
        button.setFocusPolicy(QtCore.Qt.NoFocus)
        button.clicked.connect(lambda: self.openFileDialog(editor.lineEdit))
        return editor

    def setEditorData(self, editor, index):
        if index.data():
            editor.lineEdit.setText(str(index.data()))
        editor.lineEdit.selectAll()     

    def setModelData(self, editor, model, index):
        if not editor.lineEdit.text():      
            model.setData(index, None)
        elif not self.blankText.startswith(editor.lineEdit.text()):
            model.setData(index, editor.lineEdit.text())

    def initStyleOption(self, option, index):
        super(ClickDelegate, self).initStyleOption(option, index)  

        if not option.text:
            option.text = self.blankText

    def eventFilter(self, source, event):
        if isinstance(source, QtWidgets.QLineEdit):
            if (event.type() == QtCore.QEvent.MouseButtonPress and 
                source.hasSelectedText() and 
                self.blankText.startswith(source.text())):
                    res = super(ClickDelegate, self).eventFilter(source, event)
                    source.clear()
                    return res
            elif event.type() == QtCore.QEvent.KeyPress and event.key() in (
                QtCore.Qt.Key_Escape, QtCore.Qt.Key_Tab, QtCore.Qt.Key_Backtab):
                    return False
        return super(ClickDelegate, self).eventFilter(source, event) 

    def checkIndex(self, table, index):
        if index in table.selectedIndexes() and index == table.currentIndex():
            table.edit(index)

    def editorEvent(self, event, model, option, index):
        if (event.type() == QtCore.QEvent.MouseButtonPress and 
            event.button() == QtCore.Qt.LeftButton and
            index in option.widget.selectedIndexes()):
                table = option.widget
                QtCore.QTimer.singleShot(0, lambda: self.checkIndex(table, index))
        return super(ClickDelegate, self).editorEvent(event, model, option, index)     

class mytable(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(mytable, self).__init__(parent)
        model = QtGui.QStandardItemModel(5, 3)
        tableview = QtWidgets.QTableView()
        tableview.setModel(model)
        delegate = ClickDelegate(tableview)
        tableview.setItemDelegateForColumn(2, delegate ) 
        for row in range(4):
            for column in range(3):
                index = model.index(row, column, QtCore.QModelIndex())
                model.setData(index, (row + 1) * (column + 1))
        mainLayout = QtWidgets.QVBoxLayout()
        mainLayout.addWidget(tableview)
        self.setLayout(mainLayout)
        self.setWindowTitle("window")

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    table = mytable()
    table.resize(500,300)
    table.show()
    sys.exit(app.exec_())
...