当对QTreeVi使用自定义itemregate时,如何在QLineEdit上自动开始编辑

2024-09-30 12:32:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试为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_()

Tags: selfnoneifinitmaindefqtedit

热门问题