QDataWidgetMapper和QAbstractTableModel

时间:2013-03-18 20:57:41

标签: qt pyqt qtableview qabstracttablemodel

QAbstractTableModel显示QTableView。该表有2列和几行。每个单元格为QLineEdit。我的问题是,是否有一种方法可以将QDataWidgetMapper::addMapping与我的自定义模型一起使用(对于QLineEdit单元格)。

1 个答案:

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