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

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: 1 ... 7 8 [9]
121  Qt / Model-View (MV) / QTreeView + QFileSystemModel - чекбоксы : Март 12, 2015, 07:49
Немного усложним файловый виджет http://www.prog.org.ru/topic_28581_0.html

Код
C++ (Qt)
Qt::ItemFlags CFileSystemModel::flags(const QModelIndex &index) const
{
    return QFileSystemModel::flags(index) | Qt::ItemIsUserCheckable | Qt::ItemIsEditable
            | Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled;
}
 
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)
        {
            checkedIndexes.insert(index);
            if(hasChildren(index) == true)
            {
                recursiveCheck(index, value);
            }
        }
        else
        {
            checkedIndexes.remove(index);
            if(hasChildren(index) == true)
            {
                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)
{
    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);
        }
    }
}
Тестовый виджет прикреплен.

Что не нравится на данный момент:
- Если отметить папку, отмечаются рекурсивно все подкаталоги и их содержимое. Необходимо, что бы отмечались только файлы корневого каталога.
- Реализовать тройной чекбокс с неопределенным состоянием.

И соответственно сам вопрос, как доработать минимальными силами? Вопрос решаем, но как показала практика лучше поучиться у профи, чем днями ковырять код.

P.S. Один вопрос вопрос снят с повестки. Первый пока недорабтан.
По поводу третьего. Флажок то есть, но видимо его установки не достаточно.
122  Qt / Model-View (MV) / Re: QTreeView + QFileSystemModel - скрыть расширения файлов : Март 12, 2015, 04:30
Да действительно доделать оказалось минутным делом:
Код
C++ (Qt)
#include "cfilesystemmodel.hh"
#include <QDebug>
CFileSystemModel::CFileSystemModel(QObject *parent)
   : QFileSystemModel(parent)
   , m_needFilenameWithExt(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::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::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);
 }
 
Ваш переделанный тестовый проект во вложении. Возможно пригодится таким же новичкам с малой практикой как я. Хорош как пример для разбора начинающим, не сложен для понимания и осознания смысла отношений модель-представление (в учебниках как то более мудрено закручено). Здесь же получилось просто, без излишеств и с потенциалом расширения. Легко воткнуть в более сложный проект в качестве менеджера скажем журналов, закладок и не сложно улучшить стиль...

Но если честно не до конца осознал. Конечно сама логика кода не смущает, ее мне не сложно прочитать и понять как устроено и что надо было сделать, что бы все сработало. Но вот саму суть не понял. Почему изначально не сработало. Ведь вроде только просил показать в представлении имя файла и ничего не делать с данными и код уже забарахлил (может пока не было времени посмотреть внимательнее на решение)... Ну да ладно, поковыряю в дебаге... Улыбающийся.

За помощь искреннее спасибо! Пару дней минимум пришлось бы еще затратить на самостоятельные эксперменты, собственно пару и затратил прежде чем решил все таки спросить.

В этой ветке наверное уже нет смысла расширять проект с чекбоксами, возможно стоит открыть дополнительную.
QTreeView + QFileSystemModel - чекбоксы  http://www.prog.org.ru/topic_28586_0.html
123  Qt / Model-View (MV) / Re: QTreeView + QFileSystemModel - скрыть расширения файлов : Март 11, 2015, 20:45
Все таки не удержался примерил на своем проекте. Работает с файлами.
Ничего страшного. С переименованием папок пока не порядок. Думаю тут ничего сложного не будет, справлюсь (не обращал внимание). Но  может вам интересно будет довести свой тестовы проект до ума.
124  Qt / Model-View (MV) / Re: QTreeView + QFileSystemModel - скрыть расширения файлов : Март 11, 2015, 20:24
Великолепно!
Интересно то, что задачка вроде и не такая уж и сложная (зарядка), но вроде как часто нужная, а решений простых не находил. Тут быстренько мозговым штурмом... Поздновато у нас. Завтра прикручу к своему простенькому проекту  с чекбоксиками и что бы пользователь не выходил за пределы журнала... Улыбающийся.
Спасибо!
125  Qt / Model-View (MV) / Re: QTreeView + QFileSystemModel - скрыть расширения файлов : Март 11, 2015, 19:21
Однако первый вариант в точности так и работает (даже попроще вариант). Но как раз хотелось избавиться от расширения при отображении (при редактировании все в порядке - исчезает).
Жаль не хотелось усложнать проект, доволно просто и аккуратно выходило (своего рода встроенный менеджер с единственной корневой папкой, фильтром по расширению и чекбоксами). Но маленькая на первый взгляд проблемка... Наверное придется усложнать проект. Ничего страшного наверное нет, но надеялся на лучший исход.
126  Qt / Model-View (MV) / Re: QTreeView + QFileSystemModel - скрыть расширения файлов : Март 11, 2015, 18:35
Спасибо за помощь!
При таком раскладе. В представлении расширение все таки имеется.
Если оставить так:
Код:
     else if (role == Qt::DisplayRole)
     {
         return fileInfo(index).baseName();
     }
Расширение исчезает. Но в обоих случаях не получается переименовать файлы.

Но есть различие с первоначальным вариантом. Окно ошибки не выскакивает.
Однако результат редактирования не сохраняется (в обоих последних вариантах).
127  Qt / Model-View (MV) / QTreeView + QFileSystemModel - скрыть расширения файлов : Март 11, 2015, 15:16
Задача собственно получить простейший менеджер с именами файлов без расширения и возможностью редактирования, как здесь:


Такая картина если раскомментировать DisplayRole в Реализации модели:
Код:
#include "cfilesystemmodel.hh"
#include <QDebug>
 CFileSystemModel::CFileSystemModel(QObject *parent)
    : QFileSystemModel(parent)
{
}

 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::DisplayRole)
//     {
//         return 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::EditRole)
     {
         return QFileSystemModel::setData(index, value.toString() + "." + fileInfo(index).completeSuffix(), role);
     }
     return QFileSystemModel::setData(index, value, role);
 }
Однако при попытке сохранения отредакированного имени файла, выскакивает окно:


Соответственно если закомментировать то при редактировании как положенно мы можем менять имя без раширения, но в отображении расширение имеется, от которого все таки хочется избавиться:


Как поступить? Хотелось бы как можно проще без привлечения собственного делегата.
Страниц: 1 ... 7 8 [9]

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