QTableview в PySide6 несколько раз вызывает data() для строк, которые не должны быть видны.Python

Программы на Python
Ответить
Anonymous
 QTableview в PySide6 несколько раз вызывает data() для строк, которые не должны быть видны.

Сообщение Anonymous »

Я протестировал QTableview в pyside6, используя приведенный ниже код. Когда QTableview получает фокус и мы сворачиваем окно, когда мы восстанавливаем окно, процедура data() может быть вызвана несколько раз с ролью 10. Я проверил, что роль 10 предназначена для проверки состояния флажка в таблице. Я не использую флажки в таблице, и процесс вызова data(), если в QTableview хранится много записей, создаст ощущение, что программа зависает/не отвечает на некоторое время.
Однако этот инцидент является случайным и непоследовательным. Иногда зацикливается, иногда ведет себя нормально.
Кто-нибудь еще сталкивался с тем же? Есть ли способ это исправить?
from PySide6.QtWidgets import QApplication, QMainWindow, QTableView, QStyleFactory
from PySide6.QtCore import QAbstractTableModel, Qt
import numpy as np

class MyTableModel(QAbstractTableModel):

def __init__(self, data):
super().__init__()
self._data = data

def rowCount(self, parent=None):
return len(self._data)

def columnCount(self, parent=None):
return len(self._data[0]) if self._data else 0

def data(self, index, role=Qt.DisplayRole):
print(index.row(), role)
if role == Qt.DisplayRole:
return self._data[index.row()][index.column()]
return None

def headerData(self, section, orientation, role=Qt.DisplayRole):
if role == Qt.DisplayRole and orientation == Qt.Horizontal:
return f"Column {section + 1}"
return None

class MainWindow(QMainWindow):

def __init__(self):
super().__init__()
self.setWindowFlags(Qt.Widget)
self.resize(800, 600)
self.setWindowTitle("QTableView on pyside6 looping data() make slow")

self.table_view = QTableView()
data = [["Item A1", "Longer Item B1", "Item C1"] for _ in range(6000)]
self.model = MyTableModel(data)
self.table_view.setModel(self.model)

self.setCentralWidget(self.table_view)

if __name__ == "__main__":

app = QApplication([])
app.setStyle(QStyleFactory.create("Fusion"))
window = MainWindow()
window.setWindowFlags(Qt.Window)
window.show()
app.exec()


Подробнее здесь: https://stackoverflow.com/questions/798 ... -not-be-vi
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»