2016-05-16 47 views
7

Sto riscontrando un problema oscuro (bug?) Con il mio programma QML Python3. Ho implementato un QAbstractListModel con un metodo di acquisizione personalizzato per accedere agli elementi QObject sottostanti. Nel momento in cui cerco di ottenere lo stesso Python QObject in due posti diversi in QML ottengo:Access Python QObject da QML non riesce a convertire in seconda chiamata

metodo
TypeError: unable to convert a Python 'QMyItem' object to a C++ 'QObject*' instance 

il GET si presenta così:

@pyqtSlot(int, result=QMyItem) 
def get(self, row): 
    return self._items[row] 

E il modello come questo:

ComboBox { 
    model: mymodel 
    textRole: 'name' 
    onActivated: mymodel.item = model.get(index) 
    onModelChanged: currentIndex = getCurrentIndex(mymodel, mymodel.item) 
} 

Il problema non è in realtà correlato al modo in cui recupero QObject. Sembra davvero che riguardi la conversione da Python a QML. Come se il convertitore conservasse una lista di riferimenti già passati e in qualche modo non fosse sincronizzato.

Ora ho un campione minimo che mostra l'errore. Prendi la fonte da https://github.com/sturmf/python_samples.git e vai nella cartella pyqt_combobox_qabstractlistmodel. Qui inizia il campione con python3 main.py. Nel ComboBox mostrato vedi che puoi selezionare l'articolo three ma l'articolo one ti dà un errore sulla console. Il motivo è che l'articolo uno era già passato da Python a QML e non funziona una seconda volta.

Forse il QObject convertito è stato recuperato in qualche modo dalla parte di QML?

risposta

5

Quindi il problema era che la spazzatura lato QML ha raccolto i miei oggetti dopo averli consegnati a QML. Il motivo è che non ho mai impostato un genitore per questo QObjects.