我有一个QAbstractTableModel
由QTableView
. 该表有 2 列和几行。每个单元格是一个QLineEdit
. 我的问题是是否有一种方法可以QDataWidgetMapper::addMapping
与我的自定义模型(用于QLineEdit
单元格)一起使用。
问问题
797 次
1 回答
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_())
于 2013-03-19T00:00:25.650 回答