qfiledialog harbour

06/10/2010

durante este periodo he intentado poner a funcionar la rutina de
Qt, QfileDialog.
Supuestamente esta debe permitir que un usuario seleccione un archivo
del sistema de carpetas del sistema operativo del usuario para ser
usado tanto para ser abiertocomo para salvar o guardar informacion en
ella.

El uso de la funcion como se encuentra en las notas de aplicacion no
aplica en el uso HARBOUR , esto debe principalmente a que en la
mayoria de los casos que se enuentran en estas notas de aplicacion
usan un llamado a funciones nativas del sistema operativa con funciones
como : GetOpenFileName() o getSaveFileName() , cuyo uso es trivial y
consiste pasar como parametros , el objeto de presentacion , titulo de
la ventana del dialogo , directorio de inicio , el filtro
de archivos que se desea presentar etc, todo muy bien documentado en
el manual de Qt, pero sucede uqe dichas instancias de la funcion
QFileDialog no estan implementantadas para Harbour y de estas llamadas
nativas solo existe getExistingDirectory().

Tiene sin embargo QFileDialog() una nutrida bateria de funciones para
personalizar el uso de la funcion , como son ajustar la presentacion
pasada de parametros como filtros de seleccion de archivos, nombre de
directorio y archivo inicial, si los archivos de apertura o grabacion
es decir la confiracion funciona relativamete bien , tienndo presente
que en algunos casos la informacion para pasar los filtros de los
archivos permitidos es un poco confusa, se use
setNameFilter(QstringList) y no setFilter(QString) la cual no
funciona correctamente.
La primera citada si lo hace pevia definicion de la QStringList()
mediante el comando append() asi:

filtro := QStringList():new()
filtro : append("Xbase (*.dbf) "
filtro : append("Html (*.html)"

Este conformacion muestra tanto el mensaje como el filtro (XBase,Html)
y sus respectivos filtro (*.dbf , *.html)

archivo := QFileDialog(): new()
archivo : setNameFilters(filtro)
archivo : setDirectory("/tmp")
archivo : selectFile("Sos.dbf")

coloca como diretorio inicial "/tmp" y como archivo propuesto inicial
a "Sos.dbf"

ahora para sacar el nombre del archivo seleccionado supuestamente
dice el manual que es es:



if archivo.exec() == 0
RETURN NIL
endif

salidaList : archivo : selectedFile()
salidaFile : salidaList[0] //lo cual da acceso directo
// al elemento cargado en
// salidaLIst

El unico problema es que esto ultimo no me funciono , pues aunque
el manual indica de forma clara que la salida de selectedFile()
es un string List , no encontre ninun procedimiento de string List
que respondiera , sort, join , indexOf , etc es como si el elemento
que cargara no fuea un string list, en un momento pense que estaba
por algun error mi cargando un elelemnto vacio, pregunte :

if salidaList == NIL
msgInf("cadena vacia",2)
else
msgInfo("cadena tiene elementos")
endif

la respuesta en todos los casos es que si tiene elementos ante la
imposibilidad de acceder al nombre del archivo seleccionado por el
usuario cambie mi estrategia a una llamda directa de la funcion nativa
asi:


variableDir := home + slash + "tmp"

textoTmp := Tr("Archivo de salida")
textoDir := Tr("Seleccione directorio donde guardar archivo")

G1 := QFileDialog():new()
variableDir := G1 : getExistingDirectory(NIL,textoDir,variableDir)

if len(trim(variableDir)) == 0
RETURN NIL
endif


Esto funciono sin ningun problema , el unico inconveniente es que
no me reconoce las hoja de estilo, el modelo de anterior procesa
muy elegantemente.

Me quede con este ultimo, buscare mas adelante porque el selectedFile()
no me funciono.
Y la captura del niombre del archivo lo hag atraves de un comando
independiente QTextEdit()

La funcion completa que me permite grabar un archivo que queda en
archivo temop en diversos formatos queda como:

FUNCTION copiarArchivo(ksosObj, archivoTmp)

LOCAL textoTmp
LOCAL variableTmp, variableFile
LOCAL salida_, archV, digiTmp
LOCAL dd, mm, exTmp
LOCAL creado := NO
LOCAL arrTmp[3,3]
LOCAL winC, layoC, G1, C1, R1
LOCAL aExit := .T.
LOCAL cExit := .F.

dd := right("00" + ltrim(str(day (date),2)),2)
mm := right("00" + ltrim(str(month(date),2)),2)

digiTmp := left(digitador,4)
variableDir := home + slash + "tmp"

variableFile:= slash + digiTmp + "_" + dd + mm
variableFile:= lower(left(variableFile + space(50),50))

textoTmp := Tr("Archivo de salida")
textoDir := Tr("Seleccione directorio donde guardar archivo")
textoTipo := Tr("Tipo")

arrTmp[1,1] := "xbase [.dbf]" ; arrTmp[1,2] := "" ; arrTmp[1,3]:= ".dbf"
arrTmp[2,1] := "web [.html]" ; arrTmp[2,2] := "" ; arrTmp[2,3]:= ".html"
arrTmp[3,1] := "texto [.cvs]" ; arrTmp[3,2] := "" ; arrTmp[3,3]:= ".txt"

G1 := QFileDialog():new()
variableDir := G1 : getExistingDirectory(NIL,textoDir,variableDir)

if len(trim(variableDir)) == 0
RETURN NIL
else
variableFile := variableDir + variableFile
endif

layoP := QVBoxLayout():new()
layoD := QFormLayout():new()
layoD : setFieldGrowthPolicy(2)

layoB := QHBoxLayout():new()

winD := QDialog():new()
winD : setWindowTitle(textoTmp)
winD : setStyleSheet(cssK(CSS_SAY))
winD : setSizeGripEnabled(.T.)

pathS := pathI_ + look + slash
aceptarB := PushButtonK(NIL,,,Tr("Aceptar") ,pathS + "Aceptar.jpeg" ,,)
cancelarB := PushButtonK(NIL,,,Tr("Cancelar"),pathS + "Cancelar.jpeg",,)
aceptarB : setDefault(.T.)

/*
SayK,GetK y ComboBoxL son funciones redifinidadas por mi para
QTextLabel(), QTextEdit(), ComboBox(), sonde las asignacion de
estilos , variables . estnsinoes y demas estan encapsuladas para
que el codigo sea mas limpio

*/
S1 := SayK(NIL,,,replicate("_",70),,)
G2 := GetK(NIL ,,,variableFile,Y(02),X(50),50)
C1 := ComboBoxK(NIL,,, arrTmp, Y(02), X(10) )

layoD : addrow_3("" , S1)
layoD : addrow_3("&" + textoTmp , G2)
layoD : addrow_3("&" + textoTipo , C1)

layoB : addWidget(aceptarB)
layoB : addWidget(cancelarB)

layoP : addLayout(layoD)
layoP : addLayout(LayoB)

winD : setLayout(layoP)

Qt_Connect_Signal(aceptarB ,QT_EVE_CLICKED, {|| aExit := .T. ,winD:accept() })
Qt_Connect_Signal(cancelarB,QT_EVE_CLICKED, {|| cExit := .T. ,winD:reject() })

winD : exec()
if (cExit)
RETURN NIL
endif


//en extTmp esta el tipo archivo de de salida
extTmp := arrTmp[ C1 : currentIndex() + 1, 3 ]
salida_ := G2 : text + extTmp
archV := chr(34) + salida_ + chr(34)
archivoTmp += ".dbf" // El archivo de tablas siempre es .dbf
close databases

do case
case extTmp == ".dbf"
copy file &archivoTmp to &salida_
if file(&archV)
creado := SI
endif
case extTmp == ".html"
if (memoWrit(salida_, ksosObj : toHtml, .T.))
creado := SI
endif
case extTmp == ".txt"
select 10
use &archivoTmp alias PRESENTA
copy to &salida_ DELIMITED with ","
if file(&archV)
creado := SI
endif
endcase

if (creado == SI) // SI esta definida en entorno como: SI := "Si"
textoTmp := Tr("Archivo creado exitosamente") + "
"
textoTmp += ResaltarK(archV)
else
textoTmp := Tr("Archivo no fue creado") + "
"
textoTmp += ResaltarK(archV)
endif
ms := MsgInfo(textoTmp,MSG_INFORMATIVO)

RETURN NIL

Comentarios

Entradas populares