qlistview с флажками с использованием пользовательской модели - PullRequest
1 голос
/ 18 марта 2011

У меня есть подклассная модель файловой системы, чтобы включить чекбоксы в просмотр списка, который работает нормально.Моя проблема заключается в том, что всякий раз, когда я щелкаю элемент, текст этого элемента исчезает, а когда я щелкаю другой элемент, текст ранее выбранного элемента становится видимым.Может кто-нибудь, пожалуйста, сообщите мне причину этого.

Вот код, который я реализовал.

Пожалуйста, скажите мне, что мне здесь не хватает, Спасибо

#include "custommodel.h"
#include <iostream>

using namespace std;

CustomModel::CustomModel()
{

}

QVariant CustomModel::data(const QModelIndex& index, int role) const
{
    QModelIndex parent=this->parent(index);
    if(role == Qt::DecorationRole)
    {
        if(this->filePath(parent)=="")
        {
            return QIcon(":/Icons/HardDisk.png");
        }

        else if(this->isDir(index))
        {
            QDir dir(this->filePath(index));
            QFileInfoList files = dir.entryInfoList(QDir::NoDotAndDotDot | 
                                                    QDir::Files | QDir::Dirs);
            for(int file = 0; file < files.count(); file++)

                if(files.count()>0)
                    return QIcon(":/Icons/FullFolder.png");
            if(files.count()==0)
                return QIcon(":/Icons/EmptyFolder.png");

        }
        else{

            QFileInfo fi( this->filePath(index));
            QString ext = fi.suffix();

            if(ext=="jpeg"||ext=="jpg"||ext=="png"||ext=="bmp")
                return QIcon(filePath(index));
           }
    }

   if (role == Qt::CheckStateRole && !(this->filePath(parent)==""))
       return checklist.contains(index) ? Qt::Checked : Qt::Unchecked;
   return QFileSystemModel::data(index, role);

}

Qt::ItemFlags CustomModel::flags(const QModelIndex& index) const
{

    return QFileSystemModel::flags(index)| Qt::ItemIsUserCheckable;

}

bool CustomModel::setData(const QModelIndex& index, const QVariant& value, int role)
{

    if (role == Qt::CheckStateRole) {

        if (value == Qt::Checked)
            checklist.insert(index);
        else
            checklist.remove(index);

        emit dataChanged(index, index);
        return true;
    }
    return QFileSystemModel::setData(index, value, role);
}

1 Ответ

1 голос
/ 18 мая 2011

Не уверен, что это уместно, но я нашел следующее примечание по адресу: http://doc.trolltech.com/4.6/qt.html#ItemFlag-enum

"Обратите внимание, что проверяемым элементам необходимо предоставить как подходящий набор флагов, так и начальное состояние, указывающее, является ли элементпроверяется или нет. Это обрабатывается автоматически для компонентов модели / вида, но его необходимо явно установить для экземпляров QListWidgetItem, QTableWidgetItem и QTreeWidgetItem. "

Насколько я понимаю, ваш код выглядит правильно- но, возможно, попробуйте установить флаг ItemIsUserCheckable в базовом классе QFileSystemModel (в вашем пользовательском конструкторе) и посмотреть, работают ли унаследованные методы data () и setData () с role = Qt :: CheckStateRole.Если вам нужно сохранить список того, что в настоящее время проверено по какой-то другой причине, тогда продолжайте и сделайте это в своем производном setData (), но все же вызовите QFileSystemModel :: setData ().

Тем временем яя ищу, почему мой QTreeView не обновляет метку времени, когда я изменяю файл (если я не закрываю и не перезагружаю свое приложение, что-то вроде цели!) ... похоже, что сигнал dataChanged () не излучается.

...