Esse artigo faz parte da revista Clube Delphi edição 23. Clique aqui para ler todos os artigos desta edição



Atenção: por essa edição ser muito antiga não há arquivo PDF para download. Os artigos dessa edição estão disponíveis somente através do formato HTML.
 

 

Linux Direto

Programação com Qt e CLXDisplay

Com o lançamento do Kylix em janeiro de 2001, veio para o Linux a facilidade de desenvolvimento já presente no Delphi. O desenvolvimento com essas ferramentas é muito produtivo, sendo chamado de RAD (Rapid Application Development). Porém, a maior crítica feita pelos desenvolvedores mais experientes é que as ferramentas RAD escondem os detalhes da implementação, gerando código possivelmente lento e ineficiente. O objetivo deste artigo é mostrar que, embora sendo uma ferramenta RAD, o Kylix permite o acesso às APIs que estão por trás do desenvolvimento visual, permitindo obter o máximo do ambiente.

Bibliotecas

Quando a Borland decidiu portar o Delphi para o Linux, encontrou um problema. Sua biblioteca de componentes, a VCL (Visual Component Library), era extremamente dependente das funções internas do Windows. A Borland poderia optar por usar uma biblioteca de emulação, como a WineLib (http://www.winehq.com), mas encontraria o mesmo problema quando fosse portar para outros ambientes. A solução encontrada foi reescrever completamente a biblioteca. Isto poderia ser feito criando uma nova VCL que não fosse baseada em nenhuma biblioteca gráfica, mas seria um trabalho tão grande que atrasaria muito o lançamento do produto.

 

A Borland então optou por basear sua nova biblioteca de componentes na biblioteca Qt, da companhia norueguesa Troll Tech. Esta é uma biblioteca portável (existem versões do Qt disponíveis para Linux, Windows, diversos Unixes, Mac e até Palm), usada como base do KDE. Esta nova biblioteca de componentes, chamada de CLX, foi criada para ser uma biblioteca multi-plataforma.

 

Com este enfoque, além de ganhar na velocidade de desenvolvimento da nova ferramenta, a Borland ganhou na portabilidade: o Delphi 6 (para Windows) permite criar aplicações que usam a CLX e podem ser portadas para Linux, necessitando apenas da recompilação dos fontes no Kylix.

Qt e o Kylix

Os componentes da CLX encapsulam os widgets (este é o nome que se dá aos componentes visuais do Linux) do Qt, permitindo que o modo de trabalho em Kylix seja muito semelhante àquele do Delphi, fazendo que a experiência dos milhares de desenvolvedores Delphi não seja desperdiçada. Muitas vezes, isto é apenas uma camada leve sobre o Qt e seu widget; outras vezes, o componente é totalmente escrito usando o Kylix.

 

A biblioteca Qt é uma biblioteca de classes C++, não sendo inteiramente compatível com o Kylix. Para poder usar as classes desta biblioteca, os projetistas da Borland fizeram um "achatamento" das classes, produzindo um conjunto de funções, importadas no arquivo Qt.pas. Estas funções constituem o que a Borland convencionou chamar de API CLXDisplay. Com elas, um programa em Kylix pode acessar a biblioteca Qt, usando suas classes como qualquer programa C++. Note que o Kylix não tem arquivos de ajuda sobre a CLXDisplay. Toda a ajuda está na documentação do Qt, que pode ser obtida no site doc.trolltech.com.

 

O achatamento das classes é feito da seguinte maneira:

 

·         Todos os componentes têm um manipulador, um ponteiro para a instância da classe que foi criada. Este manipulador tem o nome da classe, seguido por um H. Por exemplo, o manipulador de uma instância da classe QLabel tem tipo QLabelH.

 

·         O acesso à instância deve ser feito usando este manipulador, que é retornado pelo achatamento do construtor da classe, que torna-se uma função.

·         Os métodos da classe usam este manipulador como primeiro parâmetro.

·         O nome do método é construído usando o nome da classe, seguido de um sublinhado e do nome do método, como por exemplo em QLabel_setText.

 

Um exemplo disto é o construtor de um Label no Qt. No arquivo de ajuda, vemos a seguinte declaração:

 

QLabel ( QWidget * parent,

  const char * name=0, WFlags f=0 )

 

A tradução deste construtor em Qt.pas é:

 

function QLabel_create(parent: QWidgetH;

  name: PAnsiChar; f: WFlags):

  QLabelH; overload; cdecl;

 

Como podemos ver, o construtor foi traduzido para uma função que retorna um manipulador para um QLabel. Podemos então usar este manipulador nos métodos desta classe. Por exemplo, o método setText está definido como:

 

virtual void setText ( const QString & )

 

A sua tradução é:

 

procedure QLabel_setText(handle: QLabelH;

   p1: PWideString); cdecl;

 

...

Quer ler esse conteúdo completo? Tenha acesso completo