SVG , png , gif , ico Haebour Qt

18/08/2010

Hice algunos ensayos con imagenes SVG, tanto como fondo par QLabel,
como iconos, el rendimiento y la presentacion fueron exelentes.

Aunque no de que interes pueda ser para los desarrolladores el
siguiente tema, quieero compartirlo , pues me ha facilidado mucho el
desarrollo, sobre todo, por aquello en tema de gustos no hay disgutos
y los los usuarios son muy complicados en cuanto a tonos, colores y
findos, por esta razon, decidie que en el programa no hay inscria
ninguan imagen , ni ningun color especifico , y le doy al usuario
la libertado de escojer los temas (skin) de su gusto.

Para tal efecto cree un directorio dentro del directorio principal
al cual denomine ../imagenes
en el cree unos directorios llados k00, k01, k02... en los cuales
guardo las imagenes de fondo, iconos de los menu, y sobre todo un
archivo tipo xml , las configuracines del escrito del usuario.

dicho archivo lo llame css.xml y luce asi:
----------------------------------------------------------------




menuBarK()




PanelK(Ownd,Y(17),X(03),Y(01),)




font : bold 12px;
background-color : #c7c8e1 ;
color : blue ;
selection-color : #c7c8e1 ;
selection-background-color: blue




font : bold 14px;
background-color : blue ;
color : yellow ;
selection-color : blue ;
selection-background-color: yellow




font : bold 12px;
background-color : #c7c8e1 ;
color : blue ;
selection-color : #c7c8e1 ;
selection-background-color: blue




font : bold 10px;
background-color : #c7c8e1 ;
color : blue ;
selection-color : #c7c8e1 ;
selection-background-color: blue




font : bold 12px;
background-color : blue ;
color : yellow ;
selection-color : blue;
selection-background-color: yellow




font : bold 10px;
background-color : white ;
color : black ;
selection-color : blue ;
selection-background-color: yellow




font : bold 10px;
background-color : #aabbe4 ;
color : black ;
selection-color : blue ;
selection-background-color: yellow




font : bold 14px;
background-color : blue ;
color : yellow ;
selection-color : blue ;
selection-background-color: yellow




font : bold 12px;
background-color : #c7c8e1 ;
color : blue ;
selection-color : #c7c8e1 ;
selection-background-color: blue




font : bold 14px;
background-color : blue ;
color : yellow ;
selection-color : blue ;
selection-background-color: yellow




font : bold 12px;
background-color : #c7c8e1 ;
color : blue ;
selection-color : #c7c8e1 ;
selection-background-color: blue




font : bold 12px;
background-color : #c7c8e1 ;
color : blue ;
selection-color : blue ;
selection-background-color: #aaaaff ;




font : bold 12px;
background-color : #c7c8e1 ;
color : blue ;
selection-color : #c7c8e1 ;
selection-background-color: blue




font : bold 12px;
background-color : #c7c8e1 ;
color : blue ;
selection-color : #c7c8e1 ;
selection-background-color: blue



-----------------------------------------------------------
MI intension era usar el TXmlDocument, para el manejador
de informacion XML, pero sucede que aun en Harbour no se
encuentra , pero si en XHarbour. como recordaran por
motivos del uso de Qt, y que esta no estaba funciando en
Xharbour, deci usar harbour, ahora lo que no hazy es XML,
Despues de probar algunas rutinas externas (contrib) y
adapatar algunas de java, decidi que no me convencia el
remiendo y mas bien deci hacer una programa sencillo ,
minimalista de un lector de archivos tipo text, que me leyera
el archivo , tal como lo tengo mensando que el futuro
harbour use XML , de forma estandar.

/*----------------------------------------------------------------------*/

FUNCTION LeerCss( archivoCss)

/*
Esta rutina implementa la lectura de los parametros de
configuracion de la interface grafica de Ksos, en un
archivo /imagenes/k##/css.xml , es una version muy simplista en espera
de el uso de TXmlDocument para el manejo de informacion XML ,
aun no implementada en Harbour
Exporta la configuracion de los parametros en aCss
*/

LOCAL longLinea := 80
LOCAL longTab := 8
LOCAL cadena := ""
LOCAL aCss := {}

arch := chr(34) + archivoCss + chr(34)
if .not. (file(&arch))
@ 00,00 say archivoCss + " No existe"
wait
quit
endif

cText := memoRead(archivoCss)
iMax := MLCount(cText,longLinea,1,longTab,.T.)
for i:=1 to iMax
cLine := trim(MemoLine(cText,longLinea,i,longTab,.T.))

do case
case at("xml",cline) <> 0
* Protocolo de inicio/final del archivo XML
case len(cline) <= 2 * linea sin informacion o vacia case at("CSS",cline) <> 0
* Definiciones parametros
case at("",cLine) <> 0
cadena :=""
case at("",cLine) <> 0
aadd(aCss,cadena)
otherwise
cadena := cadena + cline
endcase
next

return aCss

----------------------------------------------------------------

En general hace caso omiso de las etiquetas y solo se centra
en dos tipos de etiqueta y ,
ya se que es muy limitada pero me saca del paso.
Lo unuico que hace es que lee todo el archivo de texto y
lo almacena cText, y a partir de alli, hago un analisis de
etiquetas desechando casi todo, y lamacenando solo lo que
esta entre estas dos etiquetas y abusando de la regida estructura
que propongo, me limito a leer en forma decendente los parametros
y creo un arraglo de parametros los cuales mas tarde uso
calificando el arreglo aCss.
A continuacion la rutina que cualifica los parametros

/*----------------------------------------------------------------------*/
FUNCTION QtParamK(parametro)

/*
Parametro en mi caso permite elegir en dos tipos de escritorios
que manejo, uno para el ingreso al sistema (CLAVE_BACK) y el
otro el administrativo (BACKGROUND)

*/
public XMAXIMA_ := 1024
public YMAXIMA_ := 768
public XBASE_ := 80 //(mantiene la relacion 80/25)
public YBASE_ := 25

public MSG_NOICON := 0
public MSG_INFORMATIVO := 1
public MSG_WARNING := 2
public MSG_CRITICO := 3
public MSG_PREGUNTA := 4

public CSS_TIPOMENU := 1
public CSS_COORD_PANEL := 2
public CSS_PANEL := 3
public CSS_SAY := 4
public CSS_GET := 5
public CSS_MENUBAR := 6
public CSS_MENU := 7
public CSS_TOOLBAR := 8
public CSS_MSGINFO := 9
public CSS_STATUSBAR := 10
public CSS_PASSWD := 11
public CSS_READ := 12
public CSS_SINO := 13
public CSS_COMBOBOX := 14
public CSS_SPIN := 15
public CSS_PROGRESSBAR := 16

public SI := "Si"
public NO := "No"
public ACEPTAR := "Aceptar"
public CANCELAR := "Cancelar"

public CSS_K

if (parametro == CLAVE_BACK) // Parametros de ingreso al sistema :: clave
// en kin estan las imagenes iniiales y la configuracin base
// del look de inicio de ksos
CSS_K := leerCss(pathI + "kin" + slash + "css.xml")
else
// look es un directorio de /imagenes donde esta las imagenes
// y el archivo de configuracion de presentacion de ksos
CSS_K := leerCss(pathI + look + slash + "css.xml")
endif

return NIL
-----------------------------------------------------------------

creo una sencilla rutina que vincula el programa de lectura de
parametros cualificacion de parametros :

/*----------------------------------------------------------------------*/
FUNCTION cssK(tipo)

LOCAL parametros

/*
Definicion de los distintos tipos de CSS
ver /imagenes/kin/css.xml para las definiciones.
Segun se definio en QtParamK(parametro)

CSS_TIPOMENU := 1 CSS_COORD_PANEL := 2
CSS_PANEL := 3 CSS_SAY := 4
CSS_GET := 5 CSS_MENUBAR := 6
CSS_MENU := 7 CSS_TOOLBAR := 8
CSS_MSGINFO := 9 CSS_STATUSBAR := 10
CSS_PASSWD := 11 CSS_READ := 12
CSS_SINO := 13 CSS_COMBOBOX := 14
CSS_SPIN := 15 CSS_PROGRESSBAR := 16

*/

parametros := CSS_K[tipo]

return (parametros)

------------------------------------------------------------------------

En ejemplo de uso de este sencillo modelo de parametrizacion
que flexibiliza la configuracion por parte del usuario seria.

/*----------------------------------------------------------------------*/
FUNCTION SayK( ksosObj, yPos, xPos, textTmp, altoTmp , anchoTmp )

LOCAL sLabel
LOCAL PLAINTEXT := 0
LOCAL RICHTEXT := 1
LOCAL AUTOFORMAT := 2

// En general CLAVE_BACK BACKGROUND y QtParam() los defino
// al inicio de la aplicacion, para efectos de la expliacion
// quedan definidos en este punto.

LOCAL CLAVE_BACK := 0
LOCAL BACKGROUND := 1

QtParam(BACKGROUND)

sLabel :=QLabel():new( ksosObj )
sLabel : setTextFormat( AUTOFORMAT )
sLabel : setText( textTmp )
slabel : setStyleSheet(cssK(CSS_SAY))
slabel : setLineWidth(3)

if (xPos <> NIL .and. yPos <> NIL)
sLabel : move(xPos , yPos)
endif
if (altoTmp <> NIL .and. anchoTmp <> NIL)
sLabel : reSize( anchoTmp, altoTmp )
endif

sLabel : Show()

return sLabel

------------------------------------------------------------------
Notese que en la linea :

slabel : setStyleSheet(cssK(CSS_SAY))

Se le pasa la parametrizacion de colores tamaño y tipo de fondo al
label.


En otro frente , siempre esta el famos problema de la creacion
de menu y de actualizarlos de forma simple, y meterle mani al
programa no deja de ser un problema, ademas de engorroso,
la configuracion , lo largo que es le codigo, ademas de el manejo
de items, colores, fndos y demas.

Para tal efecto he creado desde hace mucho tiempo un gnerador de
menu automatico, al cual solamnte le doy una entada en una base
de datos estructurada para tal efecto, el titulo que debe aparecer
y la funcion a ejecutar el listo, sin tocar el programa de menu
para nada.

Con el uso de Qt, debia hacer lo mismo, ya lo he hecho para Java y
C++ y otros lenguiajes entonces aborde el problema aqui inserto
como quedo.

---------------------------------------------------------
*****************************************************************************
* Menu Principal del Sistema *
* *
*Medellin 10 de Agosto de 2010 *
*Carlos Arturo Castano *
*****************************************************************************

FUNCTION MenuBarK(ksosObj)

#define QT_EVE_TRIGGERED_B "triggered(bool)"

select 11
use &Dir_Menu alias MENU_
goto top
count to lM1_ for len(trim(MENU_ -> MENU_))/2 = 1
count to lM2_ for len(trim(MENU_ -> MENU_))/2 = 2
count to lM3_ for len(trim(MENU_ -> MENU_))/2 = 3
count to lM4_ for len(trim(MENU_ -> MENU_))/2 = 4

public qM1[lM1_]
public qM2[lM2_]
public qM3[lM3_]
public qM4[lM4_]

private menuRow1 := {}
private menuRow2 := {}
private menuRow3 := {}
private menuRow4 := {}

oMenuBar := QMenuBar():new()
oMenuBar : resize(ksosObj:width(), 25 )
oMenuBar : setStyleSheet(cssK(CSS_MENUBAR))

CargarMenu()
AsignarMenu()
AdicionarMenu()

ksosObj :setMenuBar( oMenuBar )

close databases

return oMenuBar

//----------------------------------------------------------------------------
FUNCTION quitK()

LOCAL SiNo_

SINo_ := "No"
SINO_ := SiNoK(Tr("Desea Salir"),1)
if SINo_ = NO
return NIL
endif

SINO_ := NIL
do BorraInd
close all
erase &Disp_Sal && Borra Buffer de Impresion si existe

quit

return NIL

//-----------------------------------------------------------------------------
FUNCTION CargarMenu()

// Carga el menu en un 4 arreglos de niveles memuRow1..menuRow4

LOCAL nivel:=0 , i:= 0 , j:= 0 , k:=0 , l:=0

select MENU_
goto top
do while .not. eof()

nivel := len(trim(MENU_ -> MENU_))/2
if (nivel > 4)
skip
loop
endif

menuRow := "menuRow" + ltrim(str(nivel,1))
aadd(&menuRow,RECNO())

if nivel = 1 ; i++ ; endif
if nivel = 2 ; j++ ; endif
if nivel = 3 ; k++ ; endif
if nivel = 4 ; l++ ; endif

select MENU_
store rlock() to verror
replace NIVEL_ with nivel
replace SUBMENU_1 with i
replace SUBMENU_2 with j
replace SUBMENU_3 with k
replace SUBMENU_4 with l
unlock

select MENU_
skip
enddo

return NIL

//-----------------------------------------------------------------------------
FUNCTION AgregarMenu(nivel,menuRow,qMa,qMb)

LOCAL regSos, nivela, nivelb, na, nb

nivela := nivel
nivelb := nivel + 1

for items := 1 to len(menuRow)

regSos := menuRow[items]

select MENU_
goto regSos

na := &("MENU_ -> SUBMENU_" + str(nivela,1))
nb := &("MENU_ -> SUBMENU_" + str(nivelb,1))

if (at("menu_sys",MENU_-> PROGRAMA_) <> 0)
qMa[na] : addMenu(qMb[nb])
endif

next

return NIL

//-----------------------------------------------------------------------------
FUNCTION AdicionarMenu()

LOCAL regSos , n

AgregarMenu(3,menuRow4,qM3,qM4)
AgregarMenu(2,menuRow3,qM2,qM3)
AgregarMenu(1,menuRow2,qM1,qM2)

for items := 1 to len(menuRow1)

regSos := menuRow1[items]

select MENU_
goto regSos

row := menuRow1[items]
n := MENU_ -> SUBMENU_1

if (at("menu_sys",MENU_-> PROGRAMA_) <> 0)
oMenuBar : addMenu(qM1[n])
endif

next

return NIL

//-----------------------------------------------------------------------------
FUNCTION ArmarMenu(nivel,menuRow,qM,qB)

LOCAL regSos, n, nombre, programa, parametro, tipoMenu, icono

#define QT_EVE_CLICKED "clicked()"
#define QT_EVE_TRIGGERED "triggered()"
#define QT_EVE_TRIGGERED_B "triggered(bool)"

for items := 1 to len(menuRow)

regSos := menuRow[items]

select MENU_
goto regSos

n := &("MENU_ -> SUBMENU_" + str(nivel,1))
nombre := trim(MENU_ -> NOMBRE_)
programa := trim(MENU_ -> PROGRAMA_)
parametro:= trim(MENU_ -> PARAMETRO_)
icono := trim(MENU_ -> ICONO_)

if (at("menu_sys",MENU_-> PROGRAMA_) <> 0)

qM[n] := QMenu():new()
qM[n] : setTitle( Tr( nombre ))
qM[n] : setStyleSheet(cssK(CSS_MENU))
if len(icono) <> 0
qM[n] : setIcon( pathI + icono )
endif
else

me := trim(MENU_ -> MENU_)
lm := len(me)
if (lm - 2) >= 1
me := substr(MENU_ -> MENU_,1,(lm-2))
else
loop
endif
locate for trim(MENU_-> MENU_) = me

n := &("MENU_ -> SUBMENU_" + str(nivel-1,1))

if len(icono) = 0
Qt_Connect_Signal( qB[n]:addAction( Tr(nombre)),;
QT_EVE_TRIGGERED_B, {|| &programa })
else
Qt_Connect_Signal( qB[n]:addAction_1(pathI + icono,Tr(nombre)),;
QT_EVE_TRIGGERED_B, {|| &programa })
endif
endif

next

return NIL

//-----------------------------------------------------------------------------
FUNCTION AsignarMenu()

LOCAL row[10]

ArmarMenu(1,menuRow1,qM1,qM1)
ArmarMenu(2,menuRow2,qM2,qM1)
ArmarMenu(3,menuRow3,qM3,qM2)
ArmarMenu(4,menuRow4,qM4,qM3)

return NIL

---------------------------------------------------------------
Lo mas importante la tabla de bases de datos donde almaceno
la informacion, en un principio pense hacerla tipo XML, pero
la cosa se complico por como dije anterioremetne HARBOUR no tiene
el administrador de proesos XML , y ademas por alguna razon que
desconozco y a la ual no puede encontrarle sentido el uso
de arreglos de arreglos no me funciono.
algo como

public aCac[{,,,,},{,,,]]

se define bien, cuarda los valores que uno desea pero luego
al tratar de accesarlo , muestra errores o valores incorrecotos
utilice la funcion aadd() para poblar el arreglo de forma
automatica, por asignacion explicita

aCac[{1,0,0,0],{"Principal","hacer()",}]
aCac[{1,0,0,0],{"actualizar""actual()",}]

No marca error , pero puede accesar el arreglo, por tal razon
me decidi al uso de una base datos estandar de Xbase, MENU_
Tal tabla tiene los campos:

MENU_,C,15
DESCRIPCIO_,C,50
NOMBRE_,C,50,
PROGRAMA_,C,50
PARAMETRO_,C,50
ICONO_,C,50
SUBMENU_1,N,10,2
SUBMENU_2,N,10,2
SUBMENU_3,N,10,2
SUBMENU_4,N,10,2

la tabla luce algo como lo siguiente

MENU_ DESCRICIO_ NOMBRE_ PROGRAMA_ PARAMETRO_ ICONO_
01 Sistema Ppl Sistema MENU
0101 Cuentas Ppl Cuentas MENU
0101 Crear Cuentas Crear crearC() ../imagenes/crear.gif
0102 Modificar Cta Modifica modifica() ../imagenes/modif.gif

La idea es crear una estructura de arbol del menu,
cuando se enuncia que PROGRAMA, es tipo MENU, significa que
el proeso debe crear un nuevo menu, y que este debe ser poblado
con los MENU_ITEM proporcionados por:

Qt_Connect_Signal( qB[n]:addAction( Tr(nombre)),;
QT_EVE_TRIGGERED_B, {|| &programa })

el cual define la accion , con su lanzador de evento y nombre (&nombre)
funcion() a ejecutar contenida en &programa.

Aprovechando que ya la tabla quedo creada le asigne un campo adicional
TOOL_BOX

MENU_,C,15
TOOLBOX,C,2
DESCRIPCIO_,C,50
NOMBRE_,C,50,
PROGRAMA_,C,50
PARAMETRO_,C,50
ICONO_,C,50
SUBMENU_1,N,10,2
SUBMENU_2,N,10,2
SUBMENU_3,N,10,2
SUBMENU_4,N,10,2

la idea es que como ya esta todo defindo basta colocar en
la estructura , si quiero que una funcion particulara del
menu sea mostrada en la barra de herramioentas y para tal efecto
defini . T1,T2,T3,T4 , las cuales son las barras de herramientas
de LEFT,RIGHT;TOP y BUTTOM , que el menuBar proporciona

MENU_ TOOL_BAR DESCRICIO_ NOMBRE_ PROGRAMA_ _
01 Sistema Ppl Sistema MENU
0101 T1 Cuentas Ppl Cuentas MENU
0101 T1 Crear Cuentas Crear crearC()
0102 T2 Modificar Cta Modifica modifica()

El resto de la tabla queda igual, solo coloco lo que es importante
se me olvidaba las columans SUBMENU#, las llena el sistema de
forma automatica , no hay que preocuparse por ellas, de forma manual
sin embarog es vital que existan ya que todo el algoritmo se base
en el correcto calculo de estos campos.
OJO: Es vital que la estructura tenga un orden riguroso sino
resultados imprevisto puden ocurrir.
Esta version usa solamente cuatro nivels de menu , se pueden
ampliar sencillamente, solo que yo pienso que con mas de estos
la informacion queda muy uculta y de dificil acceso para el usuario


/
******************************************************************
Creacion de Barra de Herramientas

Carlos Arturo Castaño G.
13/08/2010

******************************************************************
*/

FUNCTION ToolBarK(ksosObj)

#define QT_EVE_TRIGGERED_B "triggered(bool)"

LOCAL TOP := 0x4, LEFT:= 0x1, RIGHT := 0x2, BUTTOM := 0x8
LOCAL oTB1, oTB2, oTB3, oTB4
LOCAL lT1 , lT2, lT3, lT4
LOCAL items, programa, nombre, descripcion, icono

select 11
use &Dir_Menu alias MENU_

// *** Primera Barra de Herramientas ***

select MENU_
set filter to trim(MENU_ -> TOOL_) = "T1"
goto top
if .not. eof()
count to lT1 for trim(MENU_ -> TOOL_) = "T1"
goto top
public qTool1[lT1]
oTB1 := QToolBar():new(ksosObj)
oTB1 : setStyleSheet(cssK(CSS_TOOLBAR))
ls := len(trim(MENU_ -> MENU_)) - 2
separador := substr(trim(MENU_ -> MENU_),1,ls)

for items := 1 to lT1

if ( separador <> substr(trim(MENU_ -> MENU_),1,ls))
ls := len(trim(MENU_ -> MENU_)) - 2
separador := substr(trim(MENU_ -> MENU_),1,ls)
oTB1 : addSeparator()
endif

programa := trim(MENU_ -> PROGRAMA_)
nombre := trim(MENU_ -> NOMBRE_)
descripcion := trim(MENU_ -> DESCRIPCI_)
icono := trim(MENU_ -> ICONO_)

qTool1[items] := QAction():new( ksosObj )
qTool1[items] : setText( Tr(nombre) )
qTool1[items] : setIcon( pathI + icono )
qTool1[items] : setToolTip( Tr(descripcion) )

Qt_Connect_Signal( qTool1[items], QT_EVE_TRIGGERED_B, ;
{|| &programa } )

oTB1:addAction( qTool1[items] )

select MENU_
skip

next
ksosObj:addToolBar(TOP,oTB1 )
endif
oTB1 : addSeparator()


// *** Segunda Barra de Herramientas ***

select MENU_
set filter to trim(MENU_ -> TOOL_) = "T2"
goto top
if .not. eof()
count to lT2 for trim(MENU_ -> TOOL_) = "T2"
goto top
public qTool2[lT2]
oTB2 := QToolBar():new(ksosObj)
oTB2 : setStyleSheet(cssK(CSS_TOOLBAR))

for items := 1 to lT2

programa := trim(MENU_ -> PROGRAMA_)
nombre := trim(MENU_ -> NOMBRE_)
descripcion := trim(MENU_ -> DESCRIPCI_)
icono := trim(MENU_ -> ICONO_)

qTool2[items] := QAction():new( ksosObj )
qTool2[items] : setText( Tr(nombre) )
qTool2[items] : setIcon( pathI + icono )
qTool2[items] : setToolTip( Tr(descripcion) )

Qt_Connect_Signal( qTool2[items], QT_EVE_TRIGGERED_B, ;
{|| &programa } )

oTB2:addAction( qTool2[items] )

select MENU_
skip
next
ksosObj:addToolBar(LEFT, oTB2 )
endif

// *** Tercera Barra de Herramientas ***

select MENU_
set filter to trim(MENU_ -> TOOL_) = "T3"
goto top
if .not. eof()
count to lT3 for trim(MENU_ -> TOOL_) = "T3"
goto top
public qTool3[lT3]
oTB3 := QToolBar():new(ksosObj)
oTB3 : setStyleSheet(cssK(CSS_TOOLBAR))

for items := 1 to lT3

programa := trim(MENU_ -> PROGRAMA_)
nombre := trim(MENU_ -> NOMBRE_)
descripcion := trim(MENU_ -> DESCRIPCI_)
icono := trim(MENU_ -> ICONO_)

qTool3[items] := QAction():new( ksosObj )
qTool3[items] : setText( Tr(nombre) )
qTool3[items] : setIcon( pathI + icono )
qTool3[items] : setToolTip( Tr(descripcion) )

Qt_Connect_Signal( qTool3[items], QT_EVE_TRIGGERED_B, ;
{|| &programa } )

oTB3:addAction( qTool3[items] )

select MENU_
skip
next
ksosObj:addToolBar(RIGHT, oTB3 )
endif

// *** Cuarta Barra de Herramientas ***

select MENU_
set filter to trim(MENU_ -> TOOL_) = "T4"
goto top

if .not. eof()
count to lT4 for trim(MENU_ -> TOOL_) = "T4"
goto top
public qTool4[lT4]
oTB4 := QToolBar():new(ksosObj)
oTB4 : setStyleSheet(cssK(CSS_TOOLBAR))
for items := 1 to lT4

programa := trim(MENU_ -> PROGRAMA_)
nombre := trim(MENU_ -> NOMBRE_)
descripcion := trim(MENU_ -> DESCRIPCI_)
icono := trim(MENU_ -> ICONO_)

qTool4[items] := QAction():new( ksosObj )
qTool4[items] : setText( Tr(nombre) )
qTool4[items] : setIcon( pathI + icono )
qTool4[items] : setToolTip( Tr(descripcion) )

Qt_Connect_Signal( qTool4[items], QT_EVE_TRIGGERED_B, ;
{|| &programa } )

oTB4:addAction( qTool4[items] )

select MENU_
skip

next
ksosObj:addToolBar(TOP, oTB4 )
endif

return { oTB1 , oTB2, oTB3, oTB4 }


------------------------------------------------------------------

Quiero llmar la atencion del lector , sobre el archivo
css.xml en las dos primeras etiquetas , operativas .
y
en ellas esta la definicon de dos puntos de entrada del escritorio
de usario, y llama a un panel de informacion y al menu del sistema
al estar definidos alli, hace que sea muy facil y felxible la
configuracion de la entrada al menu del escritorio de usario, pudiendo
alli definir la forma del menu, pudiendo denir alli un menuBar ,
menuTree o cualquier tipo de menu que se nos ocurra , sin que la
aplicacion, necesie ningun cambio de echo, distiintos usuarios pueden
tener distitnos menu definidos.

el siguiente trozo de codigo nos muestra la forma en que implemente
esta usabilidad.

****************************************************************

#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()

set talk off
set exclusive off

public oWnd, path1, dirR

HbQt_Set_Release_Method( HBQT_RELEASE_WITH_DELETE )
oWnd := QMainWindow():new()
oWnd : showMaximized()
oWnd : setMouseTracking( .T. )
oWnd : setWindowTitle( Tr("Konta- Contabilidad -"))

select 10
use &cnf_cvrA alias CNF_CVR
dirR := trim(DIRECTOR)
if len(dirR) = 0
MsgInfo(Tr("Directorio de informacion no existe"),MSG_CRITICO)
quit
else
path1 := DirR
endif

set path to &path1

Entorno()
Empresa()

QtParamK(CLAVE_BACK)
LogoK(CLAVE_BACK)
Claves()
QtParamK(BACKGROUND)
LogoK(BACKGROUND)

Pago_Imp()
StartK()
CreaInd()



Inicio("I")

//En PSOS_ se carga una funcion del tipo
Panelk(oWnd,Y(17),X(03),Y(01),)
//Esto lo hago asi para poder definir desde ../imagenes/k##/css.xml
//el punto donde el panel se va a presentar, ya que el diseñador
//del escritorio no saba a priori si el panel ocupara un punto
//destacado de la imagen de fondo
//de forma analago en M_SOS_ defino una funcion MenuBarK(Ownd)
//lo cual le da a la aplicacion mucha libertad para definir el
//tipo de menu que se desea presentar

PSOS_:= ltrim(cssK(CSS_COORD_PANEL))
MSOS_:= ltrim(cssK(CSS_TIPOMENU))

PANE_:= &PSOS_
MB_ := &MSOS_
TB_ := ToolBarK(Ownd)

qApp:exec()

close database
release all

quit
return NIL

******************************************************************

Comentarios

Entradas populares