Nested class in Qt5
-
@mrjj Hi
I've been tried to implement your recommendation and also with setters/getters but at time that I want to pass the brightValue from the function void brightness::brightnessText(const QString &in) into the function void rgbLed::rgbRecive(const QString &in) unfortunately the variable b takes a random value inside the method rgbRecive:
This is the following code:
class rgbLed; class brightness : public QObject { Q_OBJECT public: explicit brightness(QObject *parent = 0); friend rgbLed; void setBrightValue(int newbrightValueMember) { brightValueMember = newbrightValueMember; }; int getBrightValue() { return brightValueMember; } bool flag = 0; int brightValueMember; public slots: void brightnessText(const QString& in); }; class rgbLed : public QObject { Q_OBJECT Q_PROPERTY(int bright READ brigfht WRITE setBright NOTIFY brightChanged) public: explicit rgbLed(QObject *parent = nullptr); brightness obj; int regresion_red(int red); int regresion_green(int green); int regresion_blue(int blue); Q_INVOKABLE int bright(); Q_INVOKABLE int setBright(int x); Q_INVOKABLE void add(rgbLed *x); int r; int g; int b; int r2; int g2; int b2; int brightValue; int myBrightness; QStringList list; QString my_in; int red = 0; int green = 0; int blue = 0; int pos = 0 ; bool flag = 0; int x; signals: void brightChanged(int x); public slots: void rgbRecive(const QString &in); };
and in my .cpp:
void brightness::brightnessText(const QString &in) { QString Bright = in; int brightValue; brightValue = Bright.toInt(&flag); setBrightValue(brightValue); qDebug() << "bright: " << brightValue; }
void rgbLed::rgbRecive(const QString &in) { qDebug() << "ColorPicked:" << in; QStringList listNew = in.split(","); QStringList a_list = listNew[0].split("("); QStringList b_list = listNew[2].split(")"); int b = obj.getBrightValue(); qDebug() << "Value: " << b; }
Could anyone see why b is taken a random value?
@Juancinho_cardecan Where do you call brightness::brightnessText?
Do you call it on rgbLed::obj or maybe on another brightness instance? -
@Juancinho_cardecan Where do you call brightness::brightnessText?
Do you call it on rgbLed::obj or maybe on another brightness instance?@jsulm I called here after your words but the value doesn't change:
void rgbLed::rgbRecive(const QString &in)
{
qDebug() << "ColorPicked:" << in;QStringList listNew = in.split(","); QStringList a_list = listNew[0].split("("); QStringList b_list = listNew[2].split(")"); obj.brightnessText(in); int b = obj.getBrightValue(); qDebug() << "Value: " << b;
}
-
@jsulm I called here after your words but the value doesn't change:
void rgbLed::rgbRecive(const QString &in)
{
qDebug() << "ColorPicked:" << in;QStringList listNew = in.split(","); QStringList a_list = listNew[0].split("("); QStringList b_list = listNew[2].split(")"); obj.brightnessText(in); int b = obj.getBrightValue(); qDebug() << "Value: " << b;
}
@Juancinho_cardecan Called where? And did you call it on rgbLed::obj?
-
@Juancinho_cardecan Called where? And did you call it on rgbLed::obj?
This post is deleted! -
@Juancinho_cardecan Called where? And did you call it on rgbLed::obj?
@jsulm No I din't call it on rgbLed::obj, I called it inside the function void rgbLed::rgbRecive
-
Hi
So herevoid rgbLed::rgbRecive(const QString &in) { obj.brightnessText(in); int b = obj.getBrightValue();
b is not what you expect ?
-
Hi
So herevoid rgbLed::rgbRecive(const QString &in) { obj.brightnessText(in); int b = obj.getBrightValue();
b is not what you expect ?
@mrjj yes it's not what I'm expecting, it might be changing all the time but the value is zero always.
-
@mrjj yes it's not what I'm expecting, it might be changing all the time but the value is zero always.
@Juancinho_cardecan
I would checkbrightValue = Bright.toInt(&flag);
(in void brightness::brightnessText(const QString &in))
and see if flag is false as that mean text to Int failed. -
@Juancinho_cardecan
I would checkbrightValue = Bright.toInt(&flag);
(in void brightness::brightnessText(const QString &in))
and see if flag is false as that mean text to Int failed.@mrjj the flag is true and the value of brightValue is passing correctly, then the text to Int didn't failed, i dont know what is happening because if the values from QML are passing correctly, I'm calling in the wrong way the function brightnessText inside:
cpp file:
void rgbLed::rgbRecive(const QString &in) { my_brightness.brightnessText(in); int b = my_brightness.getBrightValue(); qDebug() << "Value: " << b; } void brightness::brightnessText(const QString &in) { QString Bright = in; int brightValue; brightValue = Bright.toInt(&flag); qDebug() << "brightValue: " << brightValue; qDebug() << "flag: " << flag; setBrightValue(brightValue); qDebug() << "bright: " << brightValue; }
main.cpp:
int main(int argc, char *argv[]) { QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); QGuiApplication app(argc, argv); QQmlApplicationEngine engine; engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); if (engine.rootObjects().isEmpty()) return -1; //Root Object to find Items in QML QObject* root = engine.rootObjects()[0]; assert(root != nullptr); // The QML Item to which we want to inject our QML-Item-loaded-from-file QQuickItem* colorSelector = qobject_cast<QQuickItem*>(root->findChild<QObject*>("colorSelector")); assert(colorSelector != nullptr); // Load the QML file to a component QString qml_path = "ColorSelector.qml"; QQmlComponent comp(&engine, QUrl::fromLocalFile(qml_path)); QScopedPointer<rgbLed> slider (new rgbLed); engine.rootContext()->setContextProperty("slider", slider.data()); QObject *topLevel = engine.rootObjects().value(0); QQuickWindow *window = qobject_cast<QQuickWindow *>(topLevel); // Create an instance of the component rgbLed my_rgbLed;//Creation an Object instance brightness my_brightness; //Code to conecct a signal with the slot QObject::connect(colorSelector, SIGNAL(colorChanged(QString)), &my_rgbLed, SLOT(rgbRecive(QString))); // connect our QML signal to our C++ slot QObject::connect(window, SIGNAL(submitTextField(QString)), &my_brightness, SLOT(brightnessText(QString))); return app.exec(); }
header file:
class rgbLed; class brightness : public QObject { Q_OBJECT public: explicit brightness(QObject *parent = 0); friend rgbLed; void setBrightValue(int newbrightValueMember) { brightValueMember = newbrightValueMember; }; int getBrightValue() { return brightValueMember; } bool flag = 0; int brightValueMember; public slots: void brightnessText(const QString& in); }; class rgbLed : public QObject { Q_OBJECT Q_PROPERTY(int bright READ brigfht WRITE setBright NOTIFY brightChanged) public: explicit rgbLed(QObject *parent = nullptr); brightness my_brightness; int regresion_red(int red); int regresion_green(int green); int regresion_blue(int blue); Q_INVOKABLE int bright(); Q_INVOKABLE int setBright(int x); Q_INVOKABLE void add(rgbLed *x); int r; int g; int b; int r2; int g2; int b2; int brightValue; int myBrightness; QStringList list; QString my_in; int red = 0; int green = 0; int blue = 0; int pos = 0 ; bool flag = 0; int x; signals: void brightChanged(int x); public slots: void rgbRecive(const QString &in); }
-
Hi
I think you have 2 instances of brightness called my_brightnessvoid rgbLed::rgbRecive(const QString &in)
{
my_brightness.brightnessText(in); <<< is the SAME my_brightness as you have in main.cpp?
int b = my_brightness.getBrightValue();
qDebug() << "Value: " << b;
}so
rgbLed my_rgbLed;//Creation an Object instance
brightness my_brightness;how does the my_brightness from outside come into
void rgbLed::rgbRecive(const QString &in) ?
It seems it has its own ?
So one is being updated but other is not ?In the original code, it was called
class rgbLed : public QObject { Q_OBJECT Q_PROPERTY(int bright READ brigfht WRITE setBright NOTIFY brightChanged) public: explicit rgbLed(QObject *parent = nullptr); brightness obj; <<< the old internal name of the instance
So it works from QML
as you do
// connect our QML signal to our C++ slot
QObject::connect(window, SIGNAL(submitTextField(QString)), &my_brightness, SLOT(brightnessText(QString)));and that changes the one in Mian.cpp
but the rgbLed my_rgbLed; and its "obj" is not.I assume you want the brigness instance inside my_rgbLed to change ?
-
Hi
I think you have 2 instances of brightness called my_brightnessvoid rgbLed::rgbRecive(const QString &in)
{
my_brightness.brightnessText(in); <<< is the SAME my_brightness as you have in main.cpp?
int b = my_brightness.getBrightValue();
qDebug() << "Value: " << b;
}so
rgbLed my_rgbLed;//Creation an Object instance
brightness my_brightness;how does the my_brightness from outside come into
void rgbLed::rgbRecive(const QString &in) ?
It seems it has its own ?
So one is being updated but other is not ?In the original code, it was called
class rgbLed : public QObject { Q_OBJECT Q_PROPERTY(int bright READ brigfht WRITE setBright NOTIFY brightChanged) public: explicit rgbLed(QObject *parent = nullptr); brightness obj; <<< the old internal name of the instance
So it works from QML
as you do
// connect our QML signal to our C++ slot
QObject::connect(window, SIGNAL(submitTextField(QString)), &my_brightness, SLOT(brightnessText(QString)));and that changes the one in Mian.cpp
but the rgbLed my_rgbLed; and its "obj" is not.I assume you want the brigness instance inside my_rgbLed to change ?
@mrjj said in Nested class in Qt5:
I think you have 2 instances of brightness called my_brightness
I already tryied to explain that...
-
@Juancinho_cardecan
Assuming @jsulm & @mrjj are correct, each time you create abrightness
object anywhere why don't you set its https://doc.qt.io/qt-5/qobject.html#objectName-prop (setObjectName()
) to a unique string, then you can see whether one instance is different from another. Printing out&brightnessObjectInstance
may also tell you the same, I think. -
Hi
Could you try to add
brightness & rgbLed: :getBrightness() {
return obj; // or what you called it
}to
class rgbLed : public QObjectthen in main.cpp
QObject::connect(window, SIGNAL(submitTextField(QString)), my_rgbLed.getBrightness(), SLOT(brightnessText(QString)));
and remove all
brightness my_brightness;
as we dont want to use brightness alone ever, only via rgbLed.