QDateTimeEdit() harbour Qt

21/08/2010

No se ustede pero yo por lo menos necesito la manipulacion de
fecha de una forma intensa, y no solo de QTGUI , vive el hombre
es decir que aparte del ambiente grafico hay ademas que pasarle
parametros de nuestro querido xbase a Qt, que son dos cosas totalmente
distintas, aqui me queridisimo ctod() y dtoc() no funcionan para
pasarle parametros a por ejemplo

sdate := QDateTimeEdit():new()

si no queremos ver la fecha existe desde luego algo como

sdate : setdate(fecha)

aqui el problema es que es fecha, un numero, una fecha, un string,
con que formato , algo peliagudo , pues en la informacion de
Nokia solo dice :

setdate(qtDate)

es decir nos esta diciendo que esta funcion solo acepta datos tipo
QDate , pero que son.

Bien antes de seguir adelante, para que tengamos claro recapitulemos
en varias cosas, si han estado leyendo esta bitacora, recordron que
les solicite que buscaran los fuentes (src) de Harbour, que se
descargan desde la pagina de Harbour -> download.

una vez los tengamos en un directorio buscar:

/MIDIRECTORIO/harbour-2.0.0/contrib/hbqt

alli deben aparerer algunos directorios de interes como :
qtcore, qtgui, qtNetwork. qth.

de momento demos un vistazo a qtgui, como dije anteriormente solo
interesan para los alcances de esta bitacora los archivos terminados
en *.prg, yo personalmente los extraje , conjuntamente con los de
qtcore y qtnetwork para tenerlos a mano, ya veremos su utilidad.

yo cree unos directorios que llame ksos y en ellos copie todos estos
archivos que quedo asi

# cp /MIDIRECTORIO/harbour/harbour-2.0.0/contrib/hbqt/qtgui
/home/ksos/qtnetgui

# cp /MIDIRECTORIO/harbour/harbour-2.0.0/contrib/hbqt/qtcore
/home/ksos/qtcore

# cp /MIDIRECTORIO/harbour/harbour-2.0.0/contrib/hbqt/qtnetwork
/home/ksos/qtnetwork

ya con esto listo les pido que den una leve ojeada a un archivo
dentro de qtgui, veamos por ejemplo como se ve:

Qlabel:
======
A proposito todos los archivos de qtgui*.prg iniciana con T,
entonces decimos por ejemplo :

less TQLabel.prg ( linux )
o
edit TQlabel.prg ( windows )
Todos los archivos inicain con el encabezamiento de rigos, que esto
es softwarwe libre y que los puedes modificar y etc.
bajemos hasta dionde empiezan las intrucciones en este aso la linea 40

QLabel.prg
********************************************************************

#include "hbclass.ch"


CREATE CLASS QLabel INHERIT HbQtObjectHandler, QFrame

METHOD new()

METHOD alignment()
METHOD buddy()
METHOD hasScaledContents()
METHOD indent()
METHOD margin()
METHOD movie()
METHOD openExternalLinks()
METHOD picture()
METHOD pixmap()
METHOD setAlignment( nQt_Alignment )
METHOD setBuddy( pBuddy )
METHOD setIndent( nInt )
METHOD setMargin( nInt )
METHOD setOpenExternalLinks( lOpen )
METHOD setScaledContents( lBool )
METHOD setTextFormat( nQt_TextFormat )
METHOD setTextInteractionFlags( nFlags )
METHOD setWordWrap( lOn )
METHOD text()
METHOD textFormat()
METHOD textInteractionFlags()
METHOD wordWrap()
METHOD clear()
METHOD setMovie( pMovie )
METHOD setNum( nNum )
METHOD setNum_1( nNum )
METHOD setPicture( pPicture )
METHOD setPixmap( pQPixmap )
METHOD setText( cQString )

ENDCLASS

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

Alli vemos todos los metodos de esta clase de donde estan heredando
sus propiedades , en este caso de QFrame y tiene unos manejadores de
eventos que luego veremos. de momento de interes , observar estos
metodos,
porque insisto tanto en ello, porque en todas partes que entras a
consultar sobre Qt en harbour te dicen que es lo mismo como se maneja
el Qt de Nokia y si, pero...
Tiene sus propias cosas, por ejemplo la forma de implementar una cosa
en Qt difiere sustancialmente de Harbour, por decir algo, en C++ y Qt
puedes pasarle parametros desde el constructor a la funcion, por decir
algo como:

slabel : QtLabel("Hola mundo"):New()

aqui no funciona, observen que el constructor no admite parametros ,
asi fue hecho, no tengo naa contra eso , pero mo costo mi buen rato
darme cuenta que simple y llanamente no lo hicieron asi.

aqui se hace usando la instruccion set.
queda entonces como:

slabel : QtLabel():new()
slabel : setText("Hola mundo")

sencillo cuando se sabe no.
centremos entonce en los parametros de las funciones.
alguanas funciones simplemente tiene (), este tioo de funcines POR
lo GENERAL , son funciones que toman parametros del objeto , si fuera
java direamos que son del tipo GET().
Cuando deseo pasar parametros al objeto digo: SETCualquiercosa, y
ahi , si tenemos parametros como fue en el caso anterior del

METHOD setText(QtString)

que nos dice de forma sencilla que espera como parametros un string.
o cadena de caracteres enter comillas.

METHOD setMargin( nInt )

Nos dice que este parametro espera un numero entero.

METHOD setMovie( pMovie )

esta funcin y todas las que empiezan por una p , necesitan una
apuntador a otro objeto como parametro, es dexcir no se le puede
simplemente que es una direccin , o un numero es un apuntaodr por
lo tanto en terminalogia JAVA y C++ hay que haer un casting , que no
es que presentar el dato como resultado de otra funcion que lo invoca.
no se si parece confuso pero con un pequeño ejemplo lo vamos a
comprender espero.
Y por esto fue que me metio en este cuento el dia de hoy , porque
la funcion QDateTimeEdit, solo recibe parametros de QDate y se ve asi:

TQDateTimeEdit.prg
*********************************************************************

#include "hbclass.ch"


CREATE CLASS QDateTimeEdit INHERIT HbQtObjectHandler, QAbstractSpinBox

METHOD new()

METHOD calendarPopup()
METHOD calendarWidget()
METHOD clearMaximumDate()
METHOD clearMaximumDateTime()
METHOD clearMaximumTime()
METHOD clearMinimumDate()
METHOD clearMinimumDateTime()
METHOD clearMinimumTime()
METHOD currentSection()
METHOD currentSectionIndex()
METHOD date()
METHOD dateTime()
METHOD displayFormat()
METHOD displayedSections()
METHOD maximumDate()
METHOD maximumDateTime()
METHOD minimumDate()
METHOD minimumDateTime()
METHOD minimumTime()
METHOD sectionAt( nIndex )
METHOD sectionCount()
METHOD sectionText( nSection )
METHOD setCalendarPopup( lEnable )
METHOD setCalendarWidget( pCalendarWidget )
METHOD setCurrentSection( nSection )
METHOD setCurrentSectionIndex( nIndex )
METHOD setDateRange( pMin, pMax )
METHOD setDateTimeRange( pMin, pMax )
METHOD setDisplayFormat( cFormat )
METHOD setMaximumDate( pMax )
METHOD setMaximumDateTime( pDt )
METHOD setMaximumTime( pMax )
METHOD setMinimumDate( pMin )
METHOD setMinimumDateTime( pDt )
METHOD setMinimumDateTime( pDt )
METHOD setMinimumTime( pMin )
METHOD setSelectedSection( nSection )
METHOD setTimeRange( pMin, pMax )
METHOD setTimeSpec( nSpec )
METHOD time()
METHOD timeSpec()
METHOD setDate( pDate )
METHOD setDateTime( pDateTime )
METHOD setTime( pTime )

ENDCLASS

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

Tiene bastantes metodos , pero en el caso que nos ocupa solo me
interesan 2 o tres .
y la funcion quedo asi:


FUNCTION FecharK( ksosObj,dateTmp,DateFormat)

// dateTmp es una fecha tipo date()
// Dateformat es una string "dd/mm/yyyy"

#define QT_EVE_DATECHANGED "dateChanged()"

LOCAL sDate, dateSos

dateSos := QDate():New()
dateSos : setDate(year (dateTmp) ,;
month(dateTmp) ,;
day (dateTmp))

sDate :=QDateTimeEdit():new( ksosObj )
sDate : setDisplayFormat( DateFormat )

sDate : setDate( dateSos )
sDate : setcalendarPopup(.T.) //crea uh calendario tipo popmenu
sDate : setStyleSheet(cssK(CSS_SAY))

Qt_Connect_Signal( sDate,QT_EVE_DATECHANGED, {|| lexit:= .T. })

sDate : Show()

return sDate

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

Observemos, tenemos el onstructor , nada raro en el, ademas le damos
un presentacion con setStyle() , pues tambien hereda de QFrame y
nos permite hacer uso de la funcion, el cuento esta en el :

sdate : setDate( dateSos)

si volvemos arriba donde tenemos la definicion de la clase
TQDateTimeEdit() encontramos:

METHOD setDate( pDate )

es decir el argumento es un apuntador, pero a que ?
intente con los consbidos string a pesar de que sabia que asi no
era pero tenia qwue cerciorarme, luego con dtoc() y ctod() y nada,
el manual de Nokia, dice

setDate (const QDate & date)

es decir claramente dicen que el dato que la funcion espera es un
casting QDate().

bueno como lo dicen hay que obedecer o la cosa no funciona, pero donde
esta el bendito QDate(), porque no pertenece a qtgui, pues si señores
esta en qtCore(), y porque necesito saber esto , pues porque yo ya
perdi una tarde usando las instrucciones del QtDate() objeto y siempre
me sale un error. que la funcion no tiene los parametros , y es
cierto, el METODO, setYMD(yyyy,mm,dd) que aparece en el manual de
Nokia para pasar el valor a la fecha correcta , no existe el sistama
de Qt de harbour, por eso incisto tanto en tener a mano las
informacion de los Qt de las que ya hablamos.

Sucede que aqui se hace a traves de otra funcion muy java de casting
que nos resuelve el problema con SET y GET

Esat bo funciona
dateSos := QDate():New()
dateSos : setYMD(year (dateTmp) ,;
month(dateTmp) ,;
day (dateTmp))

si funciona:

dateSos := QDate():New()
dateSos : setDate(year (dateTmp) ,;
month(dateTmp) ,;
day (dateTmp))

Muy elegante si señor, pero no lo dicen en ninguna parte que yo pueda
haber visto, sino fuera por las fuentes hace rato habria tirado la toalla.


Desde luego en las fuentes no te dien para que sirven cada uno de los
metodos, ni como se usan las clases , para eso el manual en linea de
Nokia esta que ni pintado , con ejemplos y todos, descargar
assistent del sitio de Nokia , a mi me ha servido muchisimo.


la clave es entones es la siguiente:

1. Entender que quiero hacer.
2. Buscar como se hace en Qt , puedo usar inicialment la Web
3. Una vez tenga claridad sobre las clases que necesito visitar el
sitio de Nokia y el assitent para ver las ultimas actualizaciones.
4. Tener a mano las librerias Qt de harbour y verificar si los
metodos qeu invoca Nokia se corresponden con los de Harbour
5. Tener claro que significan los distintos parametros (), int, string
, pointer
6. tener claro que los metodos sobre cargados de Qt, no existen en
Harbour y que en su defecto se usan consecutivos par las distintas
firmas de las funciones, por ejemplo:

En QMenubar()

addAction ( string Texto)
addAction_1( icon Icono)

la primera funcion permite asignar unicamente un texto,
la segunda permite agregarle una accion al menubar con icono incluido.

En Qt, no existe addaction y addAction_1, solo existe el primero y la
funcion se denomina un metodo sobrecargado.

Comentarios

Entradas populares