Я столкнулся с проблемой в моем python2 .7 + PyQt5 + win7,
, мой вопрос:
, если я нажимаю пункт «Нажмите здесь, чтобы добавить путь» в qtableview, и затем выберите файл, нажмите ок, он поместит этот абсолютный путь к файлу в qtableview. и на этот раз, если я щелкну по любому другому элементу, я бы хотел автоматически добавить новую строку в qtableview.
, если я продолжу щелкать по второму пункту «Нажмите здесь, чтобы добавить путь», и выбор файла завершен , и заполнение файла в qtableview завершено, если щелкнуть любой другой элемент, он также снова добавит новую строку.
...
и т. д.
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_())