使用QFileSystemModel访问文件路径

时间:2013-08-06 13:08:10

标签: c++ qt

我在QFileSystemModel中有一个QListView,允许我选择文件系统中的项目。

当我选择一个项目时,我想在QMessageBox中返回文件路径。

到目前为止,我有以下代码:

filemodel = new QFileSystemModel(this);
filemodel->setFilter(QDir::NoDotAndDotDot | QDir::Files);
filemodel->setNameFilters(filters);
filemodel->setNameFilterDisables(false);
filemodel->setRootPath(sPath);

//get file path
QString filepath = filemodel->fileName(index);
QMessageBox::information(this, "title", filepath);

ui->listView->setModel(filemodel);

这会创建filemodel。

我收到了这个错误:

  

mainwindow.cpp:46:错误:没有匹配函数来调用'QFileSystemModel :: fileName(char *(&)(const char *,int))'

这是正确的方法吗?选择项目时返回文件路径?

编辑@dunc123

在构造函数中:

connect(ui->listView->selectionModel(), SIGNAL(selectionChanged(const QItemSelection &, const QItemSelection &)), this, SLOT(selectedFile(QItemSelection one, QItemSelection two)));

selectedFile:

void MainWindow::selectedFile(QItemSelection one, QItemSelection two){
    QString file_name = filemodel->fileName(ui->listView->selectionModel()->currentIndex());
    QMessageBox::information(this, "title", file_name);
}

它构建并运行但是当我点击文件时,我收到以下错误:

Object::connect: No such slot MainWindow::selectedFile(QItemSelection one, QItemSelection two) in ../Images/mainwindow.cpp:26

Object :: connect :(接收者名称:'MainWindow')

我假设传递变量的方式是错误的?

你可以帮帮我吗?

3 个答案:

答案 0 :(得分:1)

您需要将QModelIndex对象传递给QFileSystemModel的fileName方法。看起来符号“索引”正在被解析为一个函数。猜测你的类中有一个名为index的成员函数。

编辑: 这里更大的问题是,当你在QListView中选择一个项目时,你想要发生一些事情,但是你要在构造函数中处理这个代码。您需要在班级中创建一个插槽,并将其连接到选择项目时发出的信号。

connect(ui->listView->selectionModel(), SIGNAL(selectionChanged(const QItemSelection &, const QItemSelection &), this, SLOT(...));

在此插槽中,您应该调用fileName方法并显示该信息。您还需要使filemodel成为类的成员变量,以便您可以从插槽中访问它。

编辑2: 调用connect时指定插槽的方式不正确,应该是:

connect(ui->listView->selectionModel(), SIGNAL(selectionChanged(const QItemSelection &, const QItemSelection &)), this, SLOT(selectedFile(QItemSelection , QItemSelection)));

但是,由于您没有在插槽中使用这些参数中的任何一个,因此您可以将它们从插槽中一起删除,例如在标题中将其定义为:

void selectedFile();

使用以下方式连接:

connect(ui->listView->selectionModel(), SIGNAL(selectionChanged(const QItemSelection &, const QItemSelection &)), this, SLOT(selectedFile()));

QT将确定您不需要信号中的任何一个参数。

答案 1 :(得分:1)

您可以使用QItemSelectionModel::selectedIndexes()函数获取所选索引的列表。

以下是一个如何使用它的例子:

QModelIndexList list = ui->listView->selectionModel()->selectedIndexes();
foreach (QModelIndex index, list)
{
    QString file_name = fileModel->fileName(index);            
}

或者,如果您只能选择一个项目,则可以使用QItemSelectionModel::currentIndex这样的功能:

QString file_name = fileMode->fileName(ui->listView->selectionModel()->currentIndex());

您还可以将QItemSelectionModel::selectionChanged信号连接到插槽,并以类似的方式使用它。 QListView具有selectionModel()函数,可用于检索QItemSelectionModel对象。 QItemSelection有一个indexes()函数,返回QModelIndexList

答案 2 :(得分:0)

QString filepath = filemodel->fileName(index);

mainwindow.cpp:46: error: no matching function for call to 'QFileSystemModel::fileName(char* (&)(const char*, int))'

看起来“index”是一个函数,而不是QModelIndex ...

您可以使用连接到模型信号“currentChanged(QModelIndex,QModelIndex)”的插槽来获取新选择的索引。