Вот моя модель, которая наследует 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 с моим деревом не работает хорошо, иногда он зависает и блокируется. Я думаю, это потому, что моя модель обновляется очень часто. Как я могу решить эту проблему и предотвратить обновление очень часто?
QFileSystemModel
перечисляет каталоги в фоновом потоке, чтобы избежать блокировки пользовательского интерфейса. Однако, как только он получает список обновлений в QFileSystemModelPrivate::_q_fileSystemChanged
Затем он выбирает значки для файла в главном потоке, используя QFileInfoGatherer::getInfo()
который в свою очередь вызывает QFileIconProvider::icon(QFileInfo)
,
Вы должны знать, что модели не используют другой поток. они используют основной поток.
Если вы хотите использовать Model, используйте дизайн загрузки (ожидания) в вашем пользовательском интерфейсе, чтобы выделить время для загрузки.
Других решений пока нет …