Hi Python Эксперты PyQt4:Как программно изменять/обновлять данные в Python PyQt4 TableView?
Я хотел бы иметь таблицу в окне QWidget и обновлять таблицу каждый раз, когда пользователь вводит значение в поле lineEdit. Как это сделать программно?
Статус: Я получаю следующее сообщение об ошибке в код: TypeError: QAbstractTableModel.beginInsertRows (QModelIndex, Int, Int): аргумент 2 имеет неожиданный тип 'ул'
from PyQt4 import QtGui , QtCore
import sys
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
_fromUtf8 = lambda s: s
class ABCTableModel(QtCore.QAbstractTableModel):
def __init__(self,data,parent=None):
QtCore.QAbstractTableModel.__init__(self,parent)
self.__data=data # Initial Data
def rowCount(self, parent):
return len(self.__data)
def columnCount(self , parent):
return len(self.__data)
def data (self , index , role):
if role == QtCore.Qt.DisplayRole:
row = index.row()
column = index.column()
value = self.__data[row][column]
return QtCore.QString(str(value))
def setData(self, index, value):
self.__data[index.row()][index.column()] = value
return True
def flags(self, index):
return QtCore.Qt.ItemIsEnabled|QtCore.Qt.ItemIsEditable|QtCore.Qt.ItemIsSelectable
def insertRows(self , position , rows , item , parent=QtCore.QModelIndex()):
# beginInsertRows (self, QModelIndex parent, int first, int last)
self.beginInsertRows(QtCore.QModelIndex(),position,position)
self.__data.append(item) # Item must be an array
self.endInsertRows()
return True
class Ui_MainWindow(QtGui.QMainWindow , QtGui.QWidget):
def __init__(self):
QtGui.QMainWindow.__init__(self,None)
QtGui.QWidget.__init__(self,None)
def setupUi(self, MainWindow):
self.centralwidget = QtGui.QWidget(MainWindow)
self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
self.tableView = QtGui.QTableView(self.centralwidget)
self.tableModel=ABCTableModel([[1,2,3],[2,3,4],[4,5,6]])
self.tableView.setModel(self.tableModel)
self.lineEdit_1 = QtGui.QLineEdit(self.centralwidget)
self.lineEdit_2 = QtGui.QLineEdit(self.centralwidget)
self.lineEdit_3 = QtGui.QLineEdit(self.centralwidget)
self.tableModel.insertRows(self.lineEdit_1.text(),self.lineEdit_2.text(), self.lineEdit_3.text())
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
MainWindow = QtGui.QMainWindow() # <-- Instantiate QMainWindow object.
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
Спасибо за ваш ответ. Я получил несколько ошибок и смог обновить соответственно. Однако я все еще получаю следующую ошибку: TypeError: QAbstractTableModel.beginInsertRows (QModelIndex, int, int): аргумент 2 имеет неожиданный тип 'str'. Вот обновленный код: от PyQt4 импорта QtGui, QtCore импорт SYS попробовать: _fromUtf8 = QtCore.QString.fromUtf8 кроме AttributeError: _fromUtf8 = лямбда s: s –
класс ABCTableModel (QtCore.QAbstractTableModel): Защиту __init__ (не сам, данные, родитель = None): QtCore.QAbstractTableModel .__ INIT __ (самостоятельно, родитель) Селф .__ данные = данные # Исходные данные защиту ROWCOUNT (я, родитель): возврата Len (Self .__ данных) def columnCount (self, parent): return len (self .__ data) def data (self, index, role): if role == QtCore.Qt.DisplayRole: row = index.row() column = index.column() value = self .__ data [row] [column] return QtCore.QString (str (значение)) –
@CM: Я обновил код, взгляните. Чтобы понять, что я сделал, посмотрите: http: //pyqt.sourceforge.net/Docs/PyQt4/qabstractitemmodel.html#beginInsertRows – TheCreator232