我正在制作一个简单的文件浏览器,但Qt遇到了一些问题。我想向用户展示他计算机上文件的树状视图,但是我也希望能够选择多个文件/目录,并在以后对它们进行一些处理(通过选择checkboxes
或使用ctrl +左键单击或Shift +左键)。我已经放置了QTreeView
元素并为其建立了模型(QFileSystemModel
)。它给了我很好的树状视图,但是我不能修改标题(列名),也不能在每行中添加带有checkbox
的自己的列(例如)。 Qt对我来说是新手,我已经搜索了好几个小时的一些技巧/解决方案,但QFileSystemModel
却无济于事。有什么我可以做的工作吗?
代码简短明了:
QString lPath = "C:/";
QString rPath = "C:/";
leftTree_model = new QFileSystemModel(this);
rightTree_model = new QFileSystemModel(this);
leftTree_model->setRootPath(lPath);
rightTree_model->setRootPath(rPath);
//i have actually 2 tree views that work the same
ui->leftTree->setModel(leftTree_model); //ui->leftTree is the first tree view
ui->rightTree->setModel(rightTree_model); //the second
最佳答案
使用以下内容:
CheckStateRole将复选框添加到模型中。为此,您将从QFileSystemModel
继承自定义项目模型(将要使用),并重新实现data()
方法,在该方法中为bool
返回CheckStateRole
值。您还需要QAbstractItemModel::setData
方法来处理更改。您还可以检查docs for QAbstractItemModel以查看如何更改标题文本(headerData()
)
更改视图的selection mode以允许多项选择
编辑:
这是从模型继承的示例代码
class MyFancyModel : public QFileSystemModel
{
public:
MyFancyModel(QObject* pParent = NULL) : QFileSystemModel(pParent)
{
}
QVariant data(const QModelIndex & index, int role = Qt::DisplayRole ) const
{
if (role == Qt::CheckStateRole)
{
// stub value is true
return true; // here you will return real values
// depending on which item is currently checked
}
return QFileSystemModel::data(index, role);
}
};