我在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')
我假设传递变量的方式是错误的?
你可以帮帮我吗?答案 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)”的插槽来获取新选择的索引。