Nano Hash - криптовалюты, майнинг, программирование

Просмотр подобласти Qtableview

У меня есть qtableview, который позволяет пользователям редактировать значения в ячейках и обновлять базовую модель. Это отлично работает для небольших моделей (размер строки * столбца от 100 до 500), но становится неуправляемым при> 1000, а некоторые из моих моделей могут стать огромными (> 20000). Я подумал о том, чтобы позволить пользователю видеть подобласти модели и просматривать модель в табличном представлении. Но я не вижу методов, которые позволили бы мне это сделать, если только я не создам свой собственный. Я пропустил это? Было бы лучшим методом скрыть и показать большую часть модели? (Я думал о 4 кнопках, которые будут пролистывать данные (модель) вверх/вниз и влево-вправо)


  • вверх вниз влево вправо ?? модели не графические, если вы собираетесь обрабатывать много данных и у вас проблемы с эффективностью, не используйте QStandardItemModel, создайте свою собственную модель. часть отображения информации обрабатывается QTableView, она оптимизирована для отображения такой информации. что ты хочешь делать? 16.02.2018
  • Чтобы было ясно - общие функции QTableView и QStandardItemModel работают нормально. То, что я ищу, это ТОЛЬКО смотреть на N строк данных, начинающихся со смещения базовой строки X, и M количество столбцов данных, начинающихся со смещения базового столбца Y. 16.02.2018
  • хорошо, теперь я понимаю, вы хотите показать подмодель. :D 16.02.2018
  • PyQt4 или PyQt5? 16.02.2018
  • PyQt5 — это то, что я использую в эти дни. 16.02.2018
  • @ТимКарнахан. Используйте пользовательскую модель. См. этот ответ для базового сравнения (он использует pyqt4/qtablewidget, но принцип точно такой же). 16.02.2018

Ответы:


1

Если вы хотите получить только часть модели, вы можете использовать прокси, в этом случае мы создаем класс, который наследуется от QAbstractProxyModel:

class SubProxyModel(QAbstractProxyModel):
    def __init__(self, x, y, nrows, ncols, parent=None):
        QAbstractProxyModel.__init__(self, parent)
        self._x = x
        self._y = y
        self._rows = nrows
        self._cols = ncols

    def setX(self, x):
        self._x = x
        self.modelReset.emit()

    def setY(self, y):
        self._y = y
        self.modelReset.emit()

    def setNRows(self, nrows):
        self._rows = nrows
        self.modelReset.emit()

    def setNCols(self, ncols):
        self._cols = ncols
        self.modelReset.emit()

    def parent(self, child):
        return QModelIndex()

    def rowCount(self, parent=QModelIndex()):
        return self._rows

    def columnCount(self, parent=QModelIndex()):
        return self._cols

    def mapToSource(self, proxyIndex):
        r = proxyIndex.row()
        c = proxyIndex.column()

        nr = r + self._x
        nc = c + self._y
        return self.sourceModel().index(nr, nc)

    def mapFromSource(self, sourceIndex):
        ix = QModelIndex()
        if sourceIndex.isValid():
            r = sourceIndex.row()
            c = sourceIndex.column()
            nr = r - self._x
            nc = c - self._y
            ix = self.index(nr, nc)
        return ix

    def index(self, row, column, parent=QModelIndex()):
        return self.createIndex(row, column)

Пример:

class Widget(QWidget):
    def __init__(self, *args, **kwargs):
        QWidget.__init__(self, *args, **kwargs)

        xoffset, yoffset, nRows, nCols = 3, 4, 5, 6

        self.xSpinBox = QSpinBox()
        self.rowsSpinBox = QSpinBox()

        self.ySpinBox = QSpinBox()
        self.colsSpinBox = QSpinBox()

        glay = QGridLayout()

        glay.addWidget(QLabel("x offset:"), 0, 0)
        glay.addWidget(self.xSpinBox, 0, 1)
        glay.addWidget(QLabel("number of rows:"), 0, 2)
        glay.addWidget(self.rowsSpinBox, 0, 3)

        glay.addWidget(QLabel("y offset:"), 1, 0)
        glay.addWidget(self.ySpinBox, 1, 1)
        glay.addWidget(QLabel("number of cols:"), 1, 2)
        glay.addWidget(self.colsSpinBox, 1, 3)

        lay = QVBoxLayout(self)
        lay.addLayout(glay)

        self.table = QTableView()
        model = QStandardItemModel(1000, 1000)

        for i in range(model.rowCount()):
            for j in range(model.columnCount()):
                model.setItem(i, j, QStandardItem(f"{i}{j}"))

        proxy = SubProxyModel(xoffset, yoffset, nRows, nCols)

        self.xSpinBox.setValue(xoffset)
        self.ySpinBox.setValue(yoffset)
        self.rowsSpinBox.setValue(nRows)
        self.colsSpinBox.setValue(nCols)

        proxy.setSourceModel(model)
        self.table.setModel(proxy)
        lay.addWidget(self.table)

        self.xSpinBox.valueChanged.connect(self.onXValueChanged)
        self.ySpinBox.valueChanged.connect(self.onYValueChanged)
        self.rowsSpinBox.valueChanged.connect(self.onRowsValueChanged)
        self.colsSpinBox.valueChanged.connect(self.onColsValueChanged)

        self.xSpinBox.setMaximum(model.rowCount() - 1)
        self.ySpinBox.setMaximum(model.columnCount() - 1)

    def onRowsValueChanged(self, value):
        self.table.model().setNRows(value)

    def onColsValueChanged(self, value):
        self.table.model().setNCols(value)

    def onXValueChanged(self, value):
        self.rowsSpinBox.setMaximum(self.table.model().sourceModel().rowCount() - value)
        self.table.model().setX(value)

    def onYValueChanged(self, value):
        self.colsSpinBox.setMaximum(self.table.model().sourceModel().columnCount() - value)
        self.table.model().setY(value)


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

по следующей ссылке вы можете найти полный пример:

16.02.2018
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..