使用自定义模型带有复选框的 qlistview

发布于 2024-10-24 20:56:59 字数 2062 浏览 1 评论 0原文

我对 filesystemmodel 进行了子类化,以在 listview 中包含复选框,效果很好。我的问题是,每当我单击一个项目时,该项目的文本就会消失,而当我单击另一个项目时,先前选定的项目的文本就会变得可见。谁能告诉我其背后的原因。

这是我实现的代码。

请告诉我我在这里缺少什么, 谢谢

#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);
}

I have subclassed filesystemmodel to include checkboxes in listview , which is working fine. My problem is whenever I click an item the text of that item disappears and when i click another item the text of previously selected item becomes visible. Can anyone please tell me the reason behind it.

Here is the code i implemented.

Please tell me what i am missing here,
Thanks

#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);
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

子栖 2024-10-31 20:56:59

不确定它是否相关,但我在以下位置找到了以下注释:
http://doc.trolltech.com/4.6/qt.html#ItemFlag-枚举

请注意,需要为可检查项目提供一组合适的标志和初始状态,以指示该项目是否被检查。对于模型/视图组件,这是自动处理的,但需要为 QListWidgetItem、QTableWidgetItem 和 QTreeWidgetItem 的实例显式设置。

据我所知,您的代码看起来是正确的 - 但也许尝试在基本 QFileSystemModel 类(在您的自定义构造函数中)上设置 ItemIsUserCheckable 标志,看看是否继承的 data() 和 setData() 方法与 role=Qt::CheckStateRole 一起使用。

如果您因其他原因需要维护当前检查内容的列表,请继续在派生的 setData() 中执行此操作,但仍调用 QFileSystemModel::setData() 也是如此。

Not sure whether it's relevant, but I found the following note at:
http://doc.trolltech.com/4.6/qt.html#ItemFlag-enum

Note that checkable items need to be given both a suitable set of flags and an initial state, indicating whether the item is checked or not. This is handled automatically for model/view components, but needs to be explicitly set for instances of QListWidgetItem, QTableWidgetItem, and QTreeWidgetItem.

As far as I can make out, your code looks correct -- but maybe try setting the ItemIsUserCheckable flag on the base QFileSystemModel class (in your custom constructor), and see if the inherited data() and setData() methods work with role=Qt::CheckStateRole.

If you need to maintain a list of what's currently checked for some other reason, then go ahead and do so in your derived setData(), but still call QFileSystemModel::setData() as well.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文