Russian Qt Forum
Май 14, 2024, 00:17 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: 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() показывает что этот мето не считает количество детей если она ни разу не открывалась. И соответственно соответствующее окно предупреждения для пользователя я не мог вывести. К тому же после такой проверки эту папку не возможно было удалить из представления даже если я удаляю все ее содержимое.
96  Qt / Model-View (MV) / Re: QTreeView + QFileSystemModel - удаление папки/файла : Апрель 06, 2015, 21:25
Поскольку здесь разобрались http://www.prog.org.ru/topic_28726_0.html Может теперь лучше использовать метод hasChildren?
97  Qt / Model-View (MV) / Re: QTreeView + QFileSystemModel - скрыть стрелку пустых папок : Апрель 06, 2015, 21:10
Все в порядке. У файлов плюсиков (треугольники) нет.
98  Qt / Model-View (MV) / Re: QTreeView + QFileSystemModel - скрыть стрелку пустых папок : Апрель 06, 2015, 21:02
Проверка на  isDir даст ли прирост в скорости хоть сколько нибудь? Или это будет отказоустойчивее?
99  Qt / Model-View (MV) / Re: QTreeView + QFileSystemModel - скрыть стрелку пустых папок : Апрель 06, 2015, 20:56
Вот так все просто:
Код
C++ (Qt)
bool managerModel::hasChildren( const QModelIndex & parent ) const
{
 return QDir(filePath(parent)).count() > 2;
}
100  Qt / Model-View (MV) / Re: QTreeView + QFileSystemModel - скрыть стрелку пустых папок : Апрель 06, 2015, 20:51
Спасибо! Перепроверить уже успел. Действительно парочку так же надо было прибавить.
101  Qt / Model-View (MV) / Re: QTreeView + QFileSystemModel - скрыть стрелку пустых папок : Апрель 06, 2015, 20:44
Помоему это первое, что пришло в голову испробовать. Однако почему то не прокатило. Пустые папки не оказывались таковыми.
Но попробую повнимательней, возможно какая нибудь мелочь типа "." и ".." не дала результат сразу.
102  Qt / Model-View (MV) / Re: QTreeView + QFileSystemModel - скрыть стрелку пустых папок : Апрель 06, 2015, 20:17
Да действительно. Спасибо! Сам не догадался проверить Улыбающийся
qDebug() << it.next();
А как само решение? Не слишком грубо и какой вариант предпочесть?
Спрашиваю, поскольку практического опыта не много и не могу оценить решение.
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();
}

Работает как часы. Однако хотелось бы спросить на сколько все плохо? Почему приходится итератор пару раз передвигать и почему его вообще надо двигать?
104  Qt / Model-View (MV) / QTreeView + QFileSystemModel - скрыть стрелку пустых папок : Апрель 06, 2015, 15:42
Теперь наверное точно застрял в этой серии http://www.prog.org.ru/topic_28581_0.html
Понятия не имею как скрыть расскрывающие стрелки пустых папок?
Пытался переопределить:
Код
C++ (Qt)
bool managerModel::hasChildren( const QModelIndex & parent ) const
{
 return rowCount(parent) > 0;
}
Не дает должного результата.

Здесь уже вряд ли без помощи профи разобраться, во всяком случае быстро.
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

Страница сгенерирована за 0.201 секунд. Запросов: 23.