Cambiar Propiedades entre Formularios



  • Un saludo para todos.

    De antemano agradezco su atención.

    Tengo una situación con mi proyecto en Qt. Tengo dos formularios MainWindows y Form, en MainWindows existe un Botón que me lleva al formulario Form, y en este existe un conjunto de opciones que me configuran una tabla y me muestran los Qwidget que pordefecto estaban SetVisible(false) en el formulario MainWindows, En otras palabras me muestra lo que estaba escondido en el primer formulario.
    Mi pregunta específicamente es, como cambio las propiedades de un objeto de un formulario1 desde un formulario2.
    Yo intente implementar el siguiente código, pero no me funciono sin embargo lo dejo para que por favor me digan mis errores, agradezco algún ejemplo o cualquier información que me puedan brindar ya que soy novato en Qt.

    En MainWindows se encuentra el Qwidget que quiero mostrar.
    MainWindows.h
    @public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    void fazer(); @

    MainWindows.cpp

    @void MainWindow::fazer(){
    ui->Widget->setVisible(true);
    }
    @

    Form.cpp

    @void Form::on_pushButton_clicked()
    {
    MainWindow *Vanta = new MainWindow(this);
    Vanta->fazer();
    Vanta->show();
    }@

    Bueno agradezco nuevamente su atención y espero ser claro en mi pregunta



  • Hola

    Tienes un MainWindow, desde ahí abres un Form, y desde ese Form quieres cambiar algo del MainwWindow primero. Según el código que pones, en el método on_pushButton_clicked() estás creando otro MainWindow, por lo que no estás accediendo al primero.

    Para hacer lo que propones se me ocurre que puedas pasar un puntero del widget al que quieras modificar del MainWindow al Form, o usar señales, creas una señal en el Form y la conectas con un SLOT del MainWindow y así tan solo tendrás que emitir la señal cuando quieras que se modifique el widget.

    Saludos



  • Puede ser un poco mas ilustrativo, tiene algún ejemplo que me pueda suministrar



  • Hola

    Te pongo un pequeño ejemplo, no es muy difícil de implementar lo que te conté. El caso de las señales es muy sencillo, tan solo hay que definir una y emitirla cuando quieras, además, como setVisible es un SLOT, tan solo hay que conectar tu señal con ese SLOT.

    Por ejemplo, así sería la clase que emite la señal:

    el .h:
    @class Dialog : public QDialog
    {
    Q_OBJECT

    public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();

    signals:
    // la señal que emitimos, lleva un parámetro bool porque el SLOT
    // setVisible lo requiere y así podemos usar la señal para ocultarlo
    // o mostrarlo
    void widgetVisible(bool);

    private slots:
    void on_pushButton_clicked();

    private:
    Ui::Dialog *ui;
    };
    @

    el .cpp:
    @void Dialog::on_pushButton_clicked()
    {
    // se emite la señal al pulsar el botón, en este caso el parámetro puse false,
    // pero puedes usarlo para mostrar/ocultar el widget
    emit widgetVisible(false);
    }
    @

    Ahora el .cpp del MainWindow, tan solo creamos la ventana y conectamos el la señal que acabamos de crear
    con el SLOT que queremos:
    @Dialog ventana(this);

    // widget es el nombre que yo le dí a un elemento de la interfaz
    connect(&ventana, SIGNAL(widgetVisible(bool)), ui->widget, SLOT(setVisible(bool)));

    ventana.exec();
    @

    El otro caso es si acaso más sencillo aun, tan solo hay que añadir un puntero al widget que queramos en el constructor de la segunda ventana y usar ese puntero para ocultar/mostrar el widget:

    .h:
    @class Dialog : public QDialog
    {
    Q_OBJECT

    public:
    // hay que añadir el nuevo parámetro en el constructor
    explicit Dialog(QWidget *widget, QWidget *parent = 0);
    ~Dialog();

    signals:

    private slots:
    void on_pushButton_clicked();

    private:
    Ui::Dialog *ui;

    // puntero al widget que ocultaremos
    QWidget *pWidget;
    

    };
    @

    el .cpp
    @void Dialog::on_pushButton_clicked()
    {
    // ahora tan solo usamos el puntero para ocultar el widget
    pWidget->setVisible(false);
    }
    @

    Y en el MainWindow tan solo hay que añadir el nuevo parámetro al crear la ventana:
    @void MainWindow::on_bAbrir_clicked()
    {
    Dialog ventana(ui->widget, this);

    ventana.exec();
    }
    @

    Personalmente me gusta más el sistema de SIGNALS/SLOT, este ejemplo es muy básico, pero imagina que quieres "controlar" varios widgets, habría que pasar varios parámetros o buscar otra alternativa.

    Saludos



  • Juanki Agradezco tu ayuda y atención, afortunadamente resolví mi problema, con la ayuda que me diste, ademas de guiarme muy bien del siguiente video.
    Gracias por tomarte el tiempo para resolver mi duda ya que es algo muy importante para mi.
    "Video Signal and Slot entre Formularios":http://youtu.be/K4dOf6d9wP0


Log in to reply
 

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