¿Cómo pasar Arreglos de un Form a otro?



  • Soy nuevo tanto en C++ como en QT y quiero saber si hay alguna manera de pasar Arreglos de un Form a otro, utilizando un formato como el siguiente:

    void Dialog1::on_pushButton_clicked()
    {
    cont = cont + 1;
    numero = (ui->comboBox->currentText()).toInt();
    curso = ui->comboBox_2->currentText();
    Dialog2 *v = new Dialog2(this, curso, numero);
    close();
    v->show();
    }

    En el caso que les acabo de mostrar Curso y Numero son QStrings, y ahi el formato si funciona, sin embargo, con arreglos me sale error C2548. Alguna recomendacion? Si es que no se pudiera en ese formato, dadme cualquier otro por favor.



  • Hola

    Poderse, seguro que se podrá, no recuerdo si alguna vez lo hice.

    Lo que habría que ver es cómo lo estás pasando y cómo lo recibes, no has mostrado esa parte del código.

    También lo que haces con él, ese close() que aparece en el código. ¿Cierras el diálogo antes de abrir el otro?

    ¿No se estará destruyendo el array, y luego tratas de usarlo en el nuevo diálogo que abres? Recuerda que en C, una variable de tipo array en realidad es un puntero al primer elemento.

    En fin, como no des más datos difícil va a ser que alguien pueda ayudarte.

    Un saludo



  • @juanki
    Lo envio de un Dialog1 a Dialog 2

    En Dialog1.cpp, al presionar el boton debe enviarme al Dialog2 con las variables (ya llenadas) de numero y curso
    como se ven en el siguiente

    Dialog1.cpp

    0_1488215148801_upload-b01829cd-4f84-4ac2-b39a-30125e7673d0

    Dialog1.H .-

    0_1488215202828_upload-5ea7a988-58ad-4313-8788-6a51ba75980b

    Dialog2.cpp.-
    0_1488215298464_upload-83b56230-88b8-4ebe-a4d1-3743e2993112

    Dialog2.h.-
    0_1488215358942_upload-940e449d-578a-4a9c-a1f4-60226952f4b1

    Estas imagenes son las que tienen que ver, con la funcion. Lo que hace el Close() es cerrar la ventana anterior y lo que hace el Show() es mostrar la siguiente, en Este caso cierra Dialog1 y se abre Dialog2



  • NO veo ninguna imagen, me sale un link, pero cuando le doy me dice "page not found".

    POR FAVOR NO subas imágenes, copia el trozo de código que creas conveniente. Subir una imagen es más complicado para tí, tienes que sacar la captura, editarla, subirla a un servidor y copiar el link. con el texto TAN SOLO TIENES QUE HACER COPY & PASTE.

    Y, por si eso fuera poco, para el que quiere ayudarte es mucho más complicado, si quiero probar tu código y lo has subido como texto, tan solo tengo que hacer copy & paste, en cambio, si subes una imagen, ME OBLIGAS A TECLEARLO ENTERO, cosa que, personalmente, no voy a hacer.

    close() y show() sí sé lo que hacen, lo que no sé es porqué los ejecutas en ese orden, como te dije, si le pasas un array y destruyes el form puede que éste se destruya también y por eso te da error al acceder a los datos (es solo una suposición sin haber visto nada de código), en cambio, si destruyes el primer formulario después de destruir el segundo, no tendrías ese problema.

    Un saludo



  • @juanki ok, ahi van los trozos

    Fragmento del Dialog1.cpp:```
    //your code here

    
    void Dialog1::on_pushButton_clicked()
    {
        cont = cont + 1;
        numero = (ui->comboBox->currentText()).toInt();
        curso = ui->comboBox_2->currentText();
        Dialog2 *v = new Dialog2(this, curso, numero);
        close();
        v->show();
    }
    

    Fragmento completo del Dialog1.h
    //your code here

    
    #ifndef DIALOG1_H
    #define DIALOG1_H
    
    #include <QDialog>
    #include <dialog2.h>
    
    namespace Ui {
    class Dialog1;
    }
    
    class Dialog1 : public QDialog
    {
        Q_OBJECT
    
    public:
    
        explicit Dialog1(QWidget *parent = 0);
        Dialog1(QWidget *parent = 0, int var = 0);
        ~Dialog1();
        QString curso;
        int numero;
        int cont;
    private slots:
        void on_pushButton_clicked();
    
    private:
        int var;
        Ui::Dialog1 *ui;
    };
    
    #endif // DIALOG1_H
    

    Fragmento de la parte Inicial del Dialog2.cpp
    //your code here

    
    
    Dialog2::Dialog2(QWidget *parent, const QString curso, const int numero):
        QDialog(parent),
        ui(new Ui::Dialog2) , curso(curso), numero(numero)
    {
    ...
    
    
    

    Fragmento del Dialog2.h
    //your code here

    #ifndef DIALOG2_H
    #define DIALOG2_H
    
    #include <QDialog>
    #include <dialog3.h>
    #include <dialog1.h>
    
    namespace Ui {
    class Dialog2;
    }
    
    class Dialog2 : public QDialog
    {
        Q_OBJECT
    
    public:
        explicit Dialog2(QWidget *parent = 0);
        Dialog2(QWidget *parent = 0, const QString curso = "", const int numero = 0);
        int n = 0;
        ~Dialog2();
    
    private slots:
        void on_checkBox_clicked();
        void on_checkBox_2_clicked();
        void on_checkBox_3_clicked();
        void on_checkBox_4_clicked();
        void on_checkBox_5_clicked();
        void on_checkBox_6_clicked();
        void on_pushButton_clicked();
        void on_pushButton_2_clicked();
    
    private:
    
        int numero = 0;
        int geg = 0;
        QString curso;
    ...
    

    Los pongo en ese orden porque de la manera inversa me corre extraño, sin embargo, ese no es el problema ya que en otros Forms corre perfectamente tal vez porque solo envio variables con valores y no arreglos .
    //your code here



  • Joder, hoy debo estar más tonto que de costumbre, sigo sin ver el array por ninguna parte.

    Por cierto, imagino que sabes que el método close() NO destruye la ventana, solo la oculta, a no ser que uses el flag Qt::WA_DeleteOnClose:

    http://doc.qt.io/qt-5/qwidget.html#close



  • @juanki Sé lo del Close, pero lo que no se es como convertir cualquiera de las variables (osea en este caso el numero ) a arreglo y qeu funcione



  • Hola

    Y ¿para qué quieres convertir UNA variable en un arreglo? no tiene sentido, tendrías un arreglo de UNA posición. ¿No es mejor tener esa variable y listo?

    Un saludo



  • @juanki Porque quiero pasar muchos más valores y seria más facil si hubiera un arreglo a estar declarando varias variables con diferentes nombres que van a hacer a mi codigo enorme y horrible.



  • Hola

    Meter varias variables en un array puede ser un lio tremendo si dichas variables no guardan relación entre sí:

    	int num = 3;
    	int otra = 5;
    	int otra_mas = 28;
    	
    	int array[3];
    	array[0] = num;
    	array[1] = otra;
    	array[2] = otra_mas;
    

    Ya están en un array, el problema es que tienes que recordar en qué posición pusiste cada una y el lío en el código puede ser tremendo y resultaría en errores difíciles de encontrar.

    Un saludo



  • @juanki Ok pero sí guardan relación entre si, pero solo quería saber como pasar de una ventana a otra Arrays. Si ahora no me sirviese tal vez podria utilizarlo en otra oportunidad. Me han dicho que trate las ventanas como si fueran clases del main() pero no me parece que tenga mucho sentido.



  • @Eduardo12l said in ¿Cómo pasar Arreglos de un Form a otro?:

    Ok pero sí guardan relación entre si, pero solo quería saber como pasar de una ventana a otra Arrays.

    Pues como cualquier otro parámetro, por ejemplo, el nombre del array en realidad es un puntero al primer elemento, así que puedes declarar el parámetro en el método que la recibe como un puntero. Tendrías que enviarle también como un segundo parámetro la dimensión del array, si no, no tendrías forma de saberlo, o usar una constante en la clase para guardar ese tamaño o algo así.

    Me han dicho que trate las ventanas como si fueran clases del main() pero no me parece que tenga mucho sentido.

    ¿Te refieres a crear todas las ventanas en el método main? Personalmente no lo hago así y no me gusta la idea, ten en cuenta cada una que crees va a ocupar memoria y si tu programa tiene varias, pues imagínate el gasto, para que después el usuario no las abra.

    Además, como accederías a ellas cuando tienes que mostrarlas, ¿las pasas todas como parámetros?

    Yo las voy creando/destruyendo según se van necesitando.

    ¿Entiendo por tus preguntas que estás empezando en esto de la programación?

    Un saludo



  • @juanki ```

    Dialog1.h

    public:
    
    explicit Dialog1(QWidget *parent = 0);
        Dialog1(QWidget *parent = 0, int var = 0);
        ~Dialog1();
        QString curso;
        int numero[10];
        int cont;
    
    

    Dialog 2.h

    public:
        explicit Dialog2(QWidget *parent = 0);
        Dialog2(QWidget *parent = 0, const QString curso = "", const int *numero = 0);
        int n = 0;
    
        ~Dialog2();
    ...
    private:
    
        int numero[10];
        Ui::Dialog2 *ui;
    

    Dialog1.cpp
    //your code here

    void Dialog1::on_pushButton_clicked()
    {
        Dialog2 *v = new Dialog2(this, curso, numero);
        close();
        v->show();
    }
    
    

    Dialog2.cpp
    //your code here

    Dialog3::Dialog3(QWidget *parent, const int *numero) :
        QDialog(parent),
        ui(new Ui::Dialog3), numero(*numero) // Aqui me da error C2075 'la inicializacion de la matriz requiere una lista de inicializadores entre llaves'
    {
    

    De todas maneras no funciona me sale ahora un solo error el C2075 pero no entiendo eso de incializarlo.
    Bueno soy nuevo C++. Trato de convertir numero en vector o arreglo de una sola fila pero no me sale



  • Hola

    Bueno, yo creo que la solución más fácil sería que dentro de Dialog2 declares la variable numero como un puntero en vez de como un array. El nombre de un array en realidad es un puntero a su primer elemento, así, cuando en Dialog1 creas la ventana Dialog2 ya le estás pasando un puntero al primer elemento del array. Personalmente es lo que hago, no soy ningún experto ni nada, pero creo que sería lo más fácil.

    Si estás empezando con C++ te recomiendo que te pongas a aprender bien C++ y la programación orientada a objetos antes de meterte con Qt, si no tienes una buena base puedes complicarte mucho y dificultarte avanzar.

    Un saludo



  • @juanki Tampoco funciona, ¿Conoces algun metodo para pasar de una sola varias variables?



  • Como que no funciona. si tu declaras en el dialogo2 un puntero:

    int *arrayNumeros;
    

    Y en el constructor le pasas el array:

    Dialog2::Dialog2(int *numeros, QWidget *parent): QDialog(parent), ui(new Ui::Dialog2), arrayNumeros(numeros)

    Seguro que ésto te imprime todos los números del array:

    for(int i = 0; i < longitud_array; i++)
        qDebug() << i << ": " << *(arrayNumeros + i);
    

    Como te dije, te recomiendo que te pongas con C++ antes de meterte con Qt.

    Un saludo



  • @juanki De todas maneras gracias por tu ayuda, he creado otro post en C++ Guru y ya creo que he logrado resolver el problema usando QVectors


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.