我编写了一个小代码来使用 QtCreator 测试 QGraphicsView 功能。
代码很简单,只是创建了一个继承自 QGraphicsView 的类,上面有一个 QGraphicsScene。用大量缩放到 100x100 的 QGraphicsPixmapItem(在本例中为 2000)填充场景并将它们随机放置到场景中。
然后在自定义类中并使用 QTimer 移动场景的所有元素。
(添加了第二个 QTimer 以查看每秒调用第一个 QTimer 的次数)。
它适用于几百个元素,但如果元素数量增加,性能会下降。
有人可以给我一个关于如何提高性能的提示吗?也许使用 QList 访问元素很慢......或者为这个简单的动画使用 QTimer 是一个非常糟糕的主意......或者必须在某处添加一些优化标志......也许忘记 QGraphicsView 并尝试QtQuick 和 QML ...
最终的应用程序应该在屏幕上绘制大量图像,并使用 png 图像作为源对其中的一些进行动画处理。
test.pro
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = test
TEMPLATE = app
SOURCES += main.cpp \
c_view.cpp
HEADERS += \
c_view.h
FORMS +=
RESOURCES += \
res.qrc
C_View.h
#ifndef C_VIEW_H
#define C_VIEW_H
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsPixmapItem>
#include <QTimer>
class C_View : public QGraphicsView
{
Q_OBJECT
public:
C_View();
QGraphicsScene *scene;
QGraphicsTextItem *label_fps;
QTimer timer;
QTimer timer_fps;
int interval=0;
int fps=0;
private slots:
void random_move();
void show_fps();
};
#endif // C_VIEW_H
C_View.cpp
#include "c_view.h"
C_View::C_View()
{
this->scene = new QGraphicsScene();
this->setScene(this->scene);
// Label to see how many times per seconds the random_move function gets called
this->label_fps=new QGraphicsTextItem();
this->label_fps->setDefaultTextColor(Qt::black);
this->label_fps->setFont(QFont("times",16));
this->label_fps->setPos(10,10);
this->scene->addItem(this->label_fps);
// Qtimer to enter random_move function
connect(&this->timer,SIGNAL(timeout()),this,SLOT(random_move()));
//this->interval=10; // 100 FPS?
this->interval=25; // 40 FPS?
//this->interval=50; // 20 FPS?
//this->interval=100; // 10 FPS?
this->timer.setInterval(this->interval);
this->timer.start();
// QTimer to update the FPS label
connect(&this->timer_fps,SIGNAL(timeout()),this,SLOT(show_fps()));
this->timer_fps.setInterval(1000); // Once a second
this->timer_fps.start();
}
// Funcion that moves a bit all the items of the scene
void C_View::random_move()
{
QList <QGraphicsItem*> l = this->items();
int ini=0;
for(int i=ini;i<l.size();i++)
{
l[i]->setPos(l[i]->x()+(rand()%3)-1,l[i]->y()+(rand()%3)-1);
}
this->fps++;
}
// Just show how many times random_move function gets call, since last time
void C_View::show_fps()
{
this->label_fps->setPlainText("FPS "+QString::number(this->fps));
this->label_fps->setZValue(1);
this->fps=0;
}
主文件
#include <QApplication>
#include "c_view.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
C_View *view = new C_View();
// Fill the QGraphicsView with lots of images
for(int i=0;i<2000;i++)
{
QGraphicsPixmapItem *item=new QGraphicsPixmapItem();
item->setPixmap(QPixmap(":/images/p.png").scaled(100,100));
item->setPos(rand()%view->width(),rand()%view->height());
view->scene->addItem(item);
}
view->show();
return a.exec();
}