Ver esta página: "QT4 como llamar una Forma(Qwidget) desde Otra Forma

1,034 views
Skip to first unread message

Suky

unread,
Mar 22, 2009, 9:21:00 PM3/22/09
to Qt-español
Dudas sobre como llamar formas de tipo QWidget

Haz clic en http://groups.google.com/group/qt-espanol/web/qt4-como-llamar-una-formaqwidget-desde-otra-forma-qwidget?hl=es.
Si haciendo clic no se activa, copia el enlace y pégalo en la barra de
direcciones de tu navegador.

Lisandro Damián Nicanor Pérez Meyer

unread,
Mar 22, 2009, 11:02:27 PM3/22/09
to qt-es...@googlegroups.com
El Sunday 22 March 2009 22:21:00 Suky escribió:
> Dudas sobre como llamar formas de tipo QWidget

Sukey es nuevo en el grupo. Lo que él preguntó es:

--8<----8<----8<----8<----8<----8<----8<----8<----8<----8<----8<----8<--

Mi nombre es sukey, soy estudiante y pretendo hacer mis graficos en QT,
apenas voy conociendo esta herramienta, el caso es que ya he empezado a
hacer algunas cosas, pero pasa lo
siguiente:

* Hice una forma de tipo QWidget, la cual contiene otros widget como
botones tabs, etc. Pero me gustaria que al momento de elegir una opcion
poder llamar a otra forma de tipo QWidget que cree, no se como hacer esto.

* Voy a necesitar tener varias formas y llamarlas entre si y regresarme a
la principal, pero no logro hacerlo.

Les agradecería mucho cualquier idea que me pudieras dar...De antemano mil
gracias. Estaré a la espera de sus comentarios.

Saludos

Sukey Nakasima

--8<----8<----8<----8<----8<----8<----8<----8<----8<----8<----8<----8<--

Sukey: ¿podrás mostrarnos algún screenshot o algo de código para orientarnos?
Particularmente no llego a entender que estás preguntando :-(

¡No alfojes!

--
$ make war
make: *** No rule to make target `war'. Stop. Try `love' instead
David Gravereaux

Lisandro Damián Nicanor Pérez Meyer
http://perezmeyer.com.ar/
http://perezmeyer.blogspot.com/

signature.asc

Suky

unread,
Mar 23, 2009, 12:11:19 AM3/23/09
to Qt-español
Muy Bien...Voy a tratar de detallar más mi problema...


He creado un proyecto, donde mi clase base es un QWidget (esto lo he
hecho con Qt Creator, por lo que se genera la forma automáticamente).

Esta forma tiene una serie de opciones, y yo quisiera que al elegir
una opcion, me llevara a otra forma donde presentare otra informacion.
Para esto, hice otra forma, dandole click derecho sobre el proyecto y
eligiendo la opcion Add New, elegi New QT Designer Form Class y elijo
como template/form WIDGET (esto me genera un archivo ui_form.h,
form.h, form.cpp y form.ui).

En el archivo form.ui, es donde puedo diseñar mi forma. El caso es que
no se como hacer, para llamar esta nueva forma, desde la primer forma
que hice previamente. La primer forma seria como mi menu principal y
de ahi le estaria hablando a las demas formas.

file:///home/suky/ImagenesBlueFriend/mainBlueFriend.png

ENtonces se me ocurrio, en el widget.cpp (que seria parte de la forma
1):

QWidget* Widget::getWidgetCurrent(){
return currentWidget;
}

void Widget::setWidgetCurrent(QWidget *currentW){
currentWidget = currentW;
}

Las cuales activo desde el main.cpp, donde hago una instancia del tipo
Widget w y lo establesco.es decir:

int main(int argc, char *argv[])
{
QApplication a(argc, argv);

Widget widget;


widget.setWidgetCurrent(&widget);

QWidget *currentWidget = widget.getWidgetCurrent();
currentWidget->show();
a.setActiveWindow(currentWidget);
widget.show();

return a.exec();
}

Y hasta ahí todo va muy bien, pero una ves que me presenta la pantalla
inicial, cuando yo elijo una opcion la cual me deberia traer la
siguiente forma creada (form.ui) no lo hace...no pasa nada, entonces
ya se no como puedo hacer esto.

if(ui->rbPersonalD->isChecked()){
widgetPD wpd;//este objeto forma parte del
widgetPD.cpp de la forma2
setWidgetCurrent(&wpd);//este es el metodo que cree
en widget.cpp de la forma1
wpd.show();
}

Espero haberme explicado mejor, la verdad no tengo idea y me encuentro
muy atorada en esta onda. Así que cualquier cosa que me digan sera de
mucha ayuda.

Las imagenes no las pude poner, asi que espero que con lo que les
alcance para darme cualquier consejo.

Martin Ribelotta

unread,
Mar 23, 2009, 12:19:06 AM3/23/09
to qt-es...@googlegroups.com
On Mon, 23 Mar 2009 00:02:27 -0300
Lisandro Damián Nicanor Pérez Meyer <perez...@gmail.com> wrote:

> El Sunday 22 March 2009 22:21:00 Suky escribió:
> > Dudas sobre como llamar formas de tipo QWidget
>
> Sukey es nuevo en el grupo. Lo que él preguntó es:
>
> --8<----8<----8<----8<----8<----8<----8<----8<----8<----8<----8<----8<--
>
> Mi nombre es sukey, soy estudiante y pretendo hacer mis graficos en QT,
> apenas voy conociendo esta herramienta, el caso es que ya he empezado a
> hacer algunas cosas, pero pasa lo
> siguiente:
>
> * Hice una forma de tipo QWidget, la cual contiene otros widget como
> botones tabs, etc. Pero me gustaria que al momento de elegir una opcion
> poder llamar a otra forma de tipo QWidget que cree, no se como hacer esto.
>
> * Voy a necesitar tener varias formas y llamarlas entre si y regresarme a
> la principal, pero no logro hacerlo.
>
> Les agradecería mucho cualquier idea que me pudieras dar...De antemano mil
> gracias. Estaré a la espera de sus comentarios.
>
> Saludos
>
> Sukey Nakasima

Hola Sukey, parece que quisieras algo similar a un wizard, (como los
diálogos de instalar->siguiente->siguiente) Para eso te comento que
existe un componente derivado de QWidget llamado QWizard

Ejemplo de uso y documentación en:
http://doc.trolltech.com/4.5/qwizard.html#details

(No lo copio y pego acá para no extenderme)

Si esto no es tu pregunta, supongo que haces referencia a algo mas
basico tipo como mostrar QWidgets creados por uno como ventanas popup:

void MiWidgetPrincipal::abrir_ventana1() {
// Todos los desendientes de QWidget deben poderles pasar el
// parámetro "parent" tipo QWidget en el constructor
// para no tener que preocuparnos por destruirlos nosotros
QWidget *w = new MiVentanaSecundaria1(this);
w->show();
}

.....

MiVentanaSecundaria1::MiVentanaSecundaria1(QWidget *parent):
QWidget(parent)
{
...constructor...
}

Si quisiéramos una ventana modal, deberíamos usar un QDialog como clase
base o insertar nuestro derivado de QWidget dentro de uno:

void MiWidgetPrincipal::abrir_modal() {
MiDialogoModal d( this );
if (d.exec()==QDialog::Accepted ) {
// Código al aceptar
} else {
// Código al rechazar
}
}
.....
class MiDialogoModal: public QDialog {....};

Es recomendable usar el QtDesigner para crear visualmente los dialogos
y luego, bien generar el .h a partir del .ui del designer y compilarlo
junto con nuestro proyecto o bien cargarlo con la ayuda de QUiLoader:

MyWidget::MyWidget(QWidget *parent)
: QWidget(parent)
{
QUiLoader loader;
QFile file(":/forms/myform.ui");
file.open(QFile::ReadOnly);
QWidget *myWidget = loader.load(&file, this);
file.close();

QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(myWidget);
setLayout(layout);
}

Espero halla servido para aclararte algunas dudas, cualquier cosa,
pregunta nuevamente

Ivan de Leon

unread,
Mar 23, 2009, 1:15:10 AM3/23/09
to qt-es...@googlegroups.com
Un saludo, no se si ya resolviste el problema, pero en mi compu tenía este ejemplo pequeño que había hecho, espero pueda servir.
--
http://unmundolibre.wordpress.com/

Linux User # 451867
Ejemplo.tar.gz

Lisandro Damián Nicanor Pérez Meyer

unread,
Mar 23, 2009, 9:12:28 AM3/23/09
to qt-es...@googlegroups.com
El Monday 23 March 2009 01:11:19 Suky escribió:
> Muy Bien...Voy a tratar de detallar más mi problema...
>
>
> He creado un proyecto, donde mi clase base es un QWidget (esto lo he
> hecho con Qt Creator, por lo que se genera la forma automáticamente).
>
> Esta forma tiene una serie de opciones, y yo quisiera que al elegir
> una opcion, me llevara a otra forma donde presentare otra informacion.
> Para esto, hice otra forma, dandole click derecho sobre el proyecto y
> eligiendo la opcion Add New, elegi New QT Designer Form Class y elijo
> como template/form WIDGET (esto me genera un archivo ui_form.h,
> form.h, form.cpp y form.ui).
>
> En el archivo form.ui, es donde puedo diseñar mi forma. El caso es que
> no se como hacer, para llamar esta nueva forma, desde la primer forma
> que hice previamente. La primer forma seria como mi menu principal y
> de ahi le estaria hablando a las demas formas.
>
> file:///home/suky/ImagenesBlueFriend/mainBlueFriend.png

Suky: creo que el ruso dió en el clavo con lo que buscabas. Como sea, la url
que nos mandaste es a un archivo local en tu máquina.

¡Saludos!

--
FAQ del pequeño tomi:
P- ¿Que pasa si quiero ejecutar XWindow en una 386 con 4mb de RAM?
¿Que swap necesito?
R- No neceistas swap, necesitas internarte en el borda...
yo lo hice con 20Mb de swap... todavia estoy suelto...
Textual de Martín "El Ruso" Ribelotta

signature.asc

Suky

unread,
Mar 24, 2009, 3:27:04 AM3/24/09
to Qt-español
Muchas Gracias...Pude resolver mi problema con el ejemplo que me
pasaron...Tengo una forma principal y dos formas que se derivan de la
primera, mi codigo quedo así (lo comparto, para cualquier otro
principiante como yop):

/*Este es mi metodo asignado a un slot, cuando le doy click a un
boton, se viene aca*/
void Widget::choosingOption(){

/*Ahora se determina, que opcion eligio del grupo de
radiobutton*/

if(ui->rbPersonalD->isChecked()){
/*En cualquiera de los dos casos, lo que hace es
crear una instancia de la forma que queremos invocar*/
widgetPersonalData *widget = new widgetPersonalData
();

/*Aqui mando el objeto creado y lo guardo en una
instancia de la clase QWidget*/
setCurrentWidget(widget);
/*Aqui recupero el objeto y lo mando a esta
funcion que es la que nos permitira abrir la siguiente ventana*/
openingForms(getCurrentWidget());

}
else
if(ui->rbProfile->isChecked()){

widgetProfile *widget = new widgetProfile();
setCurrentWidget(widget);
openingForms(getCurrentWidget());
}
}//choosingOption
/*se establece como widget actual, el que queremos abrir*/
void Widget::setCurrentWidget(QWidget *currentW){
currentWidget = currentW;
}

/*Se obtiene el widget creado*/
QWidget* Widget::getCurrentWidget(){
return currentWidget;
}

/*Abrimos la forma deseada*/
void Widget::openingForms(QWidget *currentWidget){
currentWidget->setWindowModality(Qt::ApplicationModal);
currentWidget->show();
}

Para regresarme al widget principal, lo que hice fue ponerle un boton,
con el slot Close() (que ya viene definido) y lo hace bien, pero ahora
tengo otras preguntas:

* COMO PUEDO HACER INVISIBLE LA FORMA PRINCIPAL, UNA VEZ QUE
ABRA OTRA FORMA???
ejemplo: Forma1 ...abre...Forma2 (forma1 es invisible)

* SI HASTA EL MOMENTO SOLO TENGO UNA FORMA PRINCIPAL Y VARIAS
FORMAS DERIVADAS, PARA REGRESAR A LA FORMA PRINCIPAL ME FUNCIONA CON
CLOSE(), PERO TRABAJARIA IGUAL SI EN UN MOMENTO DADO, DE UNA DE ESAS
FORMAS DERIVADAS HICIERA OTRA SUBFORMA, SI LE PONGO UN BOTON CON EL
METODO CLOSE() ME REGRESARIA A LA FORMA QUE LA DERIVO O ME REGRESARIA
HASTA LA FORMA PRINCIPAL???

Espero que esto no paresca un trabalenguas y que me haya podido
explicarme. Una vez más les agradezco su apoyo, por que antes de sus
explicaciones y ejemplos, ya me habia aventado tres dias y no más no
salia, asi que mil gracias.

Estaré a la espera de sus comentarios...

Saludos

Atentamente

Sukey Nakasima

Jesús Fernández

unread,
Mar 24, 2009, 4:10:49 AM3/24/09
to qt-es...@googlegroups.com
Pues crea en el widget un signal shown que sea emitido cuando el widget sea mostrado y conectalo al slot hide del widget que quieras cerrar.

2009/3/24 Suky <sukey.naka...@gmail.com>

Ivan de Leon

unread,
Mar 24, 2009, 1:44:13 PM3/24/09
to qt-es...@googlegroups.com
1. Bueno, creo que para mi una forma fácil para hacer lo que dices es como mencionaba Martin, tomar QDialog, como clase base. Ya que con esta clase base te quedaría algo asi el codigo.


void Widget::openingForms(QDialog *currentWidget)
{
    hide();
    currentWidget->exe();
    show();
}

Lo que hace el codigo es primero con hide(), ocultaría tu form principal, luego abre el segundo form.
Pero al momento de cerrar el segundo form, se podría decir sigue con el codigo que esta a continuación de currentWidget->exe(), por lo tanto con show(), vuelves a mostrar el form principal. La diferencia es que QWidget por lo que se, no podrías usar exec().


2. Ahora con lo que preguntas, al momento de utilizar close(), y asi como te explicaba en lo anterior en Qdialog. La forma se cierra y regresa a la forma que la llamo, y no al form principal.

Bueno. Espero que te ayude.

Suky

unread,
Mar 24, 2009, 4:24:52 PM3/24/09
to Qt-español
Muy bien, entonces probare con esto...una pregunta; hide() y show()
hay que hacer una implementación de ellos dentro de la clase o se usa
tal cual como tu lo pusiste. Pasa que me confunde que estos metodos no
sean propios de QDialog, es decir, esperaba verlo como currentWidget-
>hide() o currentWidget->show().


> void Widget::openingForms(QDialog *currentWidget)
> {
>     hide();
>     currentWidget->exe();
>     show();
>
> }

Bueno entonces más tarde lo probaré, y luego les hago saber mis
resultados. Muchas gracias por tu ayuda.

Saludos

Ivan de Leon

unread,
Mar 24, 2009, 5:29:00 PM3/24/09
to qt-es...@googlegroups.com
Con respecto a tu pregunta, hide() y show(), no hay que implementarlos, estos son de Qdialog.

Lo que pasa al momento de colocarlo como esta el código.

> void Widget::openingForms(QDialog *currentWidget)
> {
>     hide();
>     currentWidget->exe();
>     show();
>
> }


lo coloque asi por que tomé en cuenta que openingForms, es parte del formulario principal, y como el formulario principal es el que deseas ocultar y mostrar,

Ahora si deseas ocultar y mostrar otro form entonces si colocas. nombre_form->show() y nombre_form->hide().

Espero que me halla dado a entender.

Saludos
Reply all
Reply to author
Forward
0 new messages