代码在这里:
dialog = new QFileDialog(this);
dialog->setFileMode(QFileDialog::ExistingFiles);
connect(dialog, SIGNAL(currentChanged(const QString&)),
this, SLOT(dialogSelectionChanged(const QString&)));
void MainWindow::dialogSelectionChanged(const QString& file)
{
QStringList selected = dialog->selectedFiles();
}
问题是
fileSelected(const QString&)
和filesSelected(const QStringList&)
仅在按“打开”按钮后才发出。 currentChanged(const QString&)
仅传递新选择的文件selectedFiles()
返回我在上一步中选择的文件。对话框可能会在发出currentChanged(const QString&)
后更新文件。这就是为什么我不知道如何跟踪当前选定文件的原因。 另一个问题是,如果用户超出允许的选择限制,我目前还不知道如何取消最后选择的文件。
我看到了几个示例,其中人们可以使用QProxyModel
或QFileDialog
来实现自定义功能,但我不确定最适合我的需求。
答案 0 :(得分:2)
没有任何方法,但是一旦客户端完成选择,您就可以通过调用方法selectedFiles
来验证操作。该QStringList的大小大于您的约束,您可以中止该操作并显示一些错误消息。
喜欢
void MainWindow::dialogSelectionChanged(const QString& file)
{
QStringList selected = dialog->selectedFiles();
if(selected.size()>LIMIT)
{
showErrorMsg("some helpful mesage");
}
}
答案 1 :(得分:1)
如果您愿意接受无耻的骇客:-)
假设以下代码...
QFileDialog fd;
使用fd
检查fd.findChildren<QListView *>()
会发现它有两个孩子,它们是QListView
的继承者...
(其中QSidebar对Qt专用)。
假设名为QListView
的{{1}}是您感兴趣的小部件,您可以将回调函数连接到其选择模型...
listView
QFileDialog fd;
for (const auto &i: fd.findChildren<QListView *>("listView")) {
auto *sm = i->selectionModel();
QObject::connect(sm, &QItemSelectionModel::selectionChanged,
[sm](const QItemSelection &selected, const QItemSelection &deselected)
{
/*
* Here we pass a hard-coded max selected items
* value of 5 to the real callback/slot.
*/
handle_selection_updated(5, sm, selected, deselected);
});
}
的定义如下...
handle_selection_updated
我只是简短地测试了上面的代码,但是它似乎按照要求的方式工作。