Просмотр сообщений
|
Страниц: 1 ... 5 6 [7] 8 9
|
91
|
Qt / Model-View (MV) / Re: QTreeView + QFileSystemModel - удаление папки/файла
|
: Апрель 07, 2015, 16:10
|
Воткнуть его можно в любой проект.
Удаление папки/мамки - опасная операция, можно грохнуть исходники проекта и хз насколько свежа последняя копия. Не случайно в ОС есть и undo и удаляется только в trash. Ну что то подобное было. Но вроде как подстраховался. Это локальный менеджер за пределы которого пользователю не позволено выходить. Предназначен для создания каталога текстовых файлов, при нажатии на которые в другом окне появляется информация. Наверное что то вроде вивера. Но пользователь может определить любой каталог который и будет главным (локальным) хранилищем, за него запрещено выходить и само хранилище не может удалить, кроме как в штатном менеджере. Можно только менять расположение. Внутри же можно создавать и удалять папки/файлы. Причем может удалять только пустые папки и видит только текстовые файлы. Так что пользователь работает только с тем, что сам и создал в пределах менеджера. Кроме того, для текстовых файлов предполагается корзина и файлы не должны удаляться напрямую, а должны перемещаться в эту папку... Так что вроде как изолировал и кое что предусмотрел. Но если считаете, что может быть на столько серьезно постараюсь пересмотреть код и подумать, что можно было бы есче сделать в плане защиты.
|
|
|
92
|
Qt / Model-View (MV) / Re: QTreeView + QFileSystemModel - удаление папки/файла
|
: Апрель 07, 2015, 11:32
|
Не читал ваши темы но не кажется ли что проще все объеденить в одну тему нежели плодить одно и тоже 4 раза?
Вы не внимательны я наплодил уже 6 раз... Однако все сабжики разные и темы четко определены, что не противоречит ни правилам хорошего тона, ни правилам форума... С тем же успехом можно предложить объединить все топики в заголовке которых выявлены слова QTreeView и QFileSystemModel. P.S. Не обещаю, но возможно когда нибудь я выложу в отдельный топик исходник менеджера для обсуждения, что бы вслушать критику его качества и произвести оптимизацию. Довольно не плохо получилось обойтись определением всего парой классов и получить то, что обычно требовало 3-4 класса. Обсуждаемые вопросы задавались не раз на просторах интернета, ответов найдено мало, если вообще найдены и весьма расплывчаты, требующие наращивать код и разбираться с документацией, некоторые решения оригинальны, хоть и тривиальны. Этот же код вышел на вид прост для новичков вроде меня как учебное пособие. При этом функционал не хуже, а код умещается в заветные 500 строк. Воткнуть его можно в любой проект.
|
|
|
93
|
Qt / Model-View (MV) / Re: QTreeView + QFileSystemModel - удаление папки/файла
|
: Апрель 07, 2015, 11:27
|
gil9red спасибо! Я ведь только учусь . Год крапел над учебниками и видео по С/С++ до тех пар пока не осталось недопонимания при объяснении учебного материала, что бы изнутри осознать процессы и начать правильно читать чужой код/примеры/советы... До этого год кодил, но осозновал поверхностно. QT подтягиваю по мере работы. Практики практически нет. Оптимально писать код с ходу не могу. Да и все таки осталось еще не мало белых пятен которые пройдут только с практикой. За советы спасибо. Значит пишем так: C++ (Qt) if(m_managerModel->fileInfo(index).isDir()) { if( m_managerModel->hasChildren(index) ) { m_managerView->expand(index); QMessageBox::warning(0, tr( "Content Manager" ), tr( "Directory is not empty!" ), QMessageBox::Cancel); } else { m_managerModel->rmdir(index); } }
|
|
|
94
|
Qt / Model-View (MV) / Re: QTreeView + QFileSystemModel - удаление папки/файла
|
: Апрель 07, 2015, 05:30
|
Итак если переопределяем метод: C++ (Qt) bool managerModel::hasChildren( const QModelIndex & parent ) const { return QDir(filePath(parent)).count() > 2; }
То удаление папок дерева выглядит подобным образом: C++ (Qt) if( m_managerModel->hasChildren(index) ) { m_managerView->expand(index); QMessageBox* pmbx = new QMessageBox(QMessageBox::Warning, tr( "Content Manager" ), tr( "Directory is not empty!" ), QMessageBox::Cancel); pmbx->exec(); delete pmbx; } else { m_managerModel->rmdir(index); }
Аккуратнее? Эффективнее ли? Во всяком случае не короче, но как то с технической точки зрения правильнее.
|
|
|
95
|
Qt / Model-View (MV) / Re: QTreeView + QFileSystemModel - скрыть стрелку пустых папок
|
: Апрель 07, 2015, 04:55
|
Тогда hasChildren вызывается только для директорий и можно на isDir не проверять.
У файлов гарантированно rowCount == 0. ЗЫ: решение с rowCount > 2 будет самым быстрым, листинг директории - медленная штука (а в модели это уже закешировано) Подобные варианты были испытаны еще до того как пришлось спросить здесь. При любых обстоятельствах не рисует дерево со стрелками. При запуске программы стрелки отсутствуют вообще и к внутренней структуре папки не доступиться. Наверное кеш строится по мере открытия папок. На сколько помню проверка показала, что этот метод считает точное колличество элементов в папке без точек. Однако только после того как папка была расскрыта. Поэтому здесь http://www.prog.org.ru/topic_28658_0.html пришлось проверять на существование каталог после его удаения и таким способом выходить из положения. Причем как то странно работает, казалось бы зачем воообще считать колличество строк в таком случае? Но без такой проверки работать отказывалось. Не пустая папка как и положенно не удаляется, но не удалялась как не пустая и rowCount тут не причем поскольку qDebug() показывает что этот мето не считает количество детей если она ни разу не открывалась. И соответственно соответствующее окно предупреждения для пользователя я не мог вывести. К тому же после такой проверки эту папку не возможно было удалить из представления даже если я удаляю все ее содержимое.
|
|
|
103
|
Qt / Model-View (MV) / Re: QTreeView + QFileSystemModel - скрыть стрелку пустых папок
|
: Апрель 06, 2015, 19:46
|
Снова метод железного тыка привел к такому варианту: C++ (Qt) bool managerModel::hasChildren( const QModelIndex & parent ) const { if(fileInfo(parent).isDir()) { QDirIterator it(filePath(parent)); it.next(); it.next(); return it.hasNext(); } return false; }
Работает и покороче (что посоветуете?): C++ (Qt) bool managerModel::hasChildren( const QModelIndex & parent ) const { QDirIterator it(filePath(parent)); it.next(); it.next(); return it.hasNext(); }
Работает как часы. Однако хотелось бы спросить на сколько все плохо? Почему приходится итератор пару раз передвигать и почему его вообще надо двигать?
|
|
|
105
|
Qt / Model-View (MV) / Re: QTreeView + QFileSystemModel - запрет редактирования имени файла
|
: Апрель 06, 2015, 07:00
|
Ok! Решаем задачу подобным образом. Ставим, что то вроде фильтра на двойное нажатие клавиши мыши, прежде чем позволяем пользователю редактировать имя файла: C++ (Qt) connect( m_managerView, SIGNAL( doubleClicked( QModelIndex ) ), this, SLOT( editName( QModelIndex ) ) ); ... ... void managerWidget::editName(const QModelIndex &index) { QString generalName = m_managerModel->rootPath() + "/general.txt"; if(!index.isValid()) { return; } else if(m_managerModel->filePath(index) == generalName ) { m_managerModel->setReadOnly( true ); return; } m_managerModel->setReadOnly( false ); m_managerView->edit(index); }
Попутный вопрос. Работаю на виртуальной машине VMware. Имеется такая проблема: При двойном нажатии левой клавиши мыши на имени файла для редактирования, часто имя затирается и устанавливается 0. С чем это может быть связано с VMware или кодом? Как бы это исправить? И еще вопрос. Необходимо что бы смена пункта дерева происходила только при щелчке левой кнопки мыши. Как отцепить колесико и правую кнопку мыши, которая должна показывать только контекстное меню для текущего итема, но не инициировать переход на него?
|
|
|
Страниц: 1 ... 5 6 [7] 8 9
|
|
|