Почему мое дерево в графическом интерфейсе с QFileSystemModel иногда зависает, когда я копирую файл в отдельном потоке (Qt)?

Вот моя модель, которая наследует QFileSystemModel

class MyFileSysModel : public QFileSystemModel
{
Q_OBJECT
public:
MyFileSysModel( QObject *parent = 0);
Qt::ItemFlags  flags(const QModelIndex &index) const;
bool dropMimeData(const QMimeData *data,
Qt::DropActions supportedDropActions() const;
};

в MainWindow я создал модель и инициализировал древовидную структуру

 MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
model = new MyFileSysModel(this);
model->setRootPath("/");
ui->treeView->setModel(model);

ui->treeView->setSelectionMode(QAbstractItemView::ExtendedSelection);
ui->treeView->setDragEnabled(true);
ui->treeView->viewport()->setAcceptDrops(true);
ui->treeView->setDropIndicatorShown(true);
ui->treeView->setDragDropMode(QAbstractItemView::DragDrop);
ui->treeView->setAcceptDrops(true);
ui->treeView->setDefaultDropAction(Qt::MoveAction);
}

Когда пользователь перетаскивает файл, он копирует в другой каталог в отдельном потоке

 class MoveFilesTask : public QObject, QRunnable
{
Q_OBJECT
void run()
{
QFile source("source_file_name");
source.open(QIODevice::ReadOnly);
QFile destination("some_destination");
destination.open(QIODevice::WriteOnly);
QByteArray buffer;
int chunksize = 200;

while(!(buffer = source.read(chunksize)).isEmpty())
{
destination.write(buffer);
}
destination.close();
source.close();
}
void MoveFilesTask::runFilesTransfer(QString source, QString destination)
{
QThreadPool::globalInstance()->start(this);
}
};

Файл копируется, но графический интерфейс в MainWindow с моим деревом не работает хорошо, иногда он зависает и блокируется. Я думаю, это потому, что моя модель обновляется очень часто. Как я могу решить эту проблему и предотвратить обновление очень часто?

0

Решение

QFileSystemModel перечисляет каталоги в фоновом потоке, чтобы избежать блокировки пользовательского интерфейса. Однако, как только он получает список обновлений в QFileSystemModelPrivate::_q_fileSystemChanged Затем он выбирает значки для файла в главном потоке, используя QFileInfoGatherer::getInfo() который в свою очередь вызывает QFileIconProvider::icon(QFileInfo),

Вы должны знать, что модели не используют другой поток. они используют основной поток.

Если вы хотите использовать Model, используйте дизайн загрузки (ожидания) в вашем пользовательском интерфейсе, чтобы выделить время для загрузки.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]