Почему QTreeView.scrollTo () не работает изначально

NW.js позволяет создавать настольные приложения с использованием Javascript без всех ограничений безопасности, обычно размещаемых в браузере. Таким образом, вы можете запускать исполняемые файлы с помощью функции или создавать / редактировать / читать / писать / удалять файлы. Вы можете получить доступ к аппаратным средствам, таким как текущее использование ЦП или общий барабан, и т. Д.

Вы можете создать приложение для Windows, Linux или Mac, которое не требует установки.

Вот структура для NW.js, Universal GUI:

2
задан mins 23 January 2019 в 23:02
поделиться

1 ответ

Первая проблема может быть вызвана, если по умолчанию модель инициализирует свой текущий индекс в текущем каталоге. Это будет означать, что если вы снова установите с тем же индексом, сигнал изменения строки не будет излучаться (потому что ничего не изменилось). Это можно исправить, вызвав непосредственно обработчик изменения строки:

class MyWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        ...
        focus_path = QDir.currentPath()
        focus_index = self.my_model.index(focus_path)
        self.my_view.setCurrentIndex(focus_index)
        self.current_row_changed()

    def current_row_changed(self):
        index = self.my_view.currentIndex()
        self.my_view.scrollTo(index, QAbstractItemView.EnsureVisible)
        self.my_view.resizeColumnToContents(0)
        ...

Что касается второй проблемы: при вызове scrollTo может потребоваться развернуть несколько каталогов, чтобы выбрать требуемый индекс. Очевидно, это может изменить ширину первого столбца, поэтому вы всегда должны вызывать resizeColumnToContents после , чтобы получить правильную ширину.

ОБНОВЛЕНИЕ :

Я думаю, что есть и другая проблема, вызванная проблемами синхронизации. QFileSystemModel должен работать в некоторой степени асинхронно, потому что он должен запрашивать ресурсы у операционной системы, а затем ждать ответа. Кроме того, прежде чем он получит ответ, он не может заранее точно знать, сколько данных он собирается получить, поскольку файловая система, возможно, была обновлена ​​во время ожидания. Потенциально, ответ может включать данные из огромного каталога, содержащего тысячи файлов. Таким образом, чтобы обеспечить отзывчивость графического интерфейса, данные обрабатываются партиями, которые имеют достаточный размер для заполнения текущего представления. Если текущий индекс установлен до того, как окно было показано, и все его виджеты полностью разложены , нет гарантии, что представление сможет корректно изменять размеры своих столбцов.

Это может быть исправлено путем явного повторного вызова обработчика изменения строки через однократный таймер с небольшой задержкой. Это должно позволить представлению правильно пересчитать ширину столбцов:

    ...    
    focus_path = QDir.currentPath()
    focus_index = self.my_model.index(focus_path)
    self.my_view.setCurrentIndex(focus_index)
    QTimer.singleShot(50, self.current_row_changed)

def current_row_changed(self):
    index = self.my_view.currentIndex()
    self.my_view.scrollTo(index, QAbstractItemView.EnsureVisible)
    self.my_view.resizeColumnToContents(0)
0
ответ дан ekhumoro 23 January 2019 в 23:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: