は、私は今の例を実装するいくつかの問題を抱えています。 、そして、
ColorZones::ColorZones(QObject *parent) : _zonesColor{QColor("orange"),QColor("grey"),QColor("grey"),QColor("grey"),QColor("grey"),QColor("grey")}
{
}
void ColorZones::setZoneColor(const int zone,const QColor color)
{
ROS_INFO("The color was set");
_zonesColor[zone] = color;
emit zoneColorChanged();//_zonesColor);
}
メインアプリケーションのコンストラクタで、私は、コードのこれらの行をしました:
class ColorZones : public QObject
{
Q_OBJECT
Q_PROPERTY(QList<QVariant> ColorZones READ getZoneColor NOTIFY zoneColorChanged)
public:
explicit ColorZones(QObject *parent = nullptr);
QList<QVariant> getZoneColor() const {return _zonesColor;}
void setZoneColor(const int zone, const QColor color);
signals:
void zoneColorChanged();//QList<QVariant>);
private:
QList<QVariant> _zonesColor;
};
そしてここでは、コンストラクタとsetZoneColor関数の実装です:ここに私のクラス定義はあります:
import QtQuick 2.0
import QtQuick.Controls 1.4
Rectangle{
id: zones
width : 600; height : 600
color : "transparent"
border.color: "black"
border.width: 2
radius: 10
objectName : "h_zones"
visible : true
Canvas {
id:canvas
anchors.fill: parent
onPaint:{
var ctx = canvas.getContext('2d');
ctx.lineWidth = 2
ctx.strokeStyle = "black"
//ZONE 0
ctx.fillStyle = ColorZones.getZoneColor[1]
ctx.beginPath()
ctx.moveTo(310,301)
ctx.arcTo(10,1,600,600,65,50)
ctx.closePath()
ctx.stroke()
ctx.fill()
ctx.moveTo(310,181)
ctx.lineTo(310,301)
ctx.fill()
ctx.stroke()
//ZONE 1
ctx.fillStyle = ColorZones.getZoneColor[1]
ctx.beginPath()
ctx.moveTo(304,304)
ctx.lineTo(297,272)
ctx.lineTo(189,164)
ctx.lineTo(164,189)
ctx.lineTo(272,297)
ctx.closePath()
ctx.fill()
ctx.stroke
//ZONE 2
ctx.fillStyle = "orange"
ctx.beginPath()
ctx.moveTo(181,310)
ctx.lineTo(301,310)
ctx.closePath()
ctx.beginPath()
ctx.moveTo(301,310)
ctx.lineTo(274,292)
ctx.lineTo(121,292)
ctx.lineTo(121,328)
ctx.lineTo(274,328)
ctx.closePath();
ctx.fill()
ctx.stroke
//ZONE 3
ctx.fillStyle = "blue"
ctx.beginPath()
ctx.moveTo(310,319)
ctx.lineTo(328,346)
ctx.lineTo(328,499)
ctx.lineTo(292,499)
ctx.lineTo(292,346)
ctx.closePath()
ctx.fill()
ctx.stroke
//ZONE 4
ctx.fillStyle = "blue"
ctx.beginPath()
ctx.moveTo(439,310)
ctx.lineTo(319,310)
ctx.closePath()
ctx.beginPath()
ctx.moveTo(319,310)
ctx.lineTo(346,292)
ctx.lineTo(499,292)
ctx.lineTo(499,328)
ctx.lineTo(346,328)
ctx.closePath()
ctx.fill()
ctx.stroke
//ZONE 5
ctx.fillStyle = "green"
ctx.beginPath()
ctx.moveTo(316,304)
ctx.lineTo(323,272)
ctx.lineTo(431,164)
ctx.lineTo(456,189)
ctx.lineTo(348,297)
ctx.closePath()
ctx.fill()
ctx.stroke
}
}
Connections {
target: ColorZones //property
onZoneColorChanged: canvas.requestPaint()
}
:
ColorZones *color_zones = new ColorZones;
this->rootContext()->setContextProperty("ColorZones", color_zones);
this->load(QUrl(QStringLiteral("qrc:/window1.qml")));
そして、ここでは.qmlファイルです
しかし、二つのことが動作していません。
1)私はsetZoneColorを呼び出すと、信号がQMLアプリケーション(したがって、それはキャンバスを再描画されません) 2)はTypeErrorによって受信されることはありません:プロパティを読み取ることができません。 「1」の
未定義
私は何が起こっているのかを把握することはできませんか?
あなたは代わりに 'Rectangle'を使用して2つの四角形を描画します。 'color'プロパティを変更して色を変更します。あなたはC++コードからこれをやりたくはありません。 QMLで作成したオブジェクトをC++コードから変更する必要はありません。 – derM
これを参照してください:http://doc.qt.io/qt-5/qml-qtquick-context2d.html – eyllanesc
@derM:これは選択肢ではありません。私はGUIとのインターフェイスを取っているので、C++の色を変更する必要がありますROSと(特有のメッセージを受け取ったときに色を変更する必要があります)。キャンバスオブジェクトを使用する必要があります。私が描きたい図形は、単純な四角形よりも複雑です。 – Getter