我试图在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>
我还尝试了AllDirs
,Dirs
,Executable
,AllEntries
等的大多数排列,所以我不会这么认为&#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
结果:
关于PyQt的a related question,从未得到回答,而且我也不确定该问题的OP是否希望目录可见。
答案 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)上都经过测试的可执行文件和文件夹
另请参阅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中出现问题。也许它对你有用。
只需放入您想要查看的路径,并包含,然后;)
度过愉快的一天