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

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: 1 ... 6 7 [8] 9
106  Qt / Model-View (MV) / QTreeView + QFileSystemModel - запрет редактирования имени файла : Апрель 05, 2015, 11:51
В этой модели http://www.prog.org.ru/topic_28581_0.html пользователь может отредактировать имя файла.
Но стоит задача запретить редактирование определенного имени файла.
Соответственно вопрос. Как это проще сделать?
107  Qt / Model-View (MV) / Re: QTreeView + QFileSystemModel - Drag and Drop : Апрель 05, 2015, 06:54
Ну что ж пока опять методом упорного тыка наткнулся на простейший вариант:
Код
C++ (Qt)
 connect( managerModel, SIGNAL( fileRenamed( QString, QString, QString ) ),
          this, SLOT( sortTree() ) );
 
...
...
 
void managerWidget::sortTree()
{
 m_managerView->sortByColumn(1, Qt::AscendingOrder);
 m_managerView->sortByColumn(0, Qt::AscendingOrder);
}
Отрабатывает как изменения имен файлов так и каталогов.
108  Qt / Model-View (MV) / Re: QTreeView + QFileSystemModel - Drag and Drop : Апрель 04, 2015, 05:38
Методом упорного тыка, все таки, удалось заставить правильно работать сортировку:
Код:
  m_managerView->sortByColumn(1, Qt::AscendingOrder);
  m_managerView->sortByColumn(0, Qt::AscendingOrder);
Или так:
Код:
  managerModel->sort(1, Qt::AscendingOrder);
  managerModel->sort(0, Qt::AscendingOrder);  
Как видим, компактно, но как то странно-некрасиво да и не понятно, почему именно так. К тому же в тестовом коде не хочет работать. Ну может что то не аккуратно переснял. Возможно кого то наведет на мысль такое поведение и пояснит суть.
Тем не менее в оригинале работает как часы.

Но вот такая проблемка осталась. В оригинале после создания папки, папка теперь встает на своеместо в дереве. Однако после этого я позволяю пользователю дать ей имя:
Код:
  managerModel->mkdir(index, newNameFolder);
  index = managerModel->index(newFullNameFolder);
  m_managerView->setCurrentIndex(index);

  m_managerView->edit(index); //NEW NAME
  m_managerView->sortByColumn(1, Qt::AscendingOrder);
  m_managerView->sortByColumn(0, Qt::AscendingOrder);
Если меняем имя, дальнейшей пересортировки уже не происходит.
Соответственно вопрос. Как теперь связать изложенный способ пересортировки с изложенной ситуацией? Т.е. ясно, что как то надо определить, что пользователь ввел новое имя и вызвать метод, созданный на основе вышеизложенного способа.
Т.е. вопрос в том как определить, что пользователь закончил ввод нового имени?



P.S. Попутный вопрос не относящийся к сабжу. Почему при редактировании топика повторно не получатся использовать code=cpp. Код выглядит так:
 m_managerView->sortByColumn(1, Qt::AscendingOrder);
109  Qt / Model-View (MV) / Re: QTreeView + QFileSystemModel - Drag and Drop : Апрель 03, 2015, 15:24
Приложил действующий код с контекстным меню создания папки, с надеждой что подсказка все таки будет.
К сожалению задача осталась не решенной.
Пересортировка дерева после создания новой папки не происходит. Сейчас же папка создается в конце текущей ветки.

При Drag and Drop из одной папки в другую в оригинальной версии программы срабатывает автосортировка, значит отсылка какого то сигнала есть.
Однако в прикрепленном примере и это не работает.
110  Qt / Model-View (MV) / Re: QTreeView + QFileSystemModel - Drag and Drop : Апрель 02, 2015, 16:06
Таким нехитрым способом осуществил копирование с переносом по Ctrl:
Код
C++ (Qt)
void JournalManagerWidget::keyPressEvent(QKeyEvent *event)
{
 if(event->key() == Qt::Key_Control)
   m_managerView->setDragDropMode( QAbstractItemView::DragDrop );
}
 
void JournalManagerWidget::keyReleaseEvent(QKeyEvent *event)
{
 if(event->key() == Qt::Key_Control)
   m_managerView->setDragDropMode( QAbstractItemView::InternalMove );
}
С виду работает как положенно. Достаточна ли такая реализация?
Теории начитался и наслушался, вроде как не особо сложно разбираться. Но катастрофически мала практика кодинга. Поэтому страхуюсь вопросами. Что бы сразу исключить побочные проблемы. Ну допустим здесь следует дальше послать собитие.


По поводу вопроса выше на счет перетасквиния в пределах одной папки, т.е. сортировка пользователем. Если нет ответов, полагаю простых решений нет.
Но хотя бы решить такую проблему:
- Само дерево сортируется по алфавиту (папки вверху, файлы внизу). Метод setSortingEnabled ожидаемого результата не дает для меня, просто папки оказываются внизу.
- Однако это пол беды. При создании новой папки или файла, они определяются в конце дерева или текущей папки. Т.е. автосортировки не происходит.
- Если перетащить файл или папку, то происходит обновление дерева (автосортируется).
- Такое поведение создает хаос.
 Подскажите как избавиться? Сделать так, что бы дерево обновлялось при создании нового пунка.
111  Qt / Model-View (MV) / Re: QTreeView + QFileSystemModel - Drag and Drop : Апрель 01, 2015, 13:47
Вышеописанным образом перетаскивание не работает в пределах одной паки (с папки в папку можно).
Как быть, где рыть?
112  Qt / Model-View (MV) / Re: QTreeView + QFileSystemModel - удаление папки/файла : Апрель 01, 2015, 13:30
Спасибо за помощь!

Но поступил попроще. Покритикуйте:
Код
C++ (Qt)
   if( !managerModel->rowCount( index ) )
   {
     managerModel->rmdir( index );
   }
   if( QDir( managerModel->filePath( index ) ).exists() )
   {
     m_managerView->expand( index );
     QMessageBox* pmbx =
         new QMessageBox( QMessageBox::Warning,
                         "Manager",
                         "Directory is not empty!",
                         QMessageBox::Cancel );
     pmbx->exec();
     delete pmbx;
   }

Попутно, можно ли вместо m_managerView->expand( index ); как то расскрыть всю ветку простым способом?
113  Qt / Model-View (MV) / Re: QTreeView + QFileSystemModel - удаление папки/файла : Март 30, 2015, 18:06
Еще одна маленькая неувязка.
Метод rowCount(index) не считает строки если папка ни разу не была открыта.
С чем это может быть связанно и как поправить?
114  Qt / Model-View (MV) / Re: QTreeView + QFileSystemModel - удаление папки/файла : Март 30, 2015, 14:39
Авварон
Спасибо за ясный ответ Улыбающийся. Действительно небыло смысла заморачиваться.
115  Qt / Model-View (MV) / Re: QTreeView + QFileSystemModel - удаление папки/файла : Март 27, 2015, 19:20
Однако в описании метода ясно сказано как он должен работать и об узкой направленности ничего не сказанно. Тут что то другое. Но наверное сам должен разобраться где напартачил. Не хотелось бы пользоваться более медленным методом.
К тому же показ галочек так же надо будет отладить.
116  Qt / Model-View (MV) / Re: QTreeView + QFileSystemModel - удаление папки/файла : Март 27, 2015, 05:46
Однако придется лепить проверку.
К сожалению и здесь не все гладко. Можно сориентироваться посчитав количество строк у родителя. Так работает:
Код
C++ (Qt)
   if(dirmodel->fileInfo(index).isDir())
   {
//        if(!dirmodel->hasChildren(index))
       if(!dirmodel->rowCount(index))
           dirmodel->rmdir(index);
   }

А вот этот метод:
Код:
if(!dirmodel->hasChildren(index))
При любых обстоятельствах дает true и если папка пуста в том числе.
Может кто в курсе, что может быть не так?
117  Qt / Model-View (MV) / QTreeView + QFileSystemModel - удаление папки/файла : Март 26, 2015, 04:33
В продолжение темы (там вложен работающий исходник Модель/Представление) http://www.prog.org.ru/topic_28603_0.html

Код
C++ (Qt)
void MainWindow::contextMenuDelete()
{
   QModelIndex index = ui.treeView->currentIndex();
   if(!index.isValid())
       return;
   if(dirmodel->fileInfo(index).isDir())
   {
       dirmodel->rmdir(index);
//            dirmodel->remove(index);
   }
   else if( dirmodel->fileInfo(index).isFile() )
 
       dirmodel->remove(index);
 
       if( dirmodel->fileInfo(ui.treeView->indexBelow(index)).isFile() )
       {
           index = ui.treeView->indexBelow(index);
       }
       else
       {
           index = ui.treeView->indexAbove(index);
       }
}

Если удалять пустую папку, все в порядке, удаляется как положенно.
Если пользователь попытается удалить папку, содержащую другую папку, как и положенно папка не может быть удалена.
Но после такой попытки проблема такого плана: вложенная папка удаляется (если пуста), однако пункт остается видим в treeView. Если после этого удалить родителя, то родительская и вложенная папки исчезнут.
Наверное можно решить проблему путем предварительной проверки на пустоту папки, но что то как то не соображу по поводу метода проверки?
Возможно информации немного, но может кто сталкивался с такой проблемой и поделится вариантом решения?
Если удалить через индекс модели (закомментированно), удаляет, но и все вложенное содержимое, что не безопасно для пользователя.

С удалением файлов все впорядке. Но есть маленький недостаток при удалении файла на мгновение видно расширение файла. Как то возможно это поправить?

118  Qt / Model-View (MV) / QTreeView + QFileSystemModel - Drag and Drop : Март 15, 2015, 11:48
В продолжение тем:
QTreeView + QFileSystemModel - скрыть расширения файлов http://www.prog.org.ru/topic_28581_0.html
QTreeView + QFileSystemModel - чекбоксы http://www.prog.org.ru/topic_28586_0.html

Прикручиваем Drag and Drop
Код:
#include <QTreeView>

#include "MainWindow.h"
#include "ui_MainWindow.h"
#include "CFileSystemModel.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QTreeView *treeView = new QTreeView();
    treeView->setModel(new CFileSystemModel);
    setCentralWidget(treeView);

// Настройка Drag and Drop
    //    Выбор режима выделения (множественный)
    treeView->setSelectionMode( QAbstractItemView::ExtendedSelection );

    treeView->setDragEnabled(true);
    treeView->setAcceptDrops(true);
    treeView->setDropIndicatorShown(true);

    //    Включаем режим перетаскивания (по умолчанию копирование)
    treeView->setDragDropMode( QAbstractItemView::InternalMove );

}

MainWindow::~MainWindow()
{
    delete ui;
}

Реализован режим перетаскивания файлов и папок с возможностью множественного выбора.

Пока не реализован режим копирования по Ctrl. Может кто подскажет легкий путь.
И немного не аккуратно - при опперации перетаскивания у файла на мгновение появляется расширение.

Сам код во вложении.
119  Qt / Model-View (MV) / Re: QTreeView + QFileSystemModel - чекбоксы : Март 13, 2015, 11:07
Спасибо, учту.
Код
C++ (Qt)
#include "cfilesystemmodel.hh"
#include <QDebug>
CFileSystemModel::CFileSystemModel(QObject *parent)
   : QFileSystemModel(parent)
   , m_needFilenameWithExt(false)
   , m_topFolder(false)
{
}
 
Qt::ItemFlags CFileSystemModel::flags(const QModelIndex &index) const
{
    return QFileSystemModel::flags(index) | Qt::ItemIsUserCheckable | Qt::ItemIsEditable
}
 
QVariant CFileSystemModel::data(const QModelIndex &index, int role) const
{
    if (!index.isValid())
    {
        return QVariant();
    }
    else if(role == Qt::CheckStateRole)
    {
        return checkedIndexes.contains(index) ? Qt::Checked : Qt::Unchecked;
    }
    else if (role == Qt::DisplayRole && fileInfo(index).isFile())
    {
        return m_needFilenameWithExt ? fileInfo(index).fileName() : fileInfo(index).baseName();
    }
    else if (role == Qt::EditRole)
    {
        return fileInfo(index).baseName();
    }
    else
    {
        return QFileSystemModel::data(index, role);
    }
}
 
bool CFileSystemModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
    if(index.isValid() && role == Qt::CheckStateRole)
    {
 
        if (fileInfo(index).isFile() || m_topFolder == false) {
            if(value == Qt::Checked)
                checkedIndexes.insert(index);
            else
                checkedIndexes.remove(index);
        }
        if(hasChildren(index) == true && m_topFolder == false)
        {
            recursiveCheck(index, value);
        }
        emit dataChanged(index, index);
        return true;
    }
    else if (index.isValid() && role == Qt::EditRole && fileInfo(index).isFile())
    {
        m_needFilenameWithExt = true;
        bool result = QFileSystemModel::setData(index, value.toString() + "." + fileInfo(index).completeSuffix(), role);
        m_needFilenameWithExt = false;
        return result;
    }
    return QFileSystemModel::setData(index, value, role);
}
 
bool CFileSystemModel::recursiveCheck(const QModelIndex &index, const QVariant &value)
{
    m_topFolder = true;
    if(hasChildren(index))
    {
        int i;
        int childrenCount = rowCount(index);
        QModelIndex child;
 
        for(i=0; i<childrenCount; i++)
        {
            child = QFileSystemModel::index(i, 0, index);
            setData(child, value, Qt::CheckStateRole);
        }
    }
    m_topFolder = false;
}
Однако пока, что то тут не совсем все в порядке. Пока папка в первый раз не открыта, то при проставке галочки, внутренние файлы не отмечаются.

Третья часть     
QTreeView + QFileSystemModel - Drag and Drop http://www.prog.org.ru/index.php?topic=28603.msg209271#msg209271
120  Qt / Model-View (MV) / Re: QTreeView + QFileSystemModel - чекбоксы : Март 13, 2015, 10:35
Еще одним вопросом меньше. Вариант без рекурсии, захода во внутренние папки.
Если есть замечания или более компактные варианты, буду рад выслушать.
Во вложении пример виджета.
Код
C++ (Qt)
#include "cfilesystemmodel.hh"
#include <QDebug>
CFileSystemModel::CFileSystemModel(QObject *parent)
   : QFileSystemModel(parent)
   , m_needFilenameWithExt(false)
   , m_topFolder(false)
{
}
 
Qt::ItemFlags CFileSystemModel::flags(const QModelIndex &index) const
{
    return QFileSystemModel::flags(index) | Qt::ItemIsUserCheckable | Qt::ItemIsEditable
}
 
QVariant CFileSystemModel::data(const QModelIndex &index, int role) const
{
    if (!index.isValid())
    {
        return QVariant();
    }
    else if(role == Qt::CheckStateRole)
    {
        return checkedIndexes.contains(index) ? Qt::Checked : Qt::Unchecked;
    }
    else if (role == Qt::DisplayRole && fileInfo(index).isFile())
    {
        return m_needFilenameWithExt ? fileInfo(index).fileName() : fileInfo(index).baseName();
    }
    else if (role == Qt::EditRole)
    {
        return fileInfo(index).baseName();
    }
    else
    {
        return QFileSystemModel::data(index, role);
    }
}
 
bool CFileSystemModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
    if(index.isValid() && role == Qt::CheckStateRole)
    {
        if(value == Qt::Checked)
        {
            if (fileInfo(index).isFile() || m_topFolder == false)
            {
                checkedIndexes.insert(index);
            }
 
            if(hasChildren(index) == true && m_topFolder == false)
            {
                recursiveCheck(index, value);
            }
        }
        else
        {
            if (fileInfo(index).isFile() || m_topFolder == false)
            {
                checkedIndexes.remove(index);
            }
 
            if(hasChildren(index) == true && m_topFolder == false)
            {
                recursiveCheck(index, value);
            }
        }
        emit dataChanged(index, index);
        return true;
    }
    else if (index.isValid() && role == Qt::EditRole && fileInfo(index).isFile())
    {
        m_needFilenameWithExt = true;
        bool result = QFileSystemModel::setData(index, value.toString() + "." + fileInfo(index).completeSuffix(), role);
        m_needFilenameWithExt = false;
        return result;
    }
    return QFileSystemModel::setData(index, value, role);
}
 
bool CFileSystemModel::recursiveCheck(const QModelIndex &index, const QVariant &value)
{
    m_topFolder = true;
    if(hasChildren(index))
    {
        int i;
        int childrenCount = rowCount(index);
        QModelIndex child;
 
        for(i=0; i<childrenCount; i++)
        {
            child = QFileSystemModel::index(i, 0, index);
            setData(child, value, Qt::CheckStateRole);
        }
    }
    m_topFolder = false;
}
Страниц: 1 ... 6 7 [8] 9

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