2014-04-28 173 views
1

我拼命想弄清楚QDataWidgetMapper是如何工作的。因此,我編寫了一個帶有從QAbstractTableModel派生的自定義模型的小型演示應用程序。如果我運行應用程序,我會承擔,我得到下面的輸出:QDataWidgetMapper:映射錯誤

Firstname: Walter 
Surname: Pinkman 

不過,我得到:

Firstname: Jesse 
Surname: Pinkman 

我缺少什麼?

我也試圖改變QDataWidgetMapperorientation-property,但後來我得到:

Firstname: White 
Surname: Pinkman 

例如:

#!/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_()) 

回答

1

一切是完全確定。這是因爲QDataWidgetMapper會爲所有連接的小部件設置數據,因此使用toNext您可以爲所有映射的小部件設置第二行的數據。

+0

好的,但是它的目的是什麼?我的假設是,我可以使用'QDataWidgetMapper'將我的自定義模型的一些索引映射到小部件。你知道另一種方法來實現嗎? – user2494129

+0

@ user2494129讓我們改變你的問題:有人需要多少次顯示來自幾個_different_行的表的連接數據?錶行是基本的數據元組,這就是全部。在你的情況下,你可能需要爲你的小部件分離映射器。 – Bogdan

+0

對我感到羞恥,我沒有想過使用單獨的映射器。有時很難通過樹木看到森林;-)感謝您的幫助! – user2494129