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;
...