Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 当对QTreeView使用自定义itemdelegate时,如何在QLineEdit上自动开始编辑_Python_Pyqt5 - Fatal编程技术网

Python 当对QTreeView使用自定义itemdelegate时,如何在QLineEdit上自动开始编辑

Python 当对QTreeView使用自定义itemdelegate时,如何在QLineEdit上自动开始编辑,python,pyqt5,Python,Pyqt5,我正在尝试为QTreeview设置一些自定义编辑器,但我仍然有一个小问题 当用户在treeview中输入标准编辑器时,所有文本将自动选择,任何进一步的按键都将开始编辑数据 我似乎不知道如何在我的自定义编辑器上实现这一点。我想我可以通过setEditorData方法在自定义编辑器中的QLineedit上调用setFocus、selectAll和setCursorPosition,但这似乎不起作用 我错过了什么 一个有效的例子: from PyQt5 import QtWidgets, QtCore

我正在尝试为QTreeview设置一些自定义编辑器,但我仍然有一个小问题

当用户在treeview中输入标准编辑器时,所有文本将自动选择,任何进一步的按键都将开始编辑数据

我似乎不知道如何在我的自定义编辑器上实现这一点。我想我可以通过setEditorData方法在自定义编辑器中的QLineedit上调用setFocus、selectAll和setCursorPosition,但这似乎不起作用

我错过了什么

一个有效的例子:

from PyQt5 import QtWidgets, QtCore
from PyQt5.QtCore import Qt


class NspStringEdit(QtWidgets.QWidget):

    editingFinished = QtCore.pyqtSignal()

    def __init__(self, parent=None):
        super(NspStringEdit, self).__init__(parent)
        self.resize(137, 25)
        self.setMaximumSize(QtCore.QSize(120, 25))

        self.Edit = QtWidgets.QLineEdit()
        self.Checkbox = QtWidgets.QCheckBox()
        self.Checkbox.setText("")

        self.main_layout = QtWidgets.QHBoxLayout()
        self.main_layout.addWidget(self.Edit)
        self.main_layout.addWidget(self.Checkbox)
        self.main_layout.setContentsMargins(2, 0, 0, 0)
        self.setLayout(self.main_layout)

        self.Checkbox.stateChanged.connect(self._on_state_change)
        self.Edit.editingFinished.connect(self._on_editingFinished)
        self.Checkbox.setFocusPolicy(Qt.NoFocus)
        self.setFocusPolicy(Qt.WheelFocus)

        self.setText(None)

    def _on_state_change(self):
        state = self.checkState()
        if state:
            self.Edit.setEnabled(True)
        else:
            self.Edit.setEnabled(False)
        self.editingFinished.emit()

    def _on_editingFinished(self):
        self.editingFinished.emit()

    def checkState(self):
        state = self.Checkbox.checkState()
        if state == Qt.Checked:
            return True
        else:
            return False

    def setText(self, val):
        self.Edit.setEnabled(True)
        if val is None:
            self.Checkbox.setCheckState(Qt.Unchecked)
            self.Edit.setEnabled(False)
        else:
            self.Edit.setText(val)
            self.Checkbox.setCheckState(Qt.Checked)

    def text(self):
        if self.checkState():
            return self.Edit.text()
        else:
            return None


class NspAbstractItemDelegate(QtWidgets.QStyledItemDelegate):

    def __init__(self):
        super(NspAbstractItemDelegate, self).__init__()

    def createEditor(self, parent, option, index):
        editor = NspStringEdit(parent)
        editor.setWindowFlags(QtCore.Qt.Popup)
        return editor

    def setEditorData(self, editor, index):
        data = index.data()
        editor.setText(data)

    def setModelData(self, editor, model, index):
        data = editor.text()
        txt = data
        model.setData(index, txt)

    def updateEditorGeometry(self, editor, option, index):
        r = option.rect
        height = r.bottom() - r.top()
        r.setY(r.y() + height)
        if editor.windowFlags() & QtCore.Qt.Popup and editor.parent() is not None:
            r.setTopLeft(editor.parent().mapToGlobal(r.topLeft()))
        editor.setGeometry(r)


class testTreeview(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(testTreeview, self).__init__(parent)
        self.mainTree = QtWidgets.QTreeView()
        self.lo = QtWidgets.QVBoxLayout()
        self.lo.addWidget(self.mainTree)
        self.setLayout(self.lo)
        self.model = QtGui.QStandardItemModel()
        self.mainTree.setModel(self.model)
        self.populate()
        self.mainTree.setItemDelegate(NspAbstractItemDelegate())

    def populate(self):

        row = [QtGui.QStandardItem('05/12/15'), QtGui.QStandardItem('07/13/18'), ]
        row2 = [QtGui.QStandardItem('12/21/21'), QtGui.QStandardItem('11/05/17'), ]
        all_rows = list(row)
        all_rows.extend(row2)
        for item in all_rows:
            item.setEditable(True)
        root = self.model.invisibleRootItem()
        root.appendRow(row)
        root.appendRow(row2)


if __name__ == "__main__":
    from PyQt5 import QtCore, QtGui, QtWidgets

    app = QtWidgets.QApplication([])
    volume = testTreeview()
    volume.show()
    app.exec_()

如果希望QLineEdit编辑器获得焦点并可直接编辑,则必须使QLineEdit成为NspStringEdit的focusProxy:

self.Edit = QtWidgets.QLineEdit()
self.setFocusProxy(self.Edit)
self.Edit=qtwidts.QLineEdit()

self.setFocusProxy(self.Edit)
如果希望QLineEdit编辑器获得焦点并可直接编辑,则必须使QLineEdit编辑NspStringEdit的焦点Proxy:

self.Edit = QtWidgets.QLineEdit()
self.setFocusProxy(self.Edit)
self.Edit=qtwidts.QLineEdit()

self.setFocusProxy(self.Edit)
这确实会在编辑行开始编辑,但我失去了通过列进行制表的能力。“有没有办法保持这种状态?”西诺你在问题中没有指出这一点。如果你有另一个问题,那么再创建另一个问题,这就是SO的逻辑。好吧,stackoverflow迫使我在提问之间等待90分钟。所以你肯定会在今天或明天看到后续问题。你能给我一个提示,说明我遗漏了什么吗?除非你需要另一篇文章的额外澄清。如果你有任何想法,我在一个新问题中问了这个问题。这确实会在编辑行开始编辑,但我失去了通过列进行制表的能力。“有没有办法保持这种状态?”西诺你在问题中没有指出这一点。如果你有另一个问题,那么再创建另一个问题,这就是SO的逻辑。好吧,stackoverflow迫使我在提问之间等待90分钟。所以你肯定会在今天或明天看到后续问题。你能给我一个提示,说明我遗漏了什么吗?除非你需要另一篇文章的额外澄清。如果你有任何想法,我在一个新问题中问了这个问题。