• 4523阅读
  • 5回复

[提问]关于Qt实现的一个问题 [复制链接]

上一主题 下一主题
离线dhiker
 

只看楼主 倒序阅读 楼主  发表于: 2015-06-21
如下需求:
缓存一个文件夹下的所有文件信息(文件路径),待程序再次打开后,读取文件夹的信息,发现改动,比如删除/增加/改名 一个文件,或者删除/增加/改名一个子文件夹

现在想到用QSettings来做,只是实现起来又觉得很麻烦,不知各位有什么好的其他想法

离线stlcours

只看该作者 1楼 发表于: 2015-06-22
和QSettings没关系吧,而且也不麻烦,递归记录所有文件信息,保存在某个地方。下次启动,再次递归读取,然后与上次记录的信息比较。
离线z55716368

只看该作者 2楼 发表于: 2015-06-22
感觉用一个QList储存,像2楼说的那样就可以了
每一个问题 都是一次进步
离线dhiker

只看该作者 3楼 发表于: 2015-06-25
回 stlcours 的帖子
stlcours:和QSettings没关系吧,而且也不麻烦,递归记录所有文件信息,保存在某个地方。下次启动,再次递归读取,然后与上次记录的信息比较。 (2015-06-22 15:24) 

其实我是想保存一个文件夹里面全部大图片的缩略图,现在这个递归保存的问题解决了,
但是生成图片的时候总是比源文件夹中的图片个数少一些,
缩小图片的时候出现QImage::Scaled:Image is a null image

请问该怎么处理
离线stlcours

只看该作者 4楼 发表于: 2015-06-25
回 dhiker 的帖子
dhiker:其实我是想保存一个文件夹里面全部大图片的缩略图,现在这个递归保存的问题解决了,
但是生成图片的时候总是比源文件夹中的图片个数少一些,
缩小图片的时候出现QImage::Scaled:Image is a null image
....... (2015-06-25 10:48) 

如果你直接操作windows缓存文件,那么少一些是必然的,办法。。。。。可以使用winapi更新缓存,然后再。。。。

如果不是直接操作缓存,那图片少就是你自己的问题。你代码一个字都不贴,我也没办法帮你。
离线dhiker

只看该作者 5楼 发表于: 2015-06-26
回 stlcours 的帖子
stlcours:
如果你直接操作windows缓存文件,那么少一些是必然的,办法。。。。。可以使用winapi更新缓存,然后再。。。。
如果不是直接操作缓存,那图片少就是你自己的问题。你代码一个字都不贴,我也没办法帮你。

没有操作缓存文件,我是自己弄一个文件夹,然后把原来图片文件的缩略图放在这个文件夹里面,生成缩略图用的后台线程。。

这个是线程的run函数
void Thread::run()
{
      smallImg = bigImg.scaled(IMG_H*4,IMG_W*4).
                scaled(IMG_H,IMG_W,Qt::IgnoreAspectRatio,
                       Qt::SmoothTransformation);
     smallImg.save(savePath);

}


缓存的时候这样
void ImgCache::createCache(QString target,QString source)
{
    QDir targetDir(target);
    if(!targetDir.exists())
        targetDir.mkpath(target);


    QDir sourceDir(source);

    QStringList filter;
    filter<<"*"<<"*.png"<<"*.jpg"<<"*.jpeg"<<"*.ico"<<"*.bmp";
    QFileInfoList list =
            sourceDir.entryInfoList(filter,
                                    QDir::Dirs|QDir::Files|
                                    QDir::NoDotAndDotDot,
                                    QDir::DirsFirst|QDir::Name);

    foreach(QFileInfo info,list)
    {
        if(info.isFile())
        {
            QString savePath = target+"/"+info.fileName();

            QImage img(info.filePath());
            if(!img.isNull())
            {
//                QImage small = img.scaled(IMG_H*4,IMG_W*4).scaled(IMG_H,IMG_W,Qt::IgnoreAspectRatio,
//                                               Qt::SmoothTransformation);
//                small.save(savePath);
                Thread *thread = new Thread(img,savePath);
                QObject::connect(thread,Thread::finished,
                                 this,ImgCahce::deleteThread);
                
                thread->start();
            }
        }

        if(info.isDir())
        {
            QString sourceSuffix =
                    info.filePath().remove(sourceRoot);

            QString targetdir = targetRoot+sourceSuffix;

            createCache(targetdir,info.filePath());
        }
    }
}


大概就这样,我用线程就不行,有缺失,报QImage::Scaled:image is a null image的错
但是用注释掉的那部分代码就不会有错,而且也没有缺失文件的现象。

快速回复
限100 字节
 
上一个 下一个