QFileDialog中的tips

简述

最近看QFileDialog的实现比较多,也对比了几家操作系统厂商跟Qt的QFileDialog中的实现,也自己造了个小轮子。也学到了一些东西,特意来分享下。

正则表达式

可以将类型诸如这种的格式

WPS文字 文件(*.wps)  提取成这种 *.wps

本来打算自己写正则表达式的,生怕自己写的效率比较低,就从QFileDialog的源码中扣取出来了。

//from QFileDialog
const char *qt_file_dialog_filter_reg_exp =
"^(.*)\\(([a-zA-Z0-9_.*? +;#\\-\\[\\]@\\{\\}/!<>\\$%&=^~:\\|]*)\\)$";
QStringList qt_clean_filter_list(const QString &filter)
{
    QRegExp regexp(QString::fromLatin1(qt_file_dialog_filter_reg_exp));
    QString f = filter;
    int i = regexp.indexIn(f);
    if (i >= 0)
        f = regexp.cap(2);
    return f.split(QLatin1Char(' '), QString::SkipEmptyParts);
}

QFileInfo的新奇使用方法

实际上我又遇到了一个源码中关于QFileInfo一个原来没有用过的用法。

直接将

*.wps 

这种字符当做QString放进了QFileInfo来获取其basename(文件名)跟 suffix(后缀),或者使用其它的函数。一般我都是传个文件路径的,没想到还能用这种方法解析字符串。

//这时候可以用QFileInfo把一些复杂的字符串的什么前缀,后缀名全都解析出来了,包括*.tar.gz这种复杂的,QFileInfo都有函数来提取
QFileInfo fileInfo(QString("*.wps"));

我本来想自己解析这个字符串的,发现QFileDialog的源码中还有这种用法,真的很神奇。

文件管理器的吐槽

最近看了看KDE的dolphin文件管理器代码的实现,还有深度的文件管理器的实现,还有一些乱七八糟第三方的,还有Qt自带的QFileDialog。就属KDE的dolphin做的最厉害,交互最好,优化的最好。

深度的文件管理器跟Qt自带QFileDialog遇到复杂的网络文件以及延迟都会卡死,也没有任何交互。QFileDialog我理解这个东西一开始就不是给网络文件用的,卡死我还是可以接受的,但是深度作为操作系统厂商做成这样就有点不太合适了。大概扫了下源码,也跟QFileDialog一样重写了model,model这里交互还是得好好优化下啊。这就是自己造轮子的坏处。

从一个开发的角度,简单的吐槽一下,反正给他们官方反馈了。因为deepin的文件管理器的bug实在太多了=。=。

嗯,KDE大法好!话说,一开始的设计可以从借鉴(copy)KDE的实现嘛,都这么多年了…

造轮子不要对自己太自信…实时上我自己造的小轮子也有这个问题=。=。

小结

这是我前年的时候看各个厂商以及调研QFileDialog总结出来一点小结论。去年年底我又把这部分捡起来了。现在已经优化到加载千万级别的数据,界面不会卡住的地步了。有时间把这部分东西写出来


文章作者: 张小飞
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC-ND 4.0 许可协议。转载请注明来源 张小飞 !
 上一篇
error: 'this' cannot be implicitly captured in this context error: 'this' cannot be implicitly captured in this context
讲真,使用Qt反射 + 元对象 + C++11 的特性,写c++代码简直不要太爽,代码优雅的不是一丁半点。 今天使用lambda表达式的时候,发现报了个编译错误 error: 'this' cannot be implicitly capt
2020-06-26 张小飞
下一篇 
Linux更换difftool为meld Linux更换difftool为meld
meld#设置默认的git diff的比较工具 #配置比较工具.可以用git difftool 调用. git config --global diff.tool meld git config --global difftool.prom
2020-06-26 张小飞
  目录