gpt4 book ai didi

c++ - 从 C++ 更改 QML 对象值

转载 作者:行者123 更新时间:2023-11-30 02:18:49 25 4
gpt4 key购买 nike

我创建了一个 QML 类,如下所示

import QtQuick 2.2
import QtQuick.Controls 1.4
import QtQuick.Controls.Styles 1.4
import QtQuick.Extras 1.4

Rectangle {
width: 80
height: 200
property double myVal: 15

Timer {
running: true
repeat: true
interval: 1
onTriggered: gauge.value = myVal
}

Gauge {
objectName: "gauge"
id: gauge
anchors.fill: parent
anchors.margins: 10

value: myVal
Behavior on value {
NumberAnimation {
duration: 1000
}
}

style: GaugeStyle {
valueBar: Rectangle {
implicitWidth: 16
color: Qt.rgba(gauge.value / gauge.maximumValue, 0, 1 - gauge.value / gauge.maximumValue, 1)
}
}
}
}

我想更改我的 C++ 文件中的值。为此,我创建了一个名为 setDataToGauge() 的方法,该方法类似于

void MainWindow::setDataToGauge(double newVal){

QQmlApplicationEngine engine;
QQmlComponent component(&engine, QUrl::fromLocalFile("gauge.qml"));
QObject object = component.create();
QObject *myGauge = object->findChild<QObject*>("gauge");

if(myGauge){
myGauge->setProperty("value",newVal);
qDebug() << myGauge->property("value");

}

}

这个。但是,它不会改变 gauge 的值。我尝试了不同的方法,但找不到解决方案。当我掉落时

    Behavior on value {
NumberAnimation {
duration: 1000
}
}

这部分来自 QML 文件的值正在改变,但仪表的 View 没有改变。另外,我正在添加到我的 c++ 文件的完整代码中

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QDateTime>
#include <QtQuickWidgets/QQuickWidget>
#include <QtQml>
#include <QObject>

QObject *object;

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow),
m_serial(new QSerialPort(this))
{
ui->setupUi(this);

ui->gaugeWidget->setSource(QUrl::fromLocalFile("gauge.qml"));
ui->gaugeWidget->setUpdatesEnabled(true);

QQmlApplicationEngine engine;
QQmlComponent component(&engine, QUrl::fromLocalFile("gauge.qml"));
object = component.create();

setDataToGauge(60.0);
}

MainWindow::~MainWindow()
{
delete ui;
}

void MainWindow::setDataToGauge(double newVal){

QObject *myGauge = object->findChild<QObject*>("gauge");

if(myGauge){
QQmlProperty::write(myGauge, "value", newVal);
qDebug() << myGauge->property("value");
}

那里有什么问题?

最佳答案

在您尝试解决方案时,您正在创建另一个仪表,并且该仪表未显示,因为 QQmlApplicationEngine 是一个局部变量,在它完成执行时将被删除,此外 QQmlApplicationEngine 需要一个 WindowApplicationWindow,而不是像 Rectangle 这样的 Item

另一方面,建议使用 qresource 来存储 .qml,否则每次编译可执行文件时都必须复制它们。

也不建议从 C++ 访问 QML 对象,最好使用 setContextProperty() 将 C++ 对象导出到 QML。

一个简单的解决方案是创建一个信号,信号通过Connections::

连接

*.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
void setDataToGauge(double newVal);
signals:
void dataGaugeChanged(double dataToGauge); // signal
private:
Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

*.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QQmlEngine>
#include <QQmlContext>


MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->gaugeWidget->engine()->rootContext()->setContextProperty("MainWindow", this);
ui->gaugeWidget->setSource(QUrl("qrc:/gauge.qml"));
}

MainWindow::~MainWindow()
{
delete ui;
}

void MainWindow::setDataToGauge(double newVal){
emit dataGaugeChanged(newVal);
}

gauge.qml

import QtQuick 2.2
import QtQuick.Controls 1.4
import QtQuick.Controls.Styles 1.4
import QtQuick.Extras 1.4

Rectangle {
width: 80
height: 200

Gauge {
id: gauge
anchors.fill: parent
anchors.margins: 10

Behavior on value {
NumberAnimation {
duration: 1000
}
}

style: GaugeStyle {
valueBar: Rectangle {
implicitWidth: 16
color: Qt.rgba(gauge.value / gauge.maximumValue, 0, 1 - gauge.value / gauge.maximumValue, 1)
}
}
}
Connections{
target: MainWindow
onDataGaugeChanged: gauge.value = dataToGauge
}
}

另一种选择是创建一个 Q_PROPERTY 并进行绑定(bind):

*.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
Q_OBJECT
Q_PROPERTY(double dataGauge READ dataGauge WRITE setDataGauge NOTIFY dataGaugeChanged)

public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();

double dataGauge() const;
void setDataGauge(double dataGauge);
signals:
void dataGaugeChanged();
private:
Ui::MainWindow *ui;
double mDataGauge;
};

#endif // MAINWINDOW_H

*.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QQmlEngine>
#include <QQmlContext>

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->gaugeWidget->engine()->rootContext()->setContextProperty("MainWindow", this);
ui->gaugeWidget->setSource(QUrl("qrc:/gauge.qml"));
}

MainWindow::~MainWindow()
{
delete ui;
}

double MainWindow::dataGauge() const
{
return mDataGauge;
}

void MainWindow::setDataGauge(double dataGauge)
{
if(mDataGauge == dataGauge)
return;
mDataGauge = dataGauge;
emit dataGaugeChanged();
}

*.qml

import QtQuick 2.2
import QtQuick.Controls 1.4
import QtQuick.Controls.Styles 1.4
import QtQuick.Extras 1.4

Rectangle {
width: 80
height: 200

Gauge {
id: gauge
anchors.fill: parent
anchors.margins: 10
value: MainWindow.dataGauge // binding

Behavior on value {
NumberAnimation {
duration: 1000
}
}

style: GaugeStyle {
valueBar: Rectangle {
implicitWidth: 16
color: Qt.rgba(gauge.value / gauge.maximumValue, 0, 1 - gauge.value / gauge.maximumValue, 1)
}
}
}
}

<支持>两种解决方案都可以在以下 link 中找到.

关于c++ - 从 C++ 更改 QML 对象值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51824477/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com