头像

张小飞

我有一壶酒,足以慰风尘

《QFileDialog中的一些实现技巧》

 2周前  •   Qt源码那点事儿  •   , , , , ,  •   55  •   4

简述

最近看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的实现嘛,都这么多年了…

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

 

 

上一篇:
下一篇:

 评论


 已有4条评论

  1. rekols 还差那么一点 Linux | 谷歌浏览器 70.0.3538.77 2周前

    大佬好棒。

    • 张小飞 真爱 Linux | 谷歌浏览器 70.0.3538.77 1周前

      rekols突然发现你的评论我收不到

      • rekols 还差那么一点 Linux | 谷歌浏览器 70.0.3538.77 1周前

        张小飞怎么会收不到。

        • 张小飞 真爱 Linux | 谷歌浏览器 70.0.3538.77 7天前

          rekols可能是workpress的bug吧