QFileDialog:是否可以仅过滤可执行文件(在Linux下)?

时间:2018-05-07 11:22:34

标签: linux qt qt4

我想使用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相关。)

2 个答案:

答案 0 :(得分:1)

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

这应该有效:

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

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

答案 1 :(得分:-1)

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

在我的情况下,代码如下:

#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