2013-03-18 29 views
1

我有一個QAbstractTableModelQTableView顯示。該表有2列和幾行。每個單元格都是QLineEdit。我的問題是,如果有我的自定義模型(QLineEdit單元格)使用QDataWidgetMapper::addMapping的方法。QDataWidgetMapper和QAbstractTableModel

+0

你能嘗試表達你想達到與示例代碼是什麼? – 2013-03-19 00:47:58

回答

0

我想你的意思QSignalMapper

#!/usr/bin/env python 
#-*- coding:utf-8 -*- 

from PyQt4 import QtGui, QtCore 

class MyLineEdit(QtGui.QLineEdit): 
    focused = QtCore.pyqtSignal() 

    def __init__(self, parent=None): 
     super(MyLineEdit, self).__init__(parent) 

     self.installEventFilter(self) 

    def eventFilter(self, obj, event): 
     if event.type() == QtCore.QEvent.FocusIn: 
      self.focused.emit() 

     return super(MyLineEdit, self).eventFilter(obj, event) 

class MyTableModel(QtCore.QAbstractTableModel): 
    def __init__(self, data, headers, parent=None): 
     super(MyTableModel, self).__init__(parent) 
     self.data = data 
     self.headers = headers 

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

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

    def data(self, index, role): 
     if not index.isValid(): 
      return QtCore.QVariant() 

     elif role != QtCore.Qt.DisplayRole: 
      return QtCore.QVariant() 

     return QtCore.QVariant(self.data[index.row()][index.column()]) 

    def headerData(self, section, orientation, role): 
     if orientation == QtCore.Qt.Horizontal \ 
     and role == QtCore.Qt.DisplayRole: 
      return QtCore.QVariant(self.headers[0][section]) 

     elif orientation == QtCore.Qt.Vertical \ 
     and role == QtCore.Qt.DisplayRole: 
      return QtCore.QVariant(self.headers[1][section]) 

     return QtCore.QVariant() 

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

     headers = [range(3), range(5)] 
     data = [ 
      str(x) * len(headers[0]) 
      for x in range(len(headers[1])) 
     ] 

     self.model = MyTableModel(data, headers, self) 

     self.tableView = QtGui.QTableView(self) 
     self.tableView.setModel(self.model) 

     self.layoutHorizontal = QtGui.QHBoxLayout(self) 
     self.layoutHorizontal.addWidget(self.tableView) 

     self.signalMapper = QtCore.QSignalMapper(self) 
     self.signalMapper.mapped.connect(self.on_signalMapper_mapped) 

     widgetNumber = 0 
     for rowNumber in range(self.model.rowCount()): 
      for columnNumber in range(self.model.columnCount()): 
       cellIndex = self.model.index(rowNumber, columnNumber) 

       lineEdit = MyLineEdit(self) 
       lineEdit.setText("row: {0} col: {1}".format(rowNumber, columnNumber)) 
       lineEdit.focused.connect(self.signalMapper.map) 

       self.signalMapper.setMapping(lineEdit, widgetNumber) 

       self.tableView.setIndexWidget(cellIndex, lineEdit) 

       widgetNumber += 1 

    @QtCore.pyqtSlot(int) 
    def on_signalMapper_mapped(self, i): 
     print self.signalMapper.mapping(i).text() 


if __name__ == "__main__": 
    import sys 

    app = QtGui.QApplication(sys.argv) 
    app.setApplicationName('MyWindow') 

    main = MyWindow() 
    main.resize(333, 222) 
    main.show() 

    sys.exit(app.exec_())