2014-04-28 1 views
1

Je cherche désespérément à comprendre comment fonctionne le QDataWidgetMapper. Par conséquent, j'ai écrit une petite application de démonstration avec un modèle personnalisé dérivé de QAbstractTableModel. Si je lance l'application, je suppose, que je reçois la sortie suivante:QDataWidgetMapper: faux mappage

Firstname: Walter 
Surname: Pinkman 

Cependant, je reçois:

Firstname: Jesse 
Surname: Pinkman 

Qu'est-ce que je manque?

J'ai essayé aussi de changer le orientation-property de QDataWidgetMapper, mais je reçois:

Firstname: White 
Surname: Pinkman 

exemple:

#!/usr/bin/env python 

import sys 

from PyQt4 import QtGui 
from PyQt4 import QtCore 

class myModel(QtCore.QAbstractTableModel): 
    def __init__(self, parent = None): 
     QtCore.QAbstractTableModel.__init__(self, parent) 
     self.lst = [ 
        ["Walter", "White"], 
        ["Jesse", "Pinkman"] 
        ] 


    def columnCount(self, parent = QtCore.QModelIndex()): 
     return len(self.lst[0]) 


    def rowCount(self, parent = QtCore.QModelIndex()): 
     return len(self.lst) 


    def data(self, index, role = QtCore.Qt.DisplayRole): 
     row = index.row() 
     col = index.column() 
     if role == QtCore.Qt.EditRole: 
      return self.lst[row][col] 

class Window(QtGui.QWidget): 
    def __init__(self, parent=None): 
     super(Window, self).__init__(parent) 

     model = myModel(self) 

     # Set up the widgets. 
     firstnameLabel = QtGui.QLabel("Firstname:") 
     surnameLabel = QtGui.QLabel("Surname:") 
     firstname = QtGui.QLabel(self) 
     surname = QtGui.QLabel(self) 

     # Set up the mapper. 
     mapper = QtGui.QDataWidgetMapper(self) 
     mapper.setModel(model) 

     #map first row, first column to "firstname" 
     mapper.addMapping(firstname, 0, "text") 
     mapper.toFirst() 

     #map first row, second column to "surname" 
     mapper.addMapping(surname, 1, "text") 
     mapper.toNext() 

     #set up layout 
     layout = QtGui.QGridLayout() 
     layout.addWidget(firstnameLabel, 0, 0) 
     layout.addWidget(firstname, 0, 1) 
     layout.addWidget(surnameLabel, 1, 0) 
     layout.addWidget(surname, 1, 1) 
     self.setLayout(layout) 

if __name__ == '__main__': 
    app = QtGui.QApplication(sys.argv) 

    window = Window() 
    window.show() 

    sys.exit(app.exec_()) 

Répondre

1

Tout est parfaitement OK. C'est parce que QDataWidgetMapper définit les données pour tous les widgets connectés, donc en utilisant toNext vous définissez les données de la deuxième rangée pour tous les widgets mappés.

+0

Ok, mais quel est le but de cela? Mon hypothèse était, que je pourrais utiliser 'QDataWidgetMapper' pour mapper certains index de mon modèle personnalisé aux widgets. Connaissez-vous une autre façon d'accomplir cela? – user2494129

+0

@ user2494129 Changeons votre question: combien de fois quelqu'un doit montrer des données jointes à partir de plusieurs lignes de _différentes lignes? La ligne du tableau est le tuple de données de base et c'est tout. Dans votre cas, vous avez probablement besoin de mappeurs séparés pour vos widgets. – Bogdan

+0

Honte à moi, je n'ai pas pensé à utiliser des mappers séparés. Parfois, il est difficile de voir la forêt à travers les arbres ;-) Merci pour votre aide! – user2494129