使用QFileDialog在Ubuntu上仅显示目录和可执行文件

时间:2016-04-17 13:00:05

标签: c++ qt ubuntu file-permissions qfiledialog

我试图在Ubuntu上创建QFileDialog,允许用户选择可执行文件,目的是文件是桌面应用程序(即类似于。 Windows上的exe 可执行文件子集。)

在Windows上,这是使用setNameFilter查找"(*.exe)"文件来实现的,但由于Ubuntu显然没有使用可执行文件的扩展名,因此您需要使用QDir::Filters方法

您认为以下内容可以解决问题

QFileDialog dialog;
dialog.setFilter(QDir::AllDirs | QDir::Executable);
// ...
dialog.exec();

但它实际上有过滤99%的文件系统条目的效果,包括几乎每个目录,使其无法导航。

似乎QFileDialog::setFilter函数将所有过滤器和权限应用于它所查看的每个文件目录,问题是目录和可执行程序(几乎)是相互的独家,我无法弄清楚Ubuntu要实现的正确组合&#34;任何目录,或仅那些可以作为程序执行的文件&#34;。< / p>

我还尝试了AllDirsDirsExecutableAllEntries等的大多数排列,所以我不会这么认为&#39 ; s就像一个缺失的财产一样简单。

我尝试过的其他一些排列:

dialog.setFilter(QDir::AllDirs | QDir::Executable | QDir::Files); // 1 
dialog.setFilter(QDir::AllDirs | QDir::Executable | QDir::Files |  
    QDir::Readable);                                              // 2
dialog.setFilter(QDir::AllDirs | QDir::Executable | QDir::Files |   
    QDir::Readable | QDir::Writeable);                            // 3

结果:

  1. 一切都被过滤掉了
  2. 一切都被过滤掉了
  3. 没有过滤掉任何东西
  4. 关于PyQt的a related question,从未得到回答,而且我也不确定该问题的OP是否希望目录可见。

2 个答案:

答案 0 :(得分: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

另请参阅QFileDialog: is it possible to filter only executables (under Linux)?

答案 1 :(得分:-2)

我使用QDir。 适用于linux,这是一个例子:

QDir dir = QDir("Path");
QStringList data = dir.entryList(QDir::Executeable | QDir::Files | QDir::NoDotAndDotDot);
// This line should return a QStringList with names of files in 
//your specified directory. It will get every executeable that is a file

如果它没有得到你想要的东西,只需删除QDir :: Executeable

我已经编写了一个基于QDir的搜索算法(递归)的备份程序,并且从未在linux或windows中出现问题。也许它对你有用。

只需放入您想要查看的路径,并包含,然后;)

度过愉快的一天