Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

How Can i get array in another class



  • Hello ,
    I created a public array in class A .
    I want to get this array in class B .

    so this is my code .

    In class A.h

    std::array<QString,25> Inputs;
    
    

    In class A.cpp

    int compteur=0;
    QString cell0;
    QString cell3 ;
    for(int i=0;i<ui->tablewidget->rowCount();i++){
    
    QTableWidgetItem *cell7 = ui->tablewidget->item(i,7);
    
    QVariant myData7 = cell7->data(Qt::DisplayRole);
    if (myData7=="Core_meas"){
    cell0 = ui->tablewidget->item(i,0)->text();
    cell3 = ui->tablewidget->item(i,3)->text();
    Inputs[compteur]=cell3;
    qDebug() << "Inputs baby"<<Inputs[compteur] ;
    compteur++;
    }
    
    

    In class B :

    I create instance of Class A then I called the array but I get it null .

    this what I did :
    In class B.h

    #include "classA.h"
    
    ClassA myclassA ;
    

    In class B.cpp

    for(size_t i=0;i<myclasseA.Inputs.size();i++){
    myclasseA.Inputs[i];
    qDebug() << "this is data",myclasseA.Inputs[i]
    
    

    I get outputs :

    this is data : ""
    

    What I did wrong .
    Or How can I do this correctly
    thankyou


  • Lifetime Qt Champion

    Hi,

    What exactly do you want to do ?

    Class A seems to be a widget that you likely instanciate somewhere. You likely instanciate an object of class B somewhere else and thus these are two different objects of class A.

    What exactly are you trying to do ?



  • @SGaist
    yes , exact class A is a widget .I uploaded a csv file then extract some data from it and put it in Inputs[] using this code :

    int compteur=0;
    QString cell0;
    QString cell3 ;
    for(int i=0;i<ui->tablewidget->rowCount();i++){
    
    QTableWidgetItem *cell7 = ui->tablewidget->item(i,7);
    
    QVariant myData7 = cell7->data(Qt::DisplayRole);
    if (myData7=="Core_meas"){
    cell0 = ui->tablewidget->item(i,0)->text();
    cell3 = ui->tablewidget->item(i,3)->text();
    Inputs[compteur]=cell3;
    qDebug() << "Inputs "<<Inputs[compteur] ;
    compteur++;
    }
    

    So I would like to get the Inputs[] in my class B .

    I create a classA instance in class B .

    ClasseA myclasseA; // in classB.h
    //then i tried to get Inputs[] using this code
    for(size_t i=0;i<myclasseA.Inputs.size();i++){
    myclasseA.Inputs[i];
    qDebug() << "this is data",myclasseA.Inputs[i]
    

    So my question is what i have missed .? Or how can i do this correctly .


  • Lifetime Qt Champion

    What is class B supposed to be doing ?



  • @SGaist I will manipulate a CAN bus (send and receive frame) using data in inputs[].



  • @dziko147 I am doing similar task - passing data between classes and trying to use "connect". In my case the "parent " class" is a "form" and the "child" class is a widget - dialog.
    I do not have it fully solved.
    I can use QDesigner "go to slot" , but so far only within the class.
    I found a bug ( submitted and acknowledged as bug ) in "go to slot" and trying to hack around it for now.
    Is that something - connect - which would work for you?



  • @AnneRanch what type variable you passed please !



  • This post is deleted!


  • @dziko147
    Hi,
    I tried doing make the same thing and I didn't see anything wrong.
    Are you sure the fill function is called?
    Are you sure that you don't have two instances of the class?

    Class1.h
    public:
    std::array<QString,25> Inputs;

    Class1.cpp
    Class1::Class1(QObject *parent) : QObject(parent)
    {
    for( int i=0; i<25; i++)
    {
    Inputs[i] = 'a'+i;
    }
    }
    Class2.h
    protected:
    Class1 *myClass;

    Class2.cpp
    Class2::Class2(QObject *parent) : QObject(parent)
    {
    myClass = new Class1();
    for ( int i=0; i<25; i++)
    qDebug() << myClass->Inputs[i];
    }
    My output
    "a"
    "b"
    "c"
    "d"
    "e"
    "f"
    "g"
    "h"
    "i"
    "j"
    "k"
    "l"
    "m"
    "n"
    "o"
    "p"
    "q"
    "r"
    "s"
    "t"
    "u"
    "v"
    "w"
    "x"
    "y"



  • @CP71 said in How Can i get array in another class:

    protected:
    ClassChield *chield;

    can you explain me what did this ?



  • @dziko147
    My mistake, I have corrected my previous post.
    In my example project the classes have different names
    Sorry



  • @CP71 thanks for your reply .
    I used your solution but still get array empty.

    I set data in Inputs in a Slot called after clicking in button .
    It cause problem ?

    void UploadCSV::on_parambtn_2_clicked()
    {
    
        int compteur=0;
        QString cell0;
        QString cell3 ;
        for(int i=0;i<ui->tablewidget->rowCount();i++){
    
            QTableWidgetItem *cell7 = ui->tablewidget->item(i,7);
    
            QVariant myData7 = cell7->data(Qt::DisplayRole);
            if (myData7=="Core_meas"){
                cell0  = ui->tablewidget->item(i,0)->text();
                cell3 = ui->tablewidget->item(i,3)->text();
                Inputs[compteur]=cell3;
                qDebug() << "Inputs baby"<<Inputs[compteur] ;
                compteur++;
            }
    
        }
    
    
    }
    


  • @dziko147
    I suppose you see a valid values in array at line:
    qDebug () << "Inputs baby" << Inputs [compteur];

    If yes, the only thing I think is a double instance of the class, but surely you have already checked it.

    I don't have other ideas :(



  • @dziko147 At current state of the project I need only a text (QTString ) - basically address and name of local , connected to PC, Bluetooth device.
    That data is a result of my dialog "scan" for local Bluetooth adapters. .

    Since it is such small amount of data I am currently NOT using "connect".
    Eventually I am going to use connect to pass real data from the dialog to the form.

    I started using "go to slot" feature , however I have not figured out how to use it "between objects ".
    It is interesting feature but so far only good to "pass data" in same object.

    It has an optional "parameter", but I not found how to use it.

    So in summary - using "go to slot" should be able to pass data between objects - as you desire . But I need to study it more.

    PS
    Passing data between objects seems to be subject of many discussions.
    The way I see it - it is two step process - you have to collect the data (obviously) using "connect" triggered by the data event. . Then use second "connect " to pass the captured data between objects.



  • @AnneRanch if you need just a Qstring to pass it . I recommend using signal/Slot .


  • Lifetime Qt Champion

    @dziko147 you should go back to the basics first: s├ęparation of responsibilities.

    There's no reason for you child class to have an instance of your GUI class in it.

    From the looks of it, your GUI is responsible to generate that array and it looks as well as the class processing that array should receive it from the GUI object. Hence there's no need for it to know anything or contain an object of your GUI class.



  • @SGaist exact. I set data in my array from GUI element .
    if i understand you. I don't need to create an instance of my class .
    So how can i call the array from the other class



  • If class B is child of class A, then you can do sth like this in class B

    classA *clsA= dynamic_cast <classA*> (parent());
    clsA->funcToGetData();
    


  • @anh_ph the funcToGetData(); can be a slot wich get data from GUI elements ?

    And if classA isn't child od classB . How can i call it



  • @dziko147 said in How Can i get array in another class:

    And if classA isn't child od classB . How can i call it

    The code you were shown attempts to cast the parent() to classA. If your classA instance is not related to you classB instance through its parent, then use whatever you have for the desired classA instance....

    I'm not sure but you seem not to understand the difference between a class and an instance (or object)? If that is the case I suggest you read up to understand, as this is vital in OO programming.



  • @JonB no i know the difference between instance and class .
    But honestly i have no idea what parent() mean .
    And if we say a classA is a child of classB we mean classA is inherited drom classB .

    Thank you


  • Lifetime Qt Champion

    @dziko147 said in How Can i get array in another class:

    we mean classA is inherited drom classB

    No, we don't.
    See https://doc.qt.io/qt-5/objecttrees.html
    Parent/child is not about inheritance it is about relationships between QObject based classes.



  • @dziko147 said in How Can i get array in another class:

    @anh_ph the funcToGetData(); can be a slot wich get data from GUI elements ?

    And if classA isn't child od classB . How can i call it

    If you want to get data from classA, you must get an exact object of it, which works with the data. If you can't do it, then try to apply singleton to classA.
    Btw, you can't get an array in another class, but you can get an array in an object of another class.



  • to resume what should i do to set data from GUI element in an array then get this array in another class .

    Btw I tried many solution but usually I get an empty array in the other class :)


  • Lifetime Qt Champion

    @dziko147 said in How Can i get array in another class:

    but usually I get an empty array in the other class

    I guess that's because you have more than one instance of the class from which you get your array.
    Please post your code. Passing data from one object to another is actually a trivial exercise.



  • @jsulm

    // classeA.h
    std::array<QString,25> Inputs;
    
    // ClassA.cpp "UploadCSV"
    void UploadCSV::on_parambtn_2_clicked()
    {
    
        int compteur=0;
        QString cell0;
        QString cell3 ;
        for(int i=0;i<ui->tablewidget->rowCount();i++){
    
            QTableWidgetItem *cell7 = ui->tablewidget->item(i,7);
    
            QVariant myData7 = cell7->data(Qt::DisplayRole);
            if (myData7=="Core_meas"){
                cell0  = ui->tablewidget->item(i,0)->text();
                cell3 = ui->tablewidget->item(i,3)->text();
                Inputs[compteur]=cell3;
                qDebug() << "Inputs baby"<<Inputs[compteur] ;
                compteur++;
            }
    
        }
    
    
    }
    

    //in classB.

    UploadCSV *up;

    //in classB.cpp

    up=new UploadCSV();
    for(size_t i=0;i<up.Inputs->size();i++){
    qqDebug() << "this is data",up.Inputs[i]
    
    

  • Lifetime Qt Champion

    @dziko147 Sorry, I fail to understand the code you posted.
    What type is myclasseA? And why do you access Inputs from two different objects (up and myclasseA)?
    It really looks like you have two different instances of UploadCSV...



  • @dziko147 said in How Can i get array in another class:

    ,myclasseA.Inputs[i]

    Why do you have myClasseA there, when the object is up
    Try up.Inputs[i]

    (Corrected, thx @jsulm )


  • Lifetime Qt Champion

    @Pl45m4 said in How Can i get array in another class:

    when the object is UploadCSV

    UploadCSV seems to be the class, not object



  • @jsulm sorry I edited the code .

    I gave the expamle of classA and ClassB to be clearer .

    ClassA (UploadCSV ) is a Qwidget : Qdialog

    ClassB (Backend) is QObject .



  • @dziko147 said in How Can i get array in another class:

    up=new UploadCSV();
    for(size_t i=0;i<up.Inputs->size();i++){
    qqDebug() << "this is data",up.Inputs[i]

    Sorry, who calls the on_parambtn_2_clicked() function?


  • Lifetime Qt Champion

    @dziko147 Is this your real code:

    up=new UploadCSV();
    for(size_t i=0;i<up.Inputs->size();i++){
    qqDebug() << "this is data",up.Inputs[i]
    

    ?
    Because Items is filled when UploadCSV::on_parambtn_2_clicked() is called (at least according to code you posted). But you're printing Inputs just after creating UploadCSV instance (up)! So why should there be anything in Inputs?



  • @CP71 it's called in UploadCSV class (classA) .

    and inside this function I set data in Inputs[] .


  • Lifetime Qt Champion

    @dziko147 said in How Can i get array in another class:

    it's called in UploadCSV class (classA) .

    Where exactly?! And what is classA?! This all is really confusing!
    up != classA



  • @jsulm yes i understand you . So can you suggest a way to do this correctly ?


  • Lifetime Qt Champion

    @dziko147 Yes, I can: use one instance of the class instead of two...


  • Lifetime Qt Champion

    @dziko147 said in How Can i get array in another class:

    @jsulm yes i understand you . So can you suggest a way to do this correctly ?

    Something like it was explained in your other thread ?



  • @jsulm forget classA and classB example .

    So curretly we have UploadCSV class and BackendClass .
    I would like to get array defined from UploadCSV in Backend class .


  • Lifetime Qt Champion

    @dziko147 said in How Can i get array in another class:

    I would like to get array defined from UploadCSV in Backend class

    Then do so.
    To get it you need the UploadCSV instance. How you get it in Backend I don't know as I don't have your code. There are different ways to do this. You can pass pointer to UploadCSV instance to Backend constructor for example.
    But to be able to give a good advice we would need to know how you manage your UploadCSV and Backend instances.



  • @jsulm
    currently I pass a pointer like this .
    in backend.h

    UploadCSV *up;
    

    in backend.cpp

    up = new UploadCSV();
    

Log in to reply