微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

QML 对象不会在显示时更新

如何解决QML 对象不会在显示时更新

我用 C++ 创建了一个 QML 对象。在我的主要方法中,我可以设置我在自定义 QML 对象中定义的各种属性。从 main 方法设置时,各种属性会按预期显示。当我从我的更新方法中设置属性时,显示永远不会更新。我已经验证我的自定义 QML 对象中的关联方法正在接收我传递给它的值。为什么我的显示不会更新?

ma​​in.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include "horizontalBargraph.h"
#include "speedometer.h"
#include "test.h"
#include <QTimer>
#include <QDebug>

//QObject *item = NULL;
static HorizontalBargraph *ptrOilTemp = nullptr;
static int value = 0;


int update()
{
    //qInfo() << "update() called.";


    if(value > ptrOilTemp->getMaxValue())
    {
        value = 0;
    }
    ptrOilTemp->setActualValue(value);
    qInfo() << "value = " << value;

    value++;

    //ptrOilTemp->setUnits("Test");

    return 0;
}

int main(int argc,char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    QGuiApplication app(argc,argv);

    qmlRegisterType<Speedometer>("com.ulasdikme.speedometer",1,"Speedometer");
    qmlRegisterType<HorizontalBargraph>("com.kubie.horizontalBargraph","HorizontalBargraph");
    qmlRegisterType<Test>("com.kubie.test","Test");

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    if (engine.rootObjects().isEmpty())
        return -1;

    //item = engine.rootObjects().at(0)->findChild<QQuickItem*>("testing");

    QObject *object = engine.rootObjects()[0];
    QObject *oilTemp = object->findChild<QObject*>("oilTemp");
    QObject *oilPressure = object->findChild<QObject*>("oilPressure");
    QObject *coolantTemp = object->findChild<QObject*>("coolantTemp");
    QObject *coolantPressure = object->findChild<QObject*>("coolantPressure");
    QObject *intakeAirTemp = object->findChild<QObject*>("intakeAirTemp");
    QObject *engineRPM = object->findChild<QObject*>("engineRPM");

    //HorizontalBargraph *ptrOilTemp = qobject_cast<HorizontalBargraph*>(oilTemp);
    ptrOilTemp = qobject_cast<HorizontalBargraph*>(oilTemp);
    HorizontalBargraph *ptrOilPressure = qobject_cast<HorizontalBargraph*>(oilPressure);
    HorizontalBargraph *ptrCoolantTemp = qobject_cast<HorizontalBargraph*>(coolantTemp);
    HorizontalBargraph *ptrCoolantPressure = qobject_cast<HorizontalBargraph*>(coolantPressure);
    HorizontalBargraph *ptrIntakeAirTemp = qobject_cast<HorizontalBargraph*>(intakeAirTemp);
    HorizontalBargraph *ptrEngineRPM = qobject_cast<HorizontalBargraph*>(engineRPM);

    qreal val1 = 0;
    //qreal val2 = 25;
    qreal val3 = 100;

    QString degF(QChar(0x00b0));
    degF += "F";

    ptrOilTemp->setSensorName("Oil Temp");
    ptrOilTemp->setUnits(degF);
    ptrOilTemp->setMinValue(val1);
    ptrOilTemp->setMaxValue(val3);
    //ptrOilTemp->setActualValue(val2);

    ptrOilPressure->setSensorName("Oil Press");
    ptrOilPressure->setUnits("PSI");

    ptrCoolantTemp->setSensorName("Coolant Temp");
    ptrCoolantTemp->setUnits(degF);

    ptrCoolantPressure->setSensorName("Coolant Press");
    ptrCoolantPressure->setUnits("PSI");

    ptrIntakeAirTemp->setSensorName("Intake Air Temp");
    ptrIntakeAirTemp->setUnits(degF);

    ptrEngineRPM->setSensorName("");
    ptrEngineRPM->setUnits("RPM");

    qInfo() << "Initializing timer.";
    QTimer timer;// = new QTimer(this);
    QObject::connect(&timer,&QTimer::timeout,update);
    timer.start(100);



    return app.exec();
}

horizo​​ntalBargraph.cpp

#include <QPainter>
#include "horizontalBargraph.h"

HorizontalBargraph::HorizontalBargraph(QQuickItem *parent)
    :QQuickPaintedItem(parent),_horizontalBargraphWidth(260),_horizontalBargraphHeight(75),_minValue(0),_maxValue(0),_actualValue(0),_sensorName("Sensor Name"),_units("Units")
{

}

void HorizontalBargraph::paint(QPainter *painter)
{
    QRectF rect = this->boundingRect();
    painter->setRenderHint(QPainter::Antialiasing);
    QPen pen = painter->pen();
    pen.setCapStyle(Qt::FlatCap);

    QFont bottomFont("Arial",14,QFont::Bold);
    QFont topFont("Arial",16,QFont::Bold);
    QColor gray1(225,225,225);
    QColor gray2(200,200,200);
    QColor gray3(175,175,175);
    QColor gray4(100,100,100);

    //minValue,actualValue,maxValue
    painter->save();
    painter->setFont(bottomFont);
    pen.setColor(gray1);
    painter->setPen(pen);
    painter->drawText(rect.adjusted(0,50,-210,0),Qt::AlignHCenter | Qt::AlignBottom,QString::number((_minValue),'f',0)); //Draws minValue
    painter->drawText(rect.adjusted(210,QString::number((_maxValue),0)); //Draws maxValue
    painter->drawText(rect.adjusted(0,QString::number((_actualValue),1));
    //pen.setStyle(Qt::DotLine); //Next 3 lines were used to show the bounding rectangle for a drawText object
    //painter->setPen(pen);
    //painter->drawRect(rect.adjusted(0,-150,0));
    painter->restore();

    //Bar chart background
    painter->save();
    painter->fillRect(rect.adjusted(25,35,-25,-25),gray1);
    painter->restore();

    //Lo
    painter->save();
    painter->fillRect(rect.adjusted(25,-185,gray2);
    painter->restore();

    //LoLo
    painter->save();
    painter->fillRect(rect.adjusted(25,gray3);
    painter->restore();

    //Hi
    painter->save();
    painter->fillRect(rect.adjusted(185,gray2);
    painter->restore();

    //HiHi
    painter->save();
    painter->fillRect(rect.adjusted(210,gray3);
    painter->restore();

    //Sensor name,Units
    painter->save();
    painter->setFont(topFont);
    pen.setColor(gray1);
    painter->setPen(pen);
    painter->drawText(rect.adjusted(25,-50,-40),Qt::AlignLeft | Qt::AlignTop,_sensorName); //Draws sensor name
    painter->drawText(rect.adjusted(50,Qt::AlignRight | Qt::AlignTop,_units); //Draws units
    painter->restore();

    //Arrow
//    painter->save();
//    static const QPointF points[3] = {
//        QPointF(17.5,27.5),//        QPointF(32.5,//        QPointF(25.0,42.5)
//    };
//    painter->drawpolygon(points,3);
//    painter->restore();
    painter->save();
    QPainterPath path;
    qreal x = scale(_actualValue,_minValue,_maxValue,25,235);
    //path.moveto(17.5,27.5);
    //path.lineto(32.5,27.5);
    //path.lineto(25.0,42.5);
    path.moveto(x - 7.5,27.5);
    path.lineto(x + 7.5,27.5);
    path.lineto(x,42.5);
    path.closeSubpath();
    painter->fillPath(path,gray4);
    painter->restore();


}


qreal HorizontalBargraph::getHorizontalBargraphWidth()
{
    return _horizontalBargraphWidth;
}


qreal HorizontalBargraph::getHorizontalBargraphHeight()
{
    return _horizontalBargraphHeight;
}


qreal HorizontalBargraph::getMinValue()
{
    return _minValue;
}


qreal HorizontalBargraph::getMaxValue()
{
    return _maxValue;
}


qreal HorizontalBargraph::getActualValue()
{
    return _actualValue;
}


QString HorizontalBargraph::getSensorName()
{
    return _sensorName;
}


QString HorizontalBargraph::getUnits()
{
    return _units;
}


void HorizontalBargraph::setHorizontalBargraphWidth(qreal width)
{
    if(_horizontalBargraphWidth == width)
        return;

    _horizontalBargraphWidth = width;

    emit widthChanged();
}


void HorizontalBargraph::setHorizontalBargraphHeight(qreal height)
{
    if(_horizontalBargraphHeight == height)
        return;

    _horizontalBargraphHeight = height;

    emit heightChanged();
}


void HorizontalBargraph::setMinValue(qreal minValue)
{
    if(_minValue == minValue)
        return;

    _minValue = minValue;

    emit minValueChanged();
}


void HorizontalBargraph::setMaxValue(qreal maxValue)
{
    if(_maxValue == maxValue)
        return;

    _maxValue = maxValue;

    emit maxValueChanged();
}


void HorizontalBargraph::setActualValue(qreal actualValue)
{
    if(_actualValue == actualValue)
        return;

    _actualValue = actualValue;

    emit actualValueChanged();
}


void HorizontalBargraph::setSensorName(QString sensorName)
{
    if(_sensorName == sensorName)
        return;

    _sensorName = sensorName;

    emit sensorNameChanged();
}


void HorizontalBargraph::setUnits(QString units)
{
    if(_units == units)
        return;

    _units = units;

    emit unitsChanged();
}


qreal HorizontalBargraph::scale(qreal input,qreal inputMin,qreal inputMax,qreal outputMin,qreal outputMax)
{
    qreal output = (outputMax - outputMin) * (input - inputMin) / (inputMax - inputMin) + outputMin;
    if(output > outputMax)
        output = outputMax;

    if(output < outputMin)
        output = outputMin;

    return output;
}

horizo​​ntalBargraph.h

#ifndef HORIZONTALBArgraph_H
#define HORIZONTALBArgraph_H

#include <QObject>
#include <QQuickPaintedItem>

class HorizontalBargraph : public QQuickPaintedItem
{
    Q_OBJECT

    Q_PROPERTY(qreal horizontalBargraphWidth READ getHorizontalBargraphWidth WRITE setHorizontalBargraphWidth NOTIFY horizontalBargraphWidthChanged)
    Q_PROPERTY(qreal horizontalBargraphHeight READ getHorizontalBargraphHeight WRITE setHorizontalBargraphHeight NOTIFY horizontalBargraphHeightChanged)
    Q_PROPERTY(qreal minValue READ getMinValue WRITE setMinValue NOTIFY minValueChanged)
    Q_PROPERTY(qreal maxValue READ getMaxValue WRITE setMaxValue NOTIFY maxValueChanged)
    Q_PROPERTY(qreal actualValue READ getActualValue WRITE setActualValue NOTIFY actualValueChanged)
    Q_PROPERTY(QString sensorName READ getSensorName WRITE setSensorName NOTIFY sensorNameChanged)
    Q_PROPERTY(QString units READ getUnits WRITE setUnits NOTIFY unitsChanged)


public:
    HorizontalBargraph(QQuickItem *parent = 0);
    virtual void paint(QPainter *painter);

    qreal   getHorizontalBargraphWidth();
    qreal   getHorizontalBargraphHeight();
    qreal   getMinValue();
    qreal   getMaxValue();
    qreal   getActualValue();
    QString getSensorName();
    QString getUnits();

    void    setHorizontalBargraphWidth(qreal width);
    void    setHorizontalBargraphHeight(qreal height);
    void    setMinValue(qreal minValue);
    void    setMaxValue(qreal maxValue);
    void    setActualValue(qreal actualValue);
    void    setSensorName(QString sensorName);
    void    setUnits(QString units);

signals:
    void    horizontalBargraphWidthChanged();
    void    horizontalBargraphHeightChanged();
    void    minValueChanged();
    void    maxValueChanged();
    void    actualValueChanged();
    void    sensorNameChanged();
    void    unitsChanged();

private:
    qreal   _horizontalBargraphWidth;
    qreal   _horizontalBargraphHeight;
    qreal   _minValue;
    qreal   _maxValue;
    qreal   _actualValue;
    QString _sensorName;
    QString _units;
    qreal   scale(qreal input,qreal outputMax);

};

#endif // HORIZONTALBArgraph_H

ma​​in.qml

import QtQuick 2.11
import QtQuick.Window 2.11
import com.kubie.horizontalBargraph 1.0

Window {
    id: window
    visible: true
    width: 800
    height: 480
    title: qsTr("RednEKSLdhlR")
    color: "black"

//    Rectangle
//    {
//        width: 260
//        height: 75
//        color: "#7a0505"
//        anchors.bottom: parent.bottom
//        anchors.bottomMargin: 0
//        anchors.left: parent.left
//        anchors.leftMargin: 0
//    }

    HorizontalBargraph {
        objectName: "oilTemp"
        anchors.left: parent.left
        anchors.leftMargin: 0
        anchors.bottom: parent.bottom
        anchors.bottomMargin: 0
        width: horizontalBargraphWidth
        height: horizontalBargraphHeight
    }

    HorizontalBargraph {
        objectName: "oilPressure"
        anchors.left: parent.left
        anchors.leftMargin: 0
        anchors.bottom: parent.bottom
        anchors.bottomMargin: 75
        width: horizontalBargraphWidth
        height: horizontalBargraphHeight
    }

    HorizontalBargraph {
        objectName: "coolantTemp"
        anchors.right: parent.right
        anchors.rightMargin: 0
        anchors.bottom: parent.bottom
        anchors.bottomMargin: 0
        width: horizontalBargraphWidth
        height: horizontalBargraphHeight
    }

    HorizontalBargraph {
        objectName: "coolantPressure"
        anchors.right: parent.right
        anchors.rightMargin: 0
        anchors.bottom: parent.bottom
        anchors.bottomMargin: 75
        width: horizontalBargraphWidth
        height: horizontalBargraphHeight
    }

    HorizontalBargraph {
        objectName: "intakeAirTemp"
        anchors.left: parent.left
        anchors.leftMargin: parent.width / 2 - width / 2;
        anchors.bottom: parent.bottom
        anchors.bottomMargin: 0
        width: horizontalBargraphWidth
        height: horizontalBargraphHeight
    }

        HorizontalBargraph {
            objectName: "engineRPM"
            anchors.left: parent.left
            anchors.leftMargin: parent.width / 2 - width / 2;
            anchors.bottom: parent.bottom
            anchors.bottomMargin: 75
            width: horizontalBargraphWidth
            height: horizontalBargraphHeight
    }


}

解决方法

您必须使用 update() 方法来重新绘制 GUI,因此每次修改用于绘制的属性时都必须调用它。举例:

void HorizontalBarGraph::setActualValue(qreal actualValue) {     
    if(_actualValue == actualValue)         
        return;      
    _actualValue = actualValue;     
    update();  
    emit actualValueChanged(); 
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?