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

QFileDialog:是否可以只过滤可执行文件(在Linux下)?,linux,qt,qt4,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.

我想使用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,已经有两个问题与我的基本相同,但都没有实际答案:

有人知道怎么做吗?还是QFileDialog根本无法做到这一点?这到底是可以做到的,还是识别可执行文件一般来说不是那么简单

注意:我使用Qt4.8.5,因为我使用的第三方代码与Qt5不兼容(如果有必要的话)


注意:没有标记为C++,因为它也与Python有关。

< P>如果使用本机文件对话框,有些设置没有效果。 这应该起作用:

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

请注意,这将仅用于文件管理器可执行文件。要同时显示文件夹,没有已知的解决方案。

使用文件对话框的代理模型

在我的案例中,代码如下所示:

#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上测试的可执行文件和文件夹


如果您尝试file_dialog.setFilterQDir::Executable | QDir::Files;,会怎么样@瓦汉乔,正如我所写的,同样,这根本没有效果。但我会相应地编辑我的问题,因为您的问题是更干净的变量.dlg.setFilterQDir::Executable | QDir::Files | QDir::Folders | QDir::NodeAndDotDot?我现在没有Qt,只是提出了一个建议没有QDir::Folders。只有奥尔迪。不管怎么说,这也是我尝试过的,但没有效果,有点遗憾的是,它不适用于文件夹,但谢谢你的回答。