私の問題を示すために、クラスの非常に簡単な(そして部分的な)説明をしています。基本的に、2 つのプロパティをセットアップしました。
class Fruit : public QObject
{
Q_OBJECT
....
public:
Q_PROPERTY( int price READ getPrice NOTIFY priceChanged)
Q_PROPERTY(Fruit * fruit READ fruit WRITE setFruit NOTIFY fruitChanged)
}
私のQMLでは、priceプロパティにアクセスするとうまく機能します。fruitしかし、明らかに返されるプロパティにアクセスしてFruitからそのプロパティを使用しようとすると、うまくいきpriceません。これはこのように機能するはずではありませんか?
Text {
id: myText
anchors.centerIn: parent
text: basket.price // shows correctly
//text: basket.fruit.price // doesn't show
}
2番目のものはFruitどちらもプロパティであり、プロパティを持っていpriceますが、そのプロパティにアクセスしていないようです? これは機能するはずですか?
更新しました
ソースコードを含めています。で新しいデモを作成しましたがHardwareComponent、この方法の方が理にかなっています。受け取った回答に基づいて機能させようとしましたが、うまくいきませんでした。
HardwareComponentclass は と の基本クラスComputerですCPU。
main.cpp
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
class HardwareComponent : public QObject
{
Q_OBJECT
public:
HardwareComponent() : m_price(0) {}
virtual int price() = 0;
virtual Q_INVOKABLE void add(HardwareComponent * item) { m_CPU = item; }
HardwareComponent * getCPU() const { return m_CPU; }
Q_SLOT virtual void setPrice(int arg)
{
if (m_price == arg) return;
m_price = arg;
emit priceChanged(arg);
}
Q_SIGNAL void priceChanged(int arg);
protected:
Q_PROPERTY(HardwareComponent * cpu READ getCPU);
Q_PROPERTY(int price READ price WRITE setPrice NOTIFY priceChanged)
HardwareComponent * m_CPU;
int m_price;
};
class Computer : public HardwareComponent
{
Q_OBJECT
public:
Computer() { m_price = 500; }
int price() { return m_price; }
void setprice(int arg) { m_price = arg; }
};
class CPU : public HardwareComponent
{
Q_OBJECT
public:
CPU() { m_price = 100; }
int price() { return m_price; }
void setprice(int arg) { m_price = arg; }
};
int main(int argc, char *argv[])
{
HardwareComponent * computer = new Computer;
CPU * cpu = new CPU;
computer->add( cpu );
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
engine.rootContext()->setContextProperty("computer", computer);
return app.exec();
}
#include "main.moc"
main.qml
import QtQuick 2.3
import QtQuick.Window 2.2
Window {
visible: true
width: 360
height: 360
Text {
anchors.centerIn: parent
text: computer.price // works
//text: computer.cpu.price // doesn't work, doesn't show any value
}
}
これは、すべてのプロジェクト ファイルの完全なソース コードです。
実行すると、次の出力が得られます。
C:\Users\User\Documents\My Qt Projects\build-hardware-Desktop_Qt_5_4_0_MSVC2010_OpenGL_32bit-Debug\debug\hardware.exe を起動しています... QML デバッグが有効になっています。安全な環境でのみ使用してください。qrc:/MainForm.ui.qml:20: ReferenceError: コンピューターが定義されていません
20 行目 (computer.price) で警告が表示されますが、それでも機能し、コンピュータの価格 (=500) が表示されます。変更するcomputer.cpu.priceと、同じ警告が報告されますが、価格が表示されなくなります - 機能していないようです。
問題は、価格が仮想プロパティであるため、機能することです! しかし、このプロパティをコンピュータ コンポーネント内の別のハードウェア コンポーネントで使用すると、機能しません! Mido によって投稿されたコード/回答は、これに対する解決策があることを願っています。かなり近いようです! 私はこれがうまくいくことを願っています。
