用户可以在QFileDialog中选择的文件限制数量

时间:2020-06-17 15:58:25

标签: c++ qt qfiledialog

代码在这里:

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&)后更新文件。

这就是为什么我不知道如何跟踪当前选定文件的原因。 另一个问题是,如果用户超出允许的选择限制,我目前还不知道如何取消最后选择的文件。

我看到了几个示例,其中人们可以使用QProxyModelQFileDialog来实现自定义功能,但我不确定最适合我的需求。

2 个答案:

答案 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的继承者...

  1. 名为ListView的QListView
  2. 名为侧边栏的QSidebar

(其中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

我只是简短地测试了上面的代码,但是它似乎按照要求的方式工作。

相关问题