Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python QTableView()仅在选中时更新更改_Python_Pyqt_Pyqt5 - Fatal编程技术网

Python QTableView()仅在选中时更新更改

Python QTableView()仅在选中时更新更改,python,pyqt,pyqt5,Python,Pyqt,Pyqt5,我已将数据插入子类QAbstractListModel,并使用QListView和QTableView 更改(删除行)立即显示在QListView中,但仅当选择了表视图时才会显示在QTableView中 subcassed模型包含setData方法,其中包含self.dataChanged.emit(index,index),因此它应该自我更新。 为什么`QTableView不立即更新自身 #!/usr/bin/env python """ minimum code to run a m

我已将数据插入子类
QAbstractListModel
,并使用
QListView
QTableView

更改(删除行)立即显示在
QListView
中,但仅当选择了表视图时才会显示在
QTableView

subcassed模型包含
setData
方法,其中包含
self.dataChanged.emit(index,index)
,因此它应该自我更新。
为什么`QTableView不立即更新自身

#!/usr/bin/env python

"""
minimum code to run a model view

"""



import sys
from PyQt5 import QtWidgets as qtw
from PyQt5 import QtCore as qtc
from PyQt5 import QtGui as qtg


class ViewModel(qtc.QAbstractListModel):
    def __init__(self, input_data=None):
        super().__init__()
        self.input_data = input_data or []




    # naming of rows ,columns static !!
    def headerData(self, section, orientation, role):
        if role == qtc.Qt.DisplayRole:
            if orientation == qtc.Qt.Horizontal:


                return "dude" # todo dynamic labeling
            else:

                return "leboswki"  # todo dynamic labeling



    def data(self, index, role):

        if role == qtc.Qt.DisplayRole:
            row = index.row() # == wie liste[row] der index

            item = self.input_data[row]
            return item




    def rowCount(self, index): # parameter inside is needed !

        return len(self.input_data)



    def flags(self, index):
        return qtc.Qt.ItemIsEditable | qtc.Qt.ItemIsSelectable | qtc.Qt.ItemIsEnabled



    def setData(self, index, value, role):

        if role == qtc.Qt.EditRole:
            row = index.row()
            if index.isValid():
                self.input_data[row] = value
                self.dataChanged.emit(index, index)
                return True
            else:
                return False


    def removeRows(self, position, rows, parent=qtc.QModelIndex()):
        self.beginRemoveRows(parent, position, position + rows-1)

        for i in range(rows):
            value = self.input_data[position]
            self.input_data.remove(value)

        self.endRemoveRows()
        return True





class MainWindow(qtw.QWidget):
    def __init__(self):
        super().__init__()

        # View
        list_view = qtw.QListView()
        self.model = ViewModel(input_data=["text1", "text2", "text3", "text4"])
        list_view.setModel(self.model)


        table_view = qtw.QTableView()
        table_view.setModel(self.model)


        # widgets
        self.deleate_row_button = qtw.QPushButton("deleate rows")

        # layout
        qvboxlayout = qtw.QVBoxLayout()
        qvboxlayout.addWidget(list_view)
        qvboxlayout.addWidget(table_view)
        qvboxlayout.addWidget(self.deleate_row_button)
        self.setLayout(qvboxlayout)
        self.show()

        # function
        self.deleate_row_button.clicked.connect(lambda: self.model.removeRows(-1, 1))


if __name__ == '__main__':
    app = qtw.QApplication(sys.argv)
    w = MainWindow()
    sys.exit(app.exec_())



虽然在Python中,您可以访问负索引,但在Qt中不会发生导致错误的情况。解决方法是将负指数转换为正指数。另一方面,不要按行的值(
self.input\u data.remove(value)
)删除行,因为如果它有两行相同的文本,可能会出现错误

def rowCount(self, index=qtc.QModelIndex()):
    return 0 if index.isValid() else len(self.input_data)
def-remoterows(self、position、rows、parent=qtc.QModelIndex()):
如果位置<0,则位置=(位置+self.rowCount())否则位置
开始=位置
结束=位置+行-1
self.beginRemoveRows(父、开始、结束)
del self.输入_数据[开始:结束+1]
self.endRemoveTows()

返回True
尽管在Python中可以访问负索引,但这不会在导致错误的Qt中发生。解决方法是将负指数转换为正指数。另一方面,不要按行的值(
self.input\u data.remove(value)
)删除行,因为如果它有两行相同的文本,可能会出现错误

def rowCount(self, index=qtc.QModelIndex()):
    return 0 if index.isValid() else len(self.input_data)
def-remoterows(self、position、rows、parent=qtc.QModelIndex()):
如果位置<0,则位置=(位置+self.rowCount())否则位置
开始=位置
结束=位置+行-1
self.beginRemoveRows(父、开始、结束)
del self.输入_数据[开始:结束+1]
self.endRemoveTows()
返回真值