• 13465阅读
  • 13回复

qt4中如何做到图片的自动播放功能? [复制链接]

上一主题 下一主题
离线ch19860304
 
只看楼主 倒序阅读 楼主  发表于: 2009-06-04
我想实现的功能是:读取在一个文件夹中的所有图片,并每隔2s显示下一张图片。我是用sleep(2)来实现的。但程序运行后,点击“自动播放按钮”,就死在那不动了。qt4不能用sleep函数吗?还是哪出啥问题了?如果不能的话,那应该用什么函数?

/*类的声明*/
class Imagewindow :public QMainWindow
{
    Q_OBJECT
    public:
        Imagewindow() ;
    public slots:
        void autoplay();
    private:
        void createActions() ;
        void createToolBars();
        QStringList imageList ;
        int index ;
        QDir imageDir ;
        QToolBar *operToolBar;
        QAction *autoplayAct;
        QScrollArea *scrollArea ;
        Imageviewer *image;
};


/*类的定义*/
Imagewindow::Imagewindow()
{
/*自已定义的专门用来显示图片的窗口的类,它改写了paintEvent 函数,这个类我测过,没问题的*/
    image = new Imageviewer;    
    scrollArea = new QScrollArea ;
    scrollArea -> setWidget(image);
    setCentralWidget(scrollArea);
    createActions();
    createToolBars();
    imageDir.setPath("/mnt/hgfs/share_file/qt_image") ;
    QStringList filter ;
    filter << "*.jpg" << "*.bmp" << "*.jpeg" << "*.png" << "*.xpm" ;
    imageList = imageDir.entryList(filter, QDir::Files |QDir::NoSymLinks,QDir::Name) ;
    image->setPixmap(imageDir.absolutePath() + QDir::separator()+ imageList.at(0)) ;    
    index = 0 ;    
}

void Imagewindow::autoplay()   //自动播放功能
{
    while(1)
    {
        if(index < imageList.size()-1 )
        {
         image->setPixmap(imageDir.absolutePath() +QDir::separator()+ imageList.at(index)) ;
        index ++ ;
        }
        else
            index = 0;
        sleep(2) ;   //问题所在
    }
}

void Imagewindow::createActions()
{
    autoplayAct = new QAction(QIcon("./images/apply.png"),tr("Autoplay"),this) ;
    connect(autoplayAct,SIGNAL(triggered()),this,SLOT(autoplay())) ;
}

void Imagewindow::createToolBars()
{
    operToolBar = addToolBar(tr("operation"));
    operToolBar -> addAction(autoplayAct) ; //自动播放按钮
}


int main(int argc, char *argv[])
    {    
        QApplication app(argc, argv);        
        
        Imagewindow *pWidget = new Imagewindow;
        pWidget->resize(300, 300);
        pWidget->show();
        
        return app.exec();
    }
离线haulm

只看该作者 1楼 发表于: 2009-06-04
最好不要用sleep,用qtime
离线yang_huafeng

只看该作者 2楼 发表于: 2009-06-04
你在while中不停的sleep当然会死在那了
QT使用中...
离线duduqq

只看该作者 3楼 发表于: 2009-06-04
或者用qWait()
离线ch19860304
只看该作者 4楼 发表于: 2009-06-04
好像没有qwait这个类吧?我用了qtime类,但还是没办法做到:每隔2s显示下一张图片,直至循环显示完。我打印了信息看。打印信息没错呀,index能循环累加,能调用image的setPixmap函数(此函数调用了update()),但没办法引起paintEvent函数的调用。
将autoplay()函数改为:

void Imagewindow::autoplay()
{
    unsigned long i ;
    unsigned long j ;
    QTime t;
     t.start();  
    
    while(1)
    {
        if(t.elapsed() % 5000 == 0)
        {
            qDebug("\nready to show picture!index=%d\n",index);  //这个打印信息没错,能循环累加
            if(index < imageList.size()-1 )
            {
                index ++ ;
                  image->setPixmap(imageDir.absolutePath()+QDir::separator()+ imageList.at(index)) ;
                update();
            }
            else
            {
                index = 0;
                image->setPixmap(imageDir.absolutePath() +"/"+ imageList.at(0)) ;
                update();
            }
        
        }
    }
}
离线蛮蛮
只看该作者 5楼 发表于: 2009-06-04
这个问题貌似不是很难,我想问一个问题:sleep函数是怎样一个原理?
蛮蛮工作室
离线jaypei

只看该作者 6楼 发表于: 2009-06-05
用QTimer即可,如果用Sleep要在主线程以外用,不然就阻塞界面
离线shiroki

只看该作者 7楼 发表于: 2009-06-05
嘿嘿, 我前两天写的例子又有用武之地了
http://www.cuteqt.com/blog/?p=276
--
shiro is White
ki is tree
http://www.cuteqt.com
论坛 http://www.cuteqt.com/bbs
博客 http://www.cuteqt.com/blog
博客镜像: http://sites.cuteqt.com/cuteqt
Linux/Qt/嵌入式讨论群 http://qun.qq.com/air/5699823
离线318065268
只看该作者 8楼 发表于: 2009-06-05
整体的思路有问题。
我认为,应该使用QTimer类。QTimer类一般的用法是初始化时间为2秒,2秒到了自动发射信号。将这个信号连接到图片显示槽函数上。
同时设定一个全局的变量,指示当前显示到了第几个图片。
每到2秒就执行一次图片显示函数,但是加载的是不一样的图片,这样看起来就是2秒一张的显示,用循环的方法不好!
Email  rsail@126.com(私人邮箱)
QQ:   318065268
离线318065268
只看该作者 9楼 发表于: 2009-06-05
整体的思路有问题。
我认为,应该使用QTimer类。QTimer类一般的用法是初始化时间为2秒,2秒到了自动发射信号。将这个信号连接到图片显示槽函数上。
同时设定一个全局的变量,指示当前显示到了第几个图片。
每到2秒就执行一次图片显示函数,但是加载的是不一样的图片,这样看起来就是2秒一张的显示,用循环的方法不好!
Email  rsail@126.com(私人邮箱)
QQ:   318065268
离线haulm

只看该作者 10楼 发表于: 2009-06-05
支持 shiroki 版主
离线ch19860304
只看该作者 11楼 发表于: 2009-06-06
我听了你们的建议,问题解决了。但我有个疑问:为什么不能用循环?我用循环的时候,程序已经调得可以跑了,但就是有个bug,就是文件夹的所有图片只能循环显示一遍,第二遍就不行了。这是什么原因呢?
离线fmli1

只看该作者 12楼 发表于: 2009-12-14
“Imageviewer *image;”   中的“Imageviewer” 使用正确?
快乐每一天!
离线xinqingfly

只看该作者 13楼 发表于: 2009-12-15
主进程中不要随便用while(1),最好就是用定时器,或者自己创建线程
菜鸟也是鸟
快速回复
限100 字节
 
上一个 下一个