• 9415阅读
  • 17回复

qt循环显示的问题!急!急急急急急! [复制链接]

上一主题 下一主题
离线dier1983813
 

只看楼主 倒序阅读 楼主  发表于: 2009-02-13
— 本帖被 XChinux 执行加亮操作(2009-02-16) —
我接触qt一个多月,我在linux下写了qt程序用for循环显示图片,出现了框,但是什么图片也没有,不用for就能显示一个图,我知道可以用qtmier来循环,但是我对qtimer类不熟,而且qtimer要求用信号激发编译的槽,我也编的槽有问题不行,我对自己写槽也不熟啊,但是现在这个程序又要的急,我搞了好久都不行,哪个大侠能不能把我这个程序改一下,使它能循环显示图片,如果能有时间间隔的循环显示就更好了,感激不尽,现在真的要的急,不然我也不会这么急了,程序如下:
#include<qapplication.h>
#include<qwidget.h>
#include<qpainter.h>
#include<qpixmap.h>
#include<qtimer.h>
#include<unistd.h>
#include<stdio.h>
#include<wait.h>
class MyMainWindow:public QWidget
{
public:
    MyMainWindow();
private:
    void paintEvent(QPaintEvent*);
    int i;
};

MyMainWindow::MyMainWindow()
{
    resize(350,320);
}

void MyMainWindow::paintEvent(QPaintEvent*)
{
  for(i=1;i<100;i++)
    {
    QPixmap image("i.bmp");

    QPainter paint;
    paint.begin(this);
    paint.drawPixmap(51,53,image);
    paint.end();
    sleep(3.5);
  }

}

int main(int argc,char **argv)
{

    QApplication a(argc,argv);
    QTimer::singleShot( 10*1000, &a, SLOT(quit()) );
    MyMainWindow w;
    a.setMainWidget(&w);
    w.show();
    sleep(5);
    return a.exec();
}
离线fangjuntan

只看该作者 1楼 发表于: 2009-02-13
  for(i=1;i<100;i++)
    {
    QPixmap image("i.bmp");//不能是i啊!!!!!!!!!!!!!!!!!!!!!!

    QPainter paint;
    paint.begin(this);
    paint.drawPixmap(51,53,image);
    paint.end();
    sleep(3.5);
  }


上段改成这样试一下;
  for(i=1;i<100;i++)
    {
    QString str = QString("%1.bmp").arg(i);
    QPixmap images(str);

    QPainter paint;
    paint.begin(this);
    paint.drawPixmap(51,53,image);
    paint.end();
    sleep(3.5);
  }
离线fangjuntan

只看该作者 2楼 发表于: 2009-02-13
如果正确了,回复一下。问题提出来一起讨论。
离线dier1983813

只看该作者 3楼 发表于: 2009-02-16
好的,我马上去做一下,看看怎么样!谢谢了!
离线mumutouv

只看该作者 4楼 发表于: 2009-02-16
这样应该也不行,你必须要让app还处理一下gui线程,qapp->processEvents()
离线dier1983813

只看该作者 5楼 发表于: 2009-02-16
      我把程序改了一下,可以循环,但是,当循环完了它会再次循环而且再次循环比上一次循环少显示最后一个图,停在倒数第二个图,而不是停在最后一个图上面
    比如:有1,2,3三张图要依次显示,先是等几秒后依次显示了三个图,但等几秒后又依次显示1,2两个图,最后停在图2上,10秒后关闭。如果是显示两个图就是第一次循环后等几秒后显示图1,最后停在图1上,10秒后关闭。对这个问题,我还找不到原因。
  mumutouv 说的处理线程,我不是很熟,能否详细讲解一下。
改过后的程序如下:
#include<qapplication.h>
#include<qwidget.h>
#include<qpainter.h>
#include<qpixmap.h>
#include<qtimer.h>
#include<unistd.h>
#include<stdio.h>
#include<wait.h>
class MyMainWindow:public QWidget
{
public:
    MyMainWindow();
private:
    void paintEvent(QPaintEvent*);
    int i;
};

MyMainWindow::MyMainWindow()
{
    resize(350,320);
}

void MyMainWindow::paintEvent(QPaintEvent*)
{
 
}  for(i=1;i<100;i++)
    {
    QString str = QString("%1.bmp").arg(i);
    QPixmap image(str);

    QPainter paint;
    paint.begin(this);
    paint.drawPixmap(51,53,image);
    paint.end();
    sleep(3.5);
  }

int main(int argc,char **argv)
{

    QApplication a(argc,argv);
    QTimer::singleShot( 10*1000, &a, SLOT(quit()) );
    MyMainWindow w;
    a.setMainWidget(&w);
    w.show();
    sleep(5);
    return a.exec();
}
离线dier1983813

只看该作者 6楼 发表于: 2009-02-16
      还有就是依次显示每张图片时之间的时间间隔用什么函数来处理比较好呢,各位有没什么好的建议!sleep函数的精准度比较差,linux下好像只能以秒记,不能达到毫秒级,我希望1秒显示25帧!
                                          谢谢!
离线weizhy
只看该作者 7楼 发表于: 2009-02-16
你使用paintEvent函数来实现这个功能是不合适的,因为这个函数被qt自动调用,而不是只调用一次,因此会出现你说的又循环一次的问题

有两种方法比较好:

1.  使用 void QObject::timerEvent ( QTimerEvent * event ) 实现
使用startTimer()启动定时器(定时器保存为一个int变量),使用 killTimer()关闭定时器.

2.  使用 QTimer::timeout() 信号和自定义槽
离线mumutouv

只看该作者 8楼 发表于: 2009-02-17
support weizhy
离线dier1983813

只看该作者 9楼 发表于: 2009-02-17
  weizhy ,你好:
        我先前也分别写了一个QTimer的程序和 QTimerEvent 的程序,但自己对这个类掌握的不熟也没找到好资料,写得不好,总是出问题,所以我就改为用paintEvent用for循环,你能不能给我写一个你说的上面两个方法的小程序,我理解一下!
                                                                      谢谢!
离线weizhy
只看该作者 10楼 发表于: 2009-02-17
here it is:
描述:图片定时切换
附件: test3.zip (1287 K) 下载次数:44
离线dier1983813

只看该作者 11楼 发表于: 2009-02-17
谢谢!我回去把这个程序好好消化一下再来讨论
离线dier1983813

只看该作者 12楼 发表于: 2009-02-18
    你使用designer写的吧,我make不出来啊,总是有错,我在看你的那些源码,我把我的程序改了下,加了qtimer了,可以控制图片的间隔显示时间,但是重复循环的问题还是没解决,这次的重复循环是不停的重复,和先前的程序只重复一次又不同,先前使把几张图一次显示完了,再从新依次显示一次,而现在是不停的重复依次显示那几个图片,等会我把程序贴上来,大家帮我找找问题在哪
[ 此贴被dier1983813在2009-02-18 15:54重新编辑 ]
离线dier1983813

只看该作者 13楼 发表于: 2009-02-18
程序如下(还是用的QPaintEvent,我对其他画图的类不熟,有那位大侠帮我改一下,使不再重复依次显示,只把几张图依次显示就完了,不要重复的依次显示):
#ifndef FOREVER_H
#define FOREVER_H

#include <qwidget.h>


const int numColors = 120;


class Forever : public QWidget
{
    Q_OBJECT
public:
    Forever( QWidget *parent=0, const char *name=0 );
protected:
    void        paintEvent( QPaintEvent * );
    void        timerEvent( QTimerEvent * );
private slots:
    void        updateCaption();
private:
    int        i;
    int        rectangles;
    QColor      colors[numColors];
};


#endif                                                                  //头文件
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <qtimer.h>
#include <qpainter.h>
#include <qapplication.h>
#include <stdlib.h>                            // defines rand() function
#include <qpixmap.h>
#include "forever.h"


//
// Forever - a widget that draws rectangles forever.
//

//
// Constructs a Forever widget.
//

Forever::Forever( QWidget *parent, const char *name )
    : QWidget( parent, name )
{
 
    rectangles = 0;
    startTimer(1000);          // run continuous timer  ,时间间隔
    QTimer * counter = new QTimer( this );
    connect( counter, SIGNAL(timeout()),
            this, SLOT(updateCaption()) );
    counter->start( 1000 );
}


void Forever::updateCaption()
{
    QString s;
    s.sprintf( "Qt Example - Forever - %d rectangles/second", rectangles );  //同上
    rectangles = 0;
    setCaption( s );
}


//
// Handles paint events for the Forever widget.
//

void Forever::paintEvent( QPaintEvent * )    //开始画图
{

 
    QString str = QString("%1.bmp").arg(i);
    QPixmap image(str);

    QPainter paint;
    paint.begin(this);
    paint.drawPixmap(51,53,image);
    paint.end();
 
 
}

//
// Handles timer events for the Forever widget.
//

void Forever::timerEvent( QTimerEvent * )
{
    for ( i=1; i<4; i++ ) {
        repaint( TRUE );        // repaint ,擦拭后重画,这里就使依次显示了,但不知怎么
                                    // 会不停的重复依次显示,
        rectangles++;
    }
}


//
// Create and display Forever widget.
//

int main( int argc, char **argv )
{
    QApplication a( argc, argv );              // create application object
    QTimer::singleShot( 10*1000, &a, SLOT(quit()) );    //10秒后关闭
    Forever always;                            // create widget
    a.setMainWidget( &always );                // set as main widget
    always.setCaption("Qt Example - Forever");
    always.show();                              // show widget
    a.exec();                            // run event loop
}
离线weizhy
只看该作者 14楼 发表于: 2009-02-18
我现在有些明白了
你是想显示一个动画吧
如果是这样,你就用 QTimeLine + QGraphicsItemAnimation
例子就是 qtdemo 的启动和菜单动画,看看源代码就行

我现在对你想处理的问题和想实现的功能感觉非常混乱,
要让别人帮你,你首先得把自己面临的问题说清除
离线dier1983813

只看该作者 15楼 发表于: 2009-02-19
     
谢谢你的提醒, 也可以这么说的,但是它是一张一张的图片(从监视器上抓下来的),就和放电影一样,要把这些图片依次显示完,但是要求一秒显示25张图片,图片有很多,但是这个程序显示完了后,它会再次把图片从头显示,一直不停的从头把图片显示一遍后再次显示一遍,一遍一遍的不停重复
离线浪漫天使
只看该作者 16楼 发表于: 2009-02-22
离线dier1983813

只看该作者 17楼 发表于: 2009-02-23
谢谢浪漫天使!我回去把你给的程序看一下!,现在我在把程序进行编译以便放到arm的板子上运行时出了个小问题,希望各位帮忙一下!还是以上次的程序说明一下这个新出的问题
在使用电脑上的g++链接make时没有错误,但我需要把程序载到板子上运行,我就把makefile里的链接改为arm-linux-g++,路径没问题,但是这次make时就出现了:“make****[forever.o] 浮点数例外”的问题,始终编译通不过,而且我cpp文件和头文件里都没有浮点型的数啊,都是整型的,程序如下:

#ifndef FOREVER_H
#define FOREVER_H

#include <qwidget.h>


const int numColors = 120;


class Forever : public QWidget
{
    Q_OBJECT
public:
    Forever( QWidget *parent=0, const char *name=0 );
protected:
    void        paintEvent( QPaintEvent * );
    void        timerEvent( QTimerEvent * );
private slots:
    void        updateCaption();
private:
    int        i;
    int        rectangles;
    QColor      colors[numColors];
};


#endif                                                                  //头文件
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <qtimer.h>
#include <qpainter.h>
#include <qapplication.h>
#include <stdlib.h>                            // defines rand() function
#include <qpixmap.h>
#include "forever.h"


//
// Forever - a widget that draws rectangles forever.
//

//
// Constructs a Forever widget.
//

Forever::Forever( QWidget *parent, const char *name )
    : QWidget( parent, name )
{
  
    rectangles = 0;
    startTimer(1000);          // run continuous timer  ,时间间隔
    QTimer * counter = new QTimer( this );
    connect( counter, SIGNAL(timeout()),
            this, SLOT(updateCaption()) );
    counter->start( 1000 );
}


void Forever::updateCaption()
{
    QString s;
    s.sprintf( "Qt Example - Forever - %d rectangles/second", rectangles );  //同上
    rectangles = 0;
    setCaption( s );
}


//
// Handles paint events for the Forever widget.
//

void Forever::paintEvent( QPaintEvent * )    //开始画图
{

  
    QString str = QString("%1.bmp").arg(i);
    QPixmap image(str);

    QPainter paint;
    paint.begin(this);
    paint.drawPixmap(51,53,image);
    paint.end();
  
  
}

//
// Handles timer events for the Forever widget.
//

void Forever::timerEvent( QTimerEvent * )
{
    for ( i=1; i<4; i++ ) {
        repaint( TRUE );        // repaint ,擦拭后重画,这里就使依次显示了,但不知怎么
                                    // 会不停的重复依次显示,
        rectangles++;
    }
}


//
// Create and display Forever widget.
//

int main( int argc, char **argv )
{
    QApplication a( argc, argv );              // create application object
    QTimer::singleShot( 10*1000, &a, SLOT(quit()) );    //10秒后关闭
    Forever always;                            // create widget
    a.setMainWidget( &always );                // set as main widget
    always.setCaption("Qt Example - Forever");
    always.show();                              // show widget
    a.exec();                            // run event loop
}
快速回复
限100 字节
 
上一个 下一个