manejo de señales desde harbour Qt
12/09/2010
(Todo esta información esta relacionada con la version 2.0),
la teoría general se conserva , pero la implementacion cambio
el modelo de eventos cambio en la versión 3.0
por ejemplo:
Qt_Connect_Signal(cancelarB,QT_EVE_CLICKED, {|| cExit := .T. ,winD:reject() })
quedó
cancelarB : connect (QT_EVE_CLICKED, {|| cExit := .T. ,winD:reject() })
No si si para todos los desarrolladores que empezamos con Qt, nos
pasa lo mismo , pero para mi una de las dificultades mas grandes ha
sido encontrar las senales adecuadas a los objetos que deseo utilizar y
desde luego los SLOTS, que usa uno y otro objeto.
De manera un poco burda me explico a mi mismo lo siquiente.
Un objeto tiene un contenido al momento de invocarlo o porque se le dio
el valor inicial o porque lo tiene por defecto, por decir algo colocar
un valor cualquiera a un objeto con OBJ:SETVALUE(param)..
Saber cual es el valor que el objeto contiiene deberia ser sencillo pero
a veces no los es tanto., pero si me siguen en el ejemplo podria ser
algo como OBJ : VALUE()
Por claridad para mi, decidi no utilizar parentesis en las propiedades
de los objetos por eso digo OBJ : VALUE y no OBJ:VALUE() de momento
me estan funcionado igual , la literatura y los manuales que
he consultado usan de forma indistinta ambas nomenclaturas, dentro
de mi razonamiento prefiero usar las propiedades sin parenteseis por
ser estan un contenido VALOR de un OBJETO y no una funcion ni
procedimiento. (recuerdo que esto es para mi claridad)
13/09/2010
Como decia el dia de ayer saber cual es la señal asociada a un objeto
no ha sido nada facil y menos la forma como opera.
una veces tienen argumento, otras sin argumento, con dos argumentos
que son llamadas a tipo de objetos.
El enrrededo es de la madona para saber cuando y como lanzar una
senal.
Entonces simplifique la cosa para mi, no me gustan las cosas complejas
máxime que mas tarde me tocas modificarlas o cambiarlas por convencion
asocie lo siguiente
1. Un objeto tiene propiedades que contiene valores que a mi me sirven
para efectuar operaciones en Harbour. como mencione arriba del tipo
OBJ:VALUE o a los cuales les asigno valores por ejemplo OBJ : SETVALUE
2. A un objeto le pudo conectar una senal, para que envie un evento
cuando la condición del evento se ve satisfecha
version 2.0
Qt_Connect_Signal( OBJ, "clicked()", ....
version 3.0
OBJ: connect("clicke()"..
Ojo: encontré que las senales en Harbour son sencibles a las
mayúsculas y minusulas no funciona CLICKED() por ejemplo.
3. A el objeto se le asocia un SLOT , que aunque burdo como lo dije
anteriormente y es para mi entendimiento , no es mas que las accion
que quiero que la señal haga cuando el evento se cumpla:
Qt_Connect_Signal( OBJ, "clicked()", {|| elegido_ := OBJ: VALUE } )
En el ejemplo :
el Block :: {|| elegido_ := OBJ: VALUE() }
simplemente le asigna a la variable elegido_ el contenido del valor
de OBJ
la cual puedo manipular libremente, desde luego tambien puede haber
invocado una funcion o procedimiento de la siguiente forma
version 2.0
Qt_Connect_Signal( OBJ, "clicked()", {|i| myFuncion(i) } )
version 3.0
OBJ : connect( OBJ, "clicked()", {|i| myFuncion(i) } )
donde en el bloque recibo el valor de i y se lo paso como parametro
a mi función.
4 Para mantener la cosas sencillas en mi aplicacion decide no
depender de un evento especifico para tal o cual objeto sino que
cree un metodo mediante encapsulo el uso de una OBJ particular en
un DIALOG o en MAINWINDOW, pero con un par de botones de
Aceptar y Cancelar, que son los disparadores de la accion, como
dije antes , el contenido del objeto no depende en ningun caso de
el mecanismo de disparo del evento , el evento solo nos da la accion
a ejecutar una vez se produzca entonces un codigo de la lo
que hice se reduce a
/*----------------------------------------------------------------------*/
FUNCTION GetSosK(textoTmp,variableTmp)
// Retorna 3 parametros : RETURN {param1,param2,param3}
// param1 :: el Objeto winD
// param2 :: el valor de la variable capturada
// param3 :: si el valor fue aceptado/cancelado
#define QT_EVE_CLICKED "clicked()"
LOCAL S1,GG
LOCAL winD, layoP, layoD, layoB
LOCAL aceptarB, cancelarB
LOCAL aExit := .T.
LOCAL cExit := .F.
LOCAL elegido_ := "ACEPTAR"
LOCAL salida_
layoP := QVBoxLayout():new()
layoD := QHBoxLayout():new()
layoB := QHBoxLayout():new()
winD := QDialog():new()
winD : setWindowTitle(textoTmp)
winD : setStyleSheet(cssK(CSS_GET))
S1 := QLabel():new()
SI : setText(textoTmp)
GG := QEdit() :new()
GG : variableTmp
aceptarB := QPushButton():new()
aceptarB : setText("&" + Tr("Aceptar"))
aceptarB : setStyleSheet(cssK(CSS_GET))
aceptarB : setDefault(.T.)
cancelarB := QPushButton():new()
cancelarB : setText("&" + Tr("Cancelar"))
cancelarB : setStyleSheet(cssK(CSS_GET))
layoD : addWidget(S1)
layoD : addWidget(GG)
layoD : sizeConstraint(1)
layoB : addWidget(aceptarB)
layoB : addWidget(cancelarB)
layoP : addLayout(layoD)
layoP : addStretch()
layoP : addLayout(LayoB)
winD : setLayout(layoP)
/*
version 2.0
Qt_Connect_Signal(aceptarB ,QT_EVE_CLICKED, {|| aExit := .T. ,winD:accept() })
Qt_Connect_Signal(cancelarB,QT_EVE_CLICKED, {|| cExit := .T. ,winD:reject() })
*/
/*
version 3.0
*/
aceptarB : connect (QT_EVE_CLICKED, {|| aExit := .T. ,winD:accept() })
cancelarB : connect (,QT_EVE_CLICKED, {|| cExit := .T. ,winD:reject() })
WinD : exec()
if (cExit)
elegido_ := "CANCELAR"
else
salida_ := trim( GG : text())
endif
RETURN {WinD,salida_,elegido_}
aunque es un poco largo , es realmente sencillo, crea una Widget tipo
dialogo en winD
luego crea una capas (layout)
1. Para mostrar el texto que inforam que se espera que el usuario
entre en el capmo de ingreso de datos
2. Una capa con un QEdit para recibir la informacion del usario desde
el teclado
3. Una cada compuesta por dos botones (Aceptar - Cancelar) a los
cuales les asocio dos eventos.
Cancelar termina el dialogo sin hacer nada.
Aceptar rescata el valor cntenido en Qedit que eventualmente el
usario ingreso con un sencillo OBJ : TEXT()
Se debe observarse que solo defino el evento clicked() , para todo el
manejo de la función, no asocio GG (Qedit) a ningun evento.
Un algoritmo mas complidado en el sentido mas instrucciones me permite
manejar el Qcombobox, QlistView, QLabel, QDate etc.
Pero siempre sobre el mismo esquema.
Una sola senal ativa y una de canelacion para todo todos los objetos
dentro del Qdialog.
La funcion devuelve
1. El objeto que se creo en winD
2. El valor recuperado del QEdit
4. Elegido donde almacena si la funcion rescato algun valor o
simplemente el proceso fue cancelado en este caso contiene a :
elegido:= "CANCELAR"
uan ejemplo de uso la funcion anterior seria
----------------------------------------------------------------------
#include "hbqt.ch"
#include "common.ch"
STATIC qApp
REQUEST HB_QT
INIT PROCEDURE Qt_Start()
qApp := QApplication():new()
RETURN
EXIT PROCEDURE Qt_End()
qApp:quit()
RETURN
FUNCTION MAIN()
textoTmp := "Entre el nombre de una cancion"
variable := "Yo me llamo cumbia"
SOS := GetSosK(textoTmp,variableTmp)
/*
La forma de arreglo de SOS[] esta dada porque la funcion
regresa un vector de 3 posiciones {objeto,variable,estado}
msgInfo
*/
oMB :=QMessageBox():new()
if SOS[3] == "CANCELAR" //estados ACEPTAR - CANCELAR
oMB : setInformativeText("Funcion Cancelada")
oMB : seticon(1)
else
oMB : setInformativeText("La cancion entrada fue" + "
" + SOS[2])
oMB : seticon(2)
endif
RETURN NIL
-----------------------------------------------------------------
(Todo esta información esta relacionada con la version 2.0),
la teoría general se conserva , pero la implementacion cambio
el modelo de eventos cambio en la versión 3.0
por ejemplo:
Qt_Connect_Signal(cancelarB,QT_EVE_CLICKED, {|| cExit := .T. ,winD:reject() })
quedó
cancelarB : connect (QT_EVE_CLICKED, {|| cExit := .T. ,winD:reject() })
No si si para todos los desarrolladores que empezamos con Qt, nos
pasa lo mismo , pero para mi una de las dificultades mas grandes ha
sido encontrar las senales adecuadas a los objetos que deseo utilizar y
desde luego los SLOTS, que usa uno y otro objeto.
De manera un poco burda me explico a mi mismo lo siquiente.
Un objeto tiene un contenido al momento de invocarlo o porque se le dio
el valor inicial o porque lo tiene por defecto, por decir algo colocar
un valor cualquiera a un objeto con OBJ:SETVALUE(param)..
Saber cual es el valor que el objeto contiiene deberia ser sencillo pero
a veces no los es tanto., pero si me siguen en el ejemplo podria ser
algo como OBJ : VALUE()
Por claridad para mi, decidi no utilizar parentesis en las propiedades
de los objetos por eso digo OBJ : VALUE y no OBJ:VALUE() de momento
me estan funcionado igual , la literatura y los manuales que
he consultado usan de forma indistinta ambas nomenclaturas, dentro
de mi razonamiento prefiero usar las propiedades sin parenteseis por
ser estan un contenido VALOR de un OBJETO y no una funcion ni
procedimiento. (recuerdo que esto es para mi claridad)
13/09/2010
Como decia el dia de ayer saber cual es la señal asociada a un objeto
no ha sido nada facil y menos la forma como opera.
una veces tienen argumento, otras sin argumento, con dos argumentos
que son llamadas a tipo de objetos.
El enrrededo es de la madona para saber cuando y como lanzar una
senal.
Entonces simplifique la cosa para mi, no me gustan las cosas complejas
máxime que mas tarde me tocas modificarlas o cambiarlas por convencion
asocie lo siguiente
1. Un objeto tiene propiedades que contiene valores que a mi me sirven
para efectuar operaciones en Harbour. como mencione arriba del tipo
OBJ:VALUE o a los cuales les asigno valores por ejemplo OBJ : SETVALUE
2. A un objeto le pudo conectar una senal, para que envie un evento
cuando la condición del evento se ve satisfecha
version 2.0
Qt_Connect_Signal( OBJ, "clicked()", ....
version 3.0
OBJ: connect("clicke()"..
Ojo: encontré que las senales en Harbour son sencibles a las
mayúsculas y minusulas no funciona CLICKED() por ejemplo.
3. A el objeto se le asocia un SLOT , que aunque burdo como lo dije
anteriormente y es para mi entendimiento , no es mas que las accion
que quiero que la señal haga cuando el evento se cumpla:
Qt_Connect_Signal( OBJ, "clicked()", {|| elegido_ := OBJ: VALUE } )
En el ejemplo :
el Block :: {|| elegido_ := OBJ: VALUE() }
simplemente le asigna a la variable elegido_ el contenido del valor
de OBJ
la cual puedo manipular libremente, desde luego tambien puede haber
invocado una funcion o procedimiento de la siguiente forma
version 2.0
Qt_Connect_Signal( OBJ, "clicked()", {|i| myFuncion(i) } )
version 3.0
OBJ : connect( OBJ, "clicked()", {|i| myFuncion(i) } )
donde en el bloque recibo el valor de i y se lo paso como parametro
a mi función.
4 Para mantener la cosas sencillas en mi aplicacion decide no
depender de un evento especifico para tal o cual objeto sino que
cree un metodo mediante encapsulo el uso de una OBJ particular en
un DIALOG o en MAINWINDOW, pero con un par de botones de
Aceptar y Cancelar, que son los disparadores de la accion, como
dije antes , el contenido del objeto no depende en ningun caso de
el mecanismo de disparo del evento , el evento solo nos da la accion
a ejecutar una vez se produzca entonces un codigo de la lo
que hice se reduce a
/*----------------------------------------------------------------------*/
FUNCTION GetSosK(textoTmp,variableTmp)
// Retorna 3 parametros : RETURN {param1,param2,param3}
// param1 :: el Objeto winD
// param2 :: el valor de la variable capturada
// param3 :: si el valor fue aceptado/cancelado
#define QT_EVE_CLICKED "clicked()"
LOCAL S1,GG
LOCAL winD, layoP, layoD, layoB
LOCAL aceptarB, cancelarB
LOCAL aExit := .T.
LOCAL cExit := .F.
LOCAL elegido_ := "ACEPTAR"
LOCAL salida_
layoP := QVBoxLayout():new()
layoD := QHBoxLayout():new()
layoB := QHBoxLayout():new()
winD := QDialog():new()
winD : setWindowTitle(textoTmp)
winD : setStyleSheet(cssK(CSS_GET))
S1 := QLabel():new()
SI : setText(textoTmp)
GG := QEdit() :new()
GG : variableTmp
aceptarB := QPushButton():new()
aceptarB : setText("&" + Tr("Aceptar"))
aceptarB : setStyleSheet(cssK(CSS_GET))
aceptarB : setDefault(.T.)
cancelarB := QPushButton():new()
cancelarB : setText("&" + Tr("Cancelar"))
cancelarB : setStyleSheet(cssK(CSS_GET))
layoD : addWidget(S1)
layoD : addWidget(GG)
layoD : sizeConstraint(1)
layoB : addWidget(aceptarB)
layoB : addWidget(cancelarB)
layoP : addLayout(layoD)
layoP : addStretch()
layoP : addLayout(LayoB)
winD : setLayout(layoP)
/*
version 2.0
Qt_Connect_Signal(aceptarB ,QT_EVE_CLICKED, {|| aExit := .T. ,winD:accept() })
Qt_Connect_Signal(cancelarB,QT_EVE_CLICKED, {|| cExit := .T. ,winD:reject() })
*/
/*
version 3.0
*/
aceptarB : connect (QT_EVE_CLICKED, {|| aExit := .T. ,winD:accept() })
cancelarB : connect (,QT_EVE_CLICKED, {|| cExit := .T. ,winD:reject() })
WinD : exec()
if (cExit)
elegido_ := "CANCELAR"
else
salida_ := trim( GG : text())
endif
RETURN {WinD,salida_,elegido_}
aunque es un poco largo , es realmente sencillo, crea una Widget tipo
dialogo en winD
luego crea una capas (layout)
1. Para mostrar el texto que inforam que se espera que el usuario
entre en el capmo de ingreso de datos
2. Una capa con un QEdit para recibir la informacion del usario desde
el teclado
3. Una cada compuesta por dos botones (Aceptar - Cancelar) a los
cuales les asocio dos eventos.
Cancelar termina el dialogo sin hacer nada.
Aceptar rescata el valor cntenido en Qedit que eventualmente el
usario ingreso con un sencillo OBJ : TEXT()
Se debe observarse que solo defino el evento clicked() , para todo el
manejo de la función, no asocio GG (Qedit) a ningun evento.
Un algoritmo mas complidado en el sentido mas instrucciones me permite
manejar el Qcombobox, QlistView, QLabel, QDate etc.
Pero siempre sobre el mismo esquema.
Una sola senal ativa y una de canelacion para todo todos los objetos
dentro del Qdialog.
La funcion devuelve
1. El objeto que se creo en winD
2. El valor recuperado del QEdit
4. Elegido donde almacena si la funcion rescato algun valor o
simplemente el proceso fue cancelado en este caso contiene a :
elegido:= "CANCELAR"
uan ejemplo de uso la funcion anterior seria
----------------------------------------------------------------------
#include "hbqt.ch"
#include "common.ch"
STATIC qApp
REQUEST HB_QT
INIT PROCEDURE Qt_Start()
qApp := QApplication():new()
RETURN
EXIT PROCEDURE Qt_End()
qApp:quit()
RETURN
FUNCTION MAIN()
textoTmp := "Entre el nombre de una cancion"
variable := "Yo me llamo cumbia"
SOS := GetSosK(textoTmp,variableTmp)
/*
La forma de arreglo de SOS[] esta dada porque la funcion
regresa un vector de 3 posiciones {objeto,variable,estado}
msgInfo
*/
oMB :=QMessageBox():new()
if SOS[3] == "CANCELAR" //estados ACEPTAR - CANCELAR
oMB : setInformativeText("Funcion Cancelada")
oMB : seticon(1)
else
oMB : setInformativeText("La cancion entrada fue" + "
" + SOS[2])
oMB : seticon(2)
endif
RETURN NIL
-----------------------------------------------------------------
Comentarios
Publicar un comentario