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