如何解决QML 对象不会在显示时更新
我用 C++ 创建了一个 QML 对象。在我的主要方法中,我可以设置我在自定义 QML 对象中定义的各种属性。从 main 方法设置时,各种属性会按预期显示。当我从我的更新方法中设置属性时,显示永远不会更新。我已经验证我的自定义 QML 对象中的关联方法正在接收我传递给它的值。为什么我的显示不会更新?
main.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();
}
horizontalBargraph.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;
}
horizontalBargraph.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
main.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 举报,一经查实,本站将立刻删除。