0

以下は、カスタム委任の例ですQComboBox。選択を行い、クリックアウト (または でフォーカスを失うQComboBox) し、TAB で戻る (フォーカスを得る) と、元の選択が失われます。たとえば、以下のコードを使用して を選択"Item 2"し、クリックしてから TAB で戻ると、選択が元に戻ります"Item 1."

どうすれば選択を維持できますか?

この問題が発生するのは、クラスが初期化されるたびにクラスで使用addItem()しているためです。ただし、このメソッドにどのようにアプローチする必要があるのか​​ よくわかりません。TheEditor QComboBox代わりに、フォーカスされるたびにではなく一度だけ初期化されるようTheEditorに、クラスで初期化する必要がありますか? EditDelegate __ init __どうすればそれを適切に行うことができますか?

import sys
from PySide import QtCore, QtGui, QtSql

class EditDelegate(QtGui.QStyledItemDelegate):
    def __init__(self, parent=None):
            super(EditDelegate, self).__init__(parent)
    def createEditor(self, parent, option, index):
            editor = TheEditor(parent)                  
            return editor

class TheEditor(QtGui.QComboBox):
    def __init__(self, parent=None):
            super(TheEditor, self).__init__(parent)
            self.addItem("Item 1")
            self.addItem("Item 2")
            self.addItem("Item 3")
            self.setEditable(True)

class TheTable(QtGui.QTableWidget):
    def __init__(self, columns, parent=None):
            super(TheTable, self).__init__(parent)
            self.setItemDelegate(EditDelegate())
            self.setEditTriggers(QtGui.QAbstractItemView.AllEditTriggers)
            self.setColumnCount(1)
            self.setRowCount(1)
            self.setHorizontalHeaderLabels(["QCombo"])

class MainWindow(QtGui.QMainWindow):
    def __init__(self, parent=None):
            super(MainWindow, self).__init__(parent)
            self.setCentralWidget(TheTable(self))

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    frame = MainWindow()
    frame.show()
    app.exec_()

注: PySide v1.2.0

4

1 に答える 1

0

QTの紹介(モデル/ビュープログラミング)が言うように

エディター ウィジェットへのポインターを保持する必要がないことに注意してください。これは、ビューが不要になったときにそれを破棄する責任があるためです。

エディターは一時オブジェクトです。ただし、古いエディターからの選択をキャッチして、次のように新しいエディターに渡すことができます。

class EditDelegate(QtGui.QStyledItemDelegate):
    editorsLastIndex=None
    def __init__(self, parent=None):
        super(EditDelegate, self).__init__(parent)
    def createEditor(self, parent, option, index):
        editor = TheEditor(parent)             
        if self.editorsLastIndex != None:
            editor.setCurrentIndex(self.editorsLastIndex)
        editor.currentIndexChanged.connect(self.editorIndexChanged)
        return editor
    def editorIndexChanged(self, index):
        self.editorsLastIndex = index
于 2013-07-18T15:58:04.953 に答える