【问题标题】:QFileDialog: is it possible to filter only executables (under Linux)?QFileDialog:是否可以仅过滤可执行文件(在 Linux 下)?
【发布时间】:2018-09-06 17:37:45
【问题描述】:

我想使用 QFileDialog 让用户选择一个可执行文件。除了目录之外,该对话框应该只显示实际的可执行文件。

我的 Windows 版本运行良好,只需检查扩展名是否为 exe。但是,在 Linux 中,我无法按照自己的意愿进行操作。

在 C++ 中,我的尝试如下所示:

QString target_dir = ...
QFileDialog file_dialog;
file_dialog.setFilter(QDir::Executable | QDir::Files);
QString file = file_dialog.getOpenFileName(this, tr("Open Exectuable"), target_dir);

但是,此代码会导致显示所有个文件。

我尝试添加一些其他过滤器,但到目前为止没有任何效果。 StackOverflow 上已经有两个问题与我的基本相同,都没有实际答案:

Filtering executable files in QFileDialog on Linux

show only directories and executables on Ubuntu using QFileDialog

有人知道怎么做吗?还是 QFileDialog 根本做不到?是否可以完成,或者识别可执行文件通常不是那么简单?

(注意:我使用 Qt 4.8.5,因为我使用与 Qt 5 不兼容的第三方代码,如果这很重要的话。)

(注意:没有将其标记为 C++,因为它也与 Python 相关。)

【问题讨论】:

  • 如果你尝试file_dialog.setFilter(QDir::Executable | QDir::Files);会怎样?
  • @vahancho 正如我所写,同样,这根本没有效果。但我会相应地编辑我的问题,因为你的问题更简洁。

标签: linux qt qt4


【解决方案1】:

如果您使用本机文件对话框,则某些设置无效。

这应该可行:

   QFileDialog dlg(this, tr("Select executable"));
   dlg.setOption(QFileDialog::DontUseNativeDialog, true);
   dlg.setFilter(QDir::Executable | QDir::Files);

请注意,这将归档可执行文件。同时显示文件夹没有已知的解决方案。

【讨论】:

  • dlg.setFilter(QDir::Executable | QDir::Files | QDir::Folders | QDir::NoDotAndDotDot); ?我现在没有Qt,只是提个建议
  • 没有 QDir::Folders。只有所有目录。无论如何,这也是我尝试过的,但没有效果
  • 有点遗憾,它不适用于文件夹,但感谢您的回答。
【解决方案2】:

使用代理模型进行文件对话。

在我的例子中,代码如下:

#include <QSortFilterProxyModel>
#include <QFileSystemModel>

// Custom proxy for filtering executables
class FileFilterProxyModel : public QSortFilterProxyModel
{
private:
    virtual bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const;
};

bool FileFilterProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const
{
    QFileSystemModel* fileModel = qobject_cast<QFileSystemModel*>(sourceModel());
    QFileInfo file( fileModel->filePath(sourceModel()->index(sourceRow, 0, sourceParent)) );

    if (fileModel!=NULL && file.isExecutable())
        return true;
    else
        return false;
}

// usage of proxy model
QFileDialog dialog( this, tr("Choose a file"));
FileFilterProxyModel* proxyModel = new FileFilterProxyModel;
dialog.setProxyModel(proxyModel);
dialog.setOption(QFileDialog::DontUseNativeDialog); // required by proxy model
if( dialog.exec() == QDialog::Accepted ) {
    ...
}

这显示了在 Linux 和 Windows (Qt 4.8.6) 上测试的可执行文件和文件夹

Full sources

【讨论】:

    猜你喜欢
    • 2012-04-28
    • 1970-01-01
    • 2021-07-30
    • 2013-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-09
    相关资源
    最近更新 更多