Terminei aqui uma classe pra manipular os objetos do formulário, usando somente a HBQT e acho que ficou melhor que as outras classes que achei nos exemplos e nas próprias libs. Diferente de todas que encontrei pronta, essa não carrega seus objetos do form.ui para criá-los dentro de uma nova janela através de um layout, essa minha classe de fato executa sua janela.
O nome dela é FormUI, e o arquivo é o TFormUI.prg:
Código: Selecionar todos
#include "hbclass.ch"
#include "hbqt.ch"
CLASS FormUI
DATA oJanela
DATA cArqUI
DATA hObjetos INIT hb_hash()
METHOD new()
METHOD destroy()
METHOD carregaObjetos()
METHOD evento()
ENDCLASS
METHOD FormUI:New( cArqUI )
LOCAL oUi, oArq
LOCAL lErro := .F.
IF File( cArqUI )
oArq := QFile():new( cArqUI )
IF oArq:open( 1 )
oUi := QUiLoader():new()
::oJanela := QDialog():configure( oUi:load( oArq ) )
oArq:close()
ELSE
lErro := .T.
ENDIF
ELSE
lErro := .T.
ENDIF
IF ( lErro )
RETURN NIL
ENDIF
::carregaObjetos( cArqUI )
RETURN Self
METHOD FormUI:carregaObjetos( cArqUI )
LOCAL cBuffer := memoread( cArqUI )
LOCAL n, cClass, cWidget
LOCAL bBlock, xElem, oObj, pPtr
DO WHILE .t.
IF ( n := at( "widget class=", cBuffer ) ) == 0
EXIT
ENDIF
cBuffer := substr( cBuffer, n + 13 )
n := at( "name=", cBuffer )
cClass := alltrim( strtran( substr( cBuffer, 1, n-1 ), '"', "" ) )
cBuffer := substr( cBuffer, n + 5 )
n := at( ">", cBuffer )-1
cWidget := alltrim( strtran( substr( cBuffer, 1, n-1 ), '"', "" ) )
IF type( cClass + "()" ) == "UI"
pPtr := Qt_findChild( ::oJanela, cWidget )
bBlock := &("{|| " + cClass + "() }")
xElem := eval(bBlock)
IF hb_isObject( xElem )
xElem:pPtr := pPtr
oObj := xElem
::hObjetos[cWidget] := oObj
__objAddData( self, cWidget )
::&(cWidget) := oObj
ENDIF
ENDIF
ENDDO
RETURN NIL
METHOD FormUI:evento( cObj, nEvento, bBlock )
IF hb_hHasKey( ::hObjetos, cObj )
Qt_Connect_Signal( ::&(cObj), nEvento, bBlock )
ENDIF
RETURN NIL
METHOD FormUI:Destroy()
local i
for i=1 to len(::hObjetos)
__objDelData( self, hb_HKeyAt(::hObjetos,i) )
next
RETURN NIL
Para usar no seu código, ficaria algo assim:
Código: Selecionar todos
PROCEDURE Main()
LOCAL oFormUi
oFormUi := formUI():New("form.ui")
oFormUi:oJanela:show()
oFormUi:oJanela:setWindowTitle("Título da Minha Janela")
oFormUi:evento( "botao_1", "clicked()", {|| MinhaFuncao() } )
qApp:exec()
oFormUi:Destroy() // IMPORTANTE !!!!!
RETURN NILCódigo: Selecionar todos
oFormUi:botao_1: .... // aqui vai um metodo ou propriedadeCódigo: Selecionar todos
oMeuForm := formUI():New("NomeDoArquivoUI.ui")
oMeuForm:oJanela // esta é sua janela
Código: Selecionar todos
oMeuForm:evento( "oObjeto", "eEvento()", {|| Funcao() } )Por enquanto, me parece ter suprido todas as minhas necessidades. O resto é com a hbqt mesmo.
Abraços



