2013-03-18 4 views
1

QTableView으로 표시됩니다. 테이블에는 2 개의 열과 2 개의 행이 있습니다. 각 셀은 QLineEdit입니다. 제 질문은 QDataWidgetMapper::addMapping을 내 맞춤 모델 (QLineEdit 셀의 경우)과 함께 사용하는 방법입니다.QDataWidgetMapper 및 QAbstractTableModel

+0

당신이 샘플 코드를 달성하고자하는 것을 표현하려고 할 수 있을까요? –

답변

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_())