Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 设置QGraphicsLineItem动画时出现的问题_C++_Qt_Qt5 - Fatal编程技术网

C++ 设置QGraphicsLineItem动画时出现的问题

C++ 设置QGraphicsLineItem动画时出现的问题,c++,qt,qt5,C++,Qt,Qt5,我有下面的代码在QtCore 5.0中画一条线动画,所以它看起来像是由笔逐像素地画的 我的想法是使用一个计时器,将timeout()与一个调用QGraphicsLineItem::setLine()的插槽连接起来。下面是我如何画线并创建插槽move()以循环并逐渐画线: myLine.h 然而,当编译时,它只立即绘制一行。我想这就是问题的症结所在,但我无法准确地找出答案。因此,如果有人能给我一个提示,我真的很感激。您当前的问题是插槽实现。循环变量必须移动到MyLine类mySlot()调用时必须

我有下面的代码在QtCore 5.0中画一条线动画,所以它看起来像是由笔逐像素地画的

我的想法是使用一个计时器,将timeout()与一个调用QGraphicsLineItem::setLine()的插槽连接起来。下面是我如何画线并创建插槽move()以循环并逐渐画线: myLine.h


然而,当编译时,它只立即绘制一行。我想这就是问题的症结所在,但我无法准确地找出答案。因此,如果有人能给我一个提示,我真的很感激。

您当前的问题是插槽实现。循环变量必须移动到
MyLine
mySlot()
调用时必须迭代一次。也不需要一个行成员,
QGraphicsLineItem
已经完成了它。因此,最小的返工代码如下所示

#include <QApplication>
#include <QGraphicsLineItem>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QBasicTimer>

class MyLine : public QObject, public QGraphicsLineItem
{
    QBasicTimer m_timer;
    int m_i;
    void timerEvent(QTimerEvent * ev) {
        if (ev->timerId() == m_timer.timerId()) {
            setLine(0, 0, 50+m_i, 50+m_i);
            m_i ++;
        }
    }
public:
    MyLine() : m_i(0) {
        setPen(QPen(Qt::red, 8));
        m_timer.start(100, this);
    }
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QGraphicsScene scene;
    scene.addItem(new MyLine);
    QGraphicsView view(&scene);
    view.setRenderHint(QPainter::Antialiasing);
    view.setSceneRect(0, 0, 300, 300);
    view.show();
    return a.exec();
}
#包括
#包括
#包括
#包括
#包括
类MyLine:公共QObject、公共QGraphicsLineItem
{
基本定时器;
国际货币基金组织;
无效时间预览(QTimerEvent*ev){
如果(ev->timerId()==m_timer.timerId()){
设定线(0,0,50+m_i,50+m_i);
m_i++;
}
}
公众:
MyLine():m_i(0){
setPen(QPen(Qt::红色,8));
m_定时器启动(100,本);
}
};
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
QsCENE场景;
场景.附加项(新的MyLine);
QGraphicsView视图(和场景);
view.setRenderInt(QPaint::抗锯齿);
视图.设置(0,0,300,300);
view.show();
返回a.exec();
}
唉,你所做的并没有充分利用Qt带来的一切。动画框架将完全满足您的需要。下面是示例代码

#include <QApplication>
#include <QGraphicsObject>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QPropertyAnimation>

class MyLine : public QGraphicsObject
{
public:
    MyLine(QGraphicsItem *parent = 0) : QGraphicsObject(parent) {}
    QRectF boundingRect() const { return QRectF(-60,-60,120,120); }
    void paint(QPainter * p, const QStyleOptionGraphicsItem *, QWidget *) {
        p->setPen(QPen(Qt::black, 8));
        p->drawEllipse(QPointF(0, 0), 50, 50);
        p->setPen(QPen(Qt::red, 8));
        p->drawLine(0, 0, 0, 50);
    }
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QGraphicsScene scene;
    QGraphicsObject * line = new MyLine;
    scene.addItem(line);
    QPropertyAnimation anim(line, "rotation");
    anim.setStartValue(0);
    anim.setEndValue(360);
    anim.setDuration(1000);
    anim.setLoopCount(-1); // forever
    anim.start();
    QGraphicsView view(&scene);
    view.setRenderHint(QPainter::Antialiasing);
    view.setSceneRect(-60, -60, 120, 120);
    view.show();
    return a.exec();
}
#包括
#包括
#包括
#包括
#包括
类别MyLine:公共QGraphicsObject
{
公众:
MyLine(QGraphicsItem*parent=0):QGraphicsObject(parent){}
QRectF boundingRect()常量{return QRectF(-60,-60120120);}
无效油漆(QPainter*p、const QStyleOptionGraphicsItem*、QWidget*){
p->setPen(QPen(Qt::黑色,8));
p->paurellipse(QPointF(0,0),50,50);
p->setPen(QPen(Qt::红色,8));
p->drawLine(0,0,0,50);
}
};
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
QsCENE场景;
QGraphicsObject*line=新的MyLine;
场景.附加项(行);
QPropertyAnimation动画(线,“旋转”);
动画设置起始值(0);
动画设定值(360);
动画设定持续时间(1000);
anim.setLoopCount(-1);//永远
anim.start();
QGraphicsView视图(和场景);
view.setRenderInt(QPaint::抗锯齿);
视图.setscen直立(-60,-60120120);
view.show();
返回a.exec();
}
scene = new QGraphicsScene(this);
ui->graphicsView->setScene(scene);
ui->graphicsView->setSceneRect(0,0,700,700);
ui->graphicsView->setRenderHint(QPainter::Antialiasing);

myLine *line = new myLine();
scene->addItem(line);

timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), line, SLOT(mySlot()));
timer->start(100);
#include <QApplication>
#include <QGraphicsLineItem>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QBasicTimer>

class MyLine : public QObject, public QGraphicsLineItem
{
    QBasicTimer m_timer;
    int m_i;
    void timerEvent(QTimerEvent * ev) {
        if (ev->timerId() == m_timer.timerId()) {
            setLine(0, 0, 50+m_i, 50+m_i);
            m_i ++;
        }
    }
public:
    MyLine() : m_i(0) {
        setPen(QPen(Qt::red, 8));
        m_timer.start(100, this);
    }
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QGraphicsScene scene;
    scene.addItem(new MyLine);
    QGraphicsView view(&scene);
    view.setRenderHint(QPainter::Antialiasing);
    view.setSceneRect(0, 0, 300, 300);
    view.show();
    return a.exec();
}
#include <QApplication>
#include <QGraphicsObject>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QPropertyAnimation>

class MyLine : public QGraphicsObject
{
public:
    MyLine(QGraphicsItem *parent = 0) : QGraphicsObject(parent) {}
    QRectF boundingRect() const { return QRectF(-60,-60,120,120); }
    void paint(QPainter * p, const QStyleOptionGraphicsItem *, QWidget *) {
        p->setPen(QPen(Qt::black, 8));
        p->drawEllipse(QPointF(0, 0), 50, 50);
        p->setPen(QPen(Qt::red, 8));
        p->drawLine(0, 0, 0, 50);
    }
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QGraphicsScene scene;
    QGraphicsObject * line = new MyLine;
    scene.addItem(line);
    QPropertyAnimation anim(line, "rotation");
    anim.setStartValue(0);
    anim.setEndValue(360);
    anim.setDuration(1000);
    anim.setLoopCount(-1); // forever
    anim.start();
    QGraphicsView view(&scene);
    view.setRenderHint(QPainter::Antialiasing);
    view.setSceneRect(-60, -60, 120, 120);
    view.show();
    return a.exec();
}