1

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

当我选择一个项目时,我想以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);

这将创建文件模型。

我收到此错误:

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

选定文件:

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')

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

你能帮帮我吗?

4

3 回答 3

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()函数。有一个index()函数,它返回一个.QItemSelectionModelQItemSelectionQModelIndexList

于 2013-08-06T13:45:04.787 回答
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 会发现您不需要信号中的任何一个参数。

于 2013-08-06T13:15:23.133 回答
0
QString filepath = filemodel->fileName(index);

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

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

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

于 2013-08-06T13:12:16.950 回答