Qt – não é perfeito, apenas o melhor

Qt é uma framework multiplataforma para criação de interfaces gráficas ricas, mas a framework é completa, e pode ser muito útil mesmo que sua aplicação não tenha interface gráfica. Você pode utilizar Qt para construir aplicativos que façam o processamento de imagens, trabalhem com scripts, banco de dados, sockets, XML, entre outros. Qt é escrito em C++ e usa algoritmos e estruturas de dados adequadas, então você consegue um ótimo desempenho em muitas coisas das que faz, sendo muito raras as ocasiões onde você vai precisar utilizar alguma alternativa porque precisa de um desempenho monstruoso. E quando precisar não significa que vai deixar de utilizar todas as facilidades do Qt, pois você pode reaproveitar muitas delas.

Eu acho que Qt é a melhor framework para desenvolvimento de interfaces gráficas disponível atualmente, e acho também que é uma das melhores frameworks para construção de aplicativos multiplataformas em C++. Mas, é a melhor, não é perfeita, o que significa que ela pode continuar a evoluir por muito tempo, da mesma forma que o kernel Linux. Mas, por outro lado, Qt é uma framework muito antiga, de um tempo onde C++ nem era padronizado ainda, então muitas coisas do Qt hoje são replicadas no padrão C++. O exemplo mais fácil de se achar é a string. Enquanto C++ já tem sua string, Qt adiciona outra, a QString. Alguns podem pensar que isso é ruim, mas isso realmente é ruim pensando na compatibilidade entre as várias frameworks e bibliotecas disponíveis para C++, que idealmente são interoperáveis e deveriam usar implementações comuns para estruturas de dados comuns. Contudo, a string do Qt usa compartilhamento de dados implícito, minimizando o uso de memória sem adicionar complexidade ao software, além de ter muitas das facilidades da string de Python, permitindo maior abstração com a adição de métodos como arg e startsWith.

Então, a interoperabilidade de nada vale quando comparada com a qualidade e evolução? Errado, a classe QString tem o método toStdString, que retorna uma std::string, porém se for utilizar-se disse o tempo todo, haverá perdas de desempenho, obviamente. Mas aí é que podemos perceber outro problema da idade anciã do Qt, muitas de suas classes não usam conversão implícita de tipo. Enquanto você usa toStdString em QString e toString em QUrl e muitas outras classes, só algumas classes já suportam essa funcionalidade, como é o caso da classe QUuid, que fornece o método operator QString. Esse é um dos recursos de C++ que deveria ser melhor explorado por essa framework.

Mas vemos ainda na classe QString outro problema no Qt. Ao observarmos o método toInt dessa classe, descobrimos o método de tratamento de excessões próprio do Qt, o uso de ponteiros para booleanos:

Esse problema, em particular, pode ser defendido por alguns por questões de compatibilidade e desempenho, mas na verdade esses argumentos não valem muito atualmente nesse quesito, pois se há um processador que não suporta um bom compilador C++, não há razão para suportar esse processador em uma framework escrita em C++ e o desempenho do tratamento de exceções do C++ é bom. Veja como seria mais interessante se usássemos o tratamento de exceções da linguagem, onde conseguiríamos o mesmo efeito com um código mais elegante:

Talvez eu explore um pouco mais outros aspectos do Qt como o uso métodos inline e QObject em outros posts, mas acho que os pontos discutidos aqui são os principais pontos para uma possível versão 5.0 do Qt.

EDIT1.5:

E senti que eu podia ter dado mais ênfase ao tratamento de exceções do C++, mostrando outros motivos além da elegância e legibilidade para usá-lo. No exemplo de conversão de string para int, por exemplo, a exceção disparada podia ter informações como os possíveis valores inteiros para os quais a string pode ser convertida, e se conversão falhou porque é um número de ponto flutuante em vez de um inteiro, entre informações, que com o método de ponteiro para booleano do Qt são impossíveis.

EDIT2:

Apontado pelo leitor @Psycho Mantys: a string de grande parte das implementações da linguagem C++ também implementa copy-on-write, então a QString não é tão superior assim em relação a std::string como em grande parte das situações, como eu tinha comentado no post.

Tags:,

4 responses to “Qt – não é perfeito, apenas o melhor”

  1. Psycho Mantys says :

    Bom artigo😀.

    Eu particularmente não gosto de QT justamente por ele não procurar se adequar as coisas mais novas, e por ele usar muito pré-processador ainda.

    Pow, eles podia se adequar ao novo padrão com muita facilidade, assim o povo fica com desculpa para não implementar extensões do padrão em compiladores e fica essa zona que se vê em compiladores para dispositivos moveis.

    E essa coisa de exceções e pior ainda:/.

    Escrever coisas no estilo commit deixa o código sem ser natural, e fora do estilo RAII.

    PS1:. “Contudo, a string do Qt usa compartilhamento de dados implícito, minimizando o uso de memória sem adicionar complexidade ao software”:
    Isso seria Copy-on-write né? string de c++ implementa COW também😀.

    • VinIPSmaker says :

      Bom artigo😀 .

      vlws

      Eu particularmente não gosto de QT justamente por ele não procurar se adequar as coisas mais novas, e por ele usar muito pré-processador ainda.

      Lá no compe eu estava resistindo ao Qt no começo principalmente por causa do moc, mas depois de descobrir que ele era a melhor ferramenta para o laboratório resolvi aprender as qualidades e os outros defeitos do Qt. Uma das qualidades mais interessantes é o padrão de sinais e slots, que no Qt precisa do moc (enquanto que na libsigc++ é em c++ puro e também é fácil de usar, e com um desempenho melhor até).

      Isso seria Copy-on-write né? string de c++ implementa COW também😀 .

      O recurso realmente tem esse nome de copy-on-write, mas eu não sabia que a string do C++ também a implementava (achava que alguns compiladores faziam a implementação dessa forma por competição, não por obrigação em se manter em conformidade com o padrão), mas é muito bom saber disso.

Comentários (with MarkDown support)

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: