我想创建一个类似汽车仪表板的Qt界面(仪表,刻度盘,旋钮等)。 我的设备有一个800x480 LCD,由imx287 ARM SoC(没有硬件浮动或GPU的armv5te)供电。
我遇到的问题很慢。 以20fps绘制的单个仪表(背景PNG图像,带有旋转PNG刻度盘图像)使用~20%的CPU时间。 添加单个渲染文本字符串会增加CPU使用率达到40%。
我正在使用QGraphicsScene,我使用了很多浮点计算......这是一个问题,因为我的SoC没有硬件浮动能力。
对QGraphicsScene有什么替代方案对我有用吗?
这就是我目前正在做的事情:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
bg.load("rpm.png");
needle.load("needle.png");
scene = new QGraphicsScene(this);
scene->setSceneRect(0,0, 800,480);
scene->addPixmap(bg);
needleItem = scene->addPixmap(needle);
needleItem->setPos(400-4,17);
textItem = scene->addText(tr(""), QFont("utsaah", 50, QFont::Bold, true));
textItem->setDefaultTextColor(QColor(255,255,255));
textItem->setPos(430, 360);
ui->graphicsView->setScene(scene);
thread = new UpdateDialsThread(this);
connect(thread, SIGNAL(updateDials()), this, SLOT(updateDials()));
thread->start();
}
void MainWindow::updateDials(void)
{
static int deg = 180;
deg += 1;
if (deg > 180+270)
deg = 180;
QTransform trans;
trans.translate(needleItem->boundingRect().width()/2, needleItem->boundingRect().height());
trans.rotate(deg, Qt::ZAxis);
trans.translate(-needleItem->boundingRect().width()/2, -needleItem->boundingRect().height());
needleItem->setTransform(trans);
textItem->setPlainText(tr("%1").arg(deg*10, 4, 'f', 0));
}
提前致谢!
答案 0 :(得分:1)
我建议使用QML而不是QGraphicsView。您可以使用引人注目的动画创建自定义仪表,并获得良好的性能。您还可以拥有弹簧和阻尼效果。您可以查看Dial Control Example。
答案 1 :(得分:0)
我最终搬到了Allegro 4。
它更适合这项任务。更轻,并支持定点数学。