Por que não há mais aplicativos de desktop escritos com Qt? [fechadas]


202

Tanto quanto sei e entendi na minha experiência com o Qt, é uma biblioteca muito boa e fácil de aprender. Possui uma API muito bem projetada e é multiplataforma, e esses são apenas dois dos muitos recursos que a tornam atraente. Estou interessado em saber por que mais programadores não usam o Qt. Existe uma deficiência que fale contra isso? Qual recurso torna outras bibliotecas melhores que o Qt? O problema está relacionado ao licenciamento?


60
É C ++ nativo. A maioria dos desenvolvedores prefere linguagens de nível superior, como C #.
precisa saber é o seguinte

15
A espada de dois gumes da compatibilidade com versões anteriores deixou o Qt com muitos anacronismos, defeitos não corrigíveis e outros comportamentos ruins.
EdA-qa mort-ora-y

26
@ user16764: "Mais"?
Lightness Races in Orbit

17
Não acho que o índice TIOBE seja uma medida realmente precisa, porque mede a popularidade, não o uso. Comparar a quantidade de código em repositórios de código aberto como GitHub, Bitbucket, Codeplex e Sourceforge daria medições mais precisas. (E acredito que essas medições mais precisas colocam C e C ++ nos pontos 1 e 2 - o Java tem uma vantagem injusta no índice TIOBE porque é usado em cursos para calouros, e os novos programadores fazem mais barulho do que os experientes)
Billy ONeal

12
@Giorgio: Erm, você precisa pensar sobre essas coisas em C #. O conceito de "quem é o dono" vai muito além de "quem liga delete". O fato de os ponteiros inteligentes explicitarem isso não é uma linguagem que falha; e se você não pensar nessas coisas, irá gerar lixo em qualquer linguagem de alto nível que já tenha visto.
Billy ONeal

Respostas:


177

Não pretendo realmente que seja uma resposta contundente, mas essas são as razões pelas quais não uso pessoalmente o Qt. Há muitas coisas boas a dizer sobre isso - a saber, que a API funciona na maior parte do tempo e faz a ponte entre plataformas. Mas eu não uso Qt, porque:

  1. Em alguns casos, simplesmente não se parece com programas nativos. O design de uma interface do usuário única para todas as plataformas inerentemente não parecerá correto quando movido de máquina para máquina, por vários motivos de estilo visual. Por exemplo, em máquinas Mac, as barras divididas geralmente são relativamente grossas e os botões são pequenos e arredondados com ícones. Nas máquinas Windows, as barras divididas geralmente são estreitas e os botões são mais textuais, com mais desenhos quadrados. Só porque você pode escrever uma interface do usuário para todas as plataformas não significa que você deve fazer para a maioria dos aplicativos.
  2. Qt não é uma biblioteca C ++. Requer uma etapa de compilação separada, o que torna o processo de criação muito mais complicado quando comparado com a maioria das outras bibliotecas.
  3. Como resultado de (2), IDEs e ferramentas C ++ podem sinalizar expressões Qt como erros, porque eles não entendem as especificidades de Qt. Isso quase força o uso do QtCreator ou de um editor apenas de texto vim.
  4. Qt é uma grande quantidade de fontes, que deve estar presente e pré-instalada em qualquer máquina usada antes da compilação. Isso pode tornar a configuração de um ambiente de construção muito mais entediante.
  5. Está disponível apenas na LGPL, o que dificulta o uso da implantação binária única quando é necessário liberar sob uma licença mais restritiva ou menos restritiva.
  6. Ele produz binários compilados extremamente grandes quando comparados com "aplicativos nativos simples", escritos da mesma forma (exceto os aplicativos escritos para o KDE).

11
@ Desumanizador: Existe a licença LGPL e a licença comercial. A licença comercial é de milhares de dólares por parte do licenciado e não permite redistribuição, etc. Para projetos de código aberto sob licenças liberais como BSD, MIT ou Boost, onde os autores não estão ganhando muito dinheiro e desejam para liberar seu código sob uma licença liberal, a dependência da LGPL não é razoável, mas os desenvolvedores em questão geralmente não podem pagar pelo licenciamento comercial.
Billy ONeal

27
# 6 é o maior motivo para evitá-lo. Quero dizer, eu não quero um programa grande e desajeitado, e não gosto de estar vinculado a uma licença específica, mas é realmente a falta de uma boa aparência nativa que é um diferencial para mim. Versões recentes do OSX e do Windows fizeram um trabalho fantástico de tornar suas interfaces nativas bonitas, rápidas e funcionais, e eu prefiro aproveitar todo o trabalho que eles já fizeram por mim; Acho que muitos programas sem uma aparência nativa parecem baratos e hackers para mim (nem sempre, mas isso me deixa um pouco estranho).
Greg Jackson

16
Seu número 6 deveria ter sido o número 1. Esse é de longe o maior problema com o Qt. Em muitos casos, simplesmente não usa as APIs nativas. Eu gosto que meu software pareça nativo. Usuários assim também. Eu nunca vi um aplicativo Mac criado com o Qt que parecia um aplicativo Mac. Nem outros usuários de Mac são exigentes com esse tipo de coisa. Você perde todo o benefício de ser "multiplataforma" se você o estiver usando apenas para criar aplicativos Linux, que é o único lugar em que parece nativo porque realmente não há nada nativo.
Cody Grey

41
exceto que o problema da aparência 'nativa' não está mais lá. A consistência antiga dos aplicativos do Windows agora é uma bastardização de quaisquer blobs, brilhos e animações únicos que o WPF e o silverlight permitem. Dê uma olhada no painel de controle do Office ou do Windows 7 apenas para ver como até o principal produto de MS tem GUI inconsistente atualmente. Usuários de Mac - bem, você tem um ponto muito válido lá.
gbjbaanb

5
@TrevorBoydSmith: Desculpe, mas você está errado. Qt é a única estrutura que usa pré-processamento. Período. Verifique o GNOME, FLTK, WX e amigos e mostre-me uma etapa de pré-processamento. Você não encontrará um. Algumas outras bibliotecas vêm com sistemas de compilação diferentes, mas no final do dia, são bibliotecas C ++ que podem ser criadas por qualquer compilador C ++. Quanto ao "Win32 bruto não está presente nos meus motivos", ele está presente nos meus motivos como # 5 e # 6.
Billy ONeal

115

Como as pessoas dizem, cada ferramenta se adapta a cada problema e situação ...

Mas se você é programador em C ++, o Qt é sua estrutura. Sem rival.

Desenvolvemos uma aplicação comercial complexa de imagens médicas, e o Qt permanece.

Não digo que os "contras" que as pessoas dizem sobre isso sejam falsos, mas tenho a sensação de que eles não experimentam o Qt há muito tempo (está melhorando continuamente a cada nova versão ...) E, principalmente todos os problemas que eles comentam não são um problema se você tomar cuidado.

Inconsistência na plataforma da interface do usuário: somente se você usar os widgets da interface do usuário 'como estão', sem personalização ou arte customizada.

Sobrecarga do pré-processador Qt: Somente se você abusar do mecanismo do slot de sinal ou da herança do QObject, quando não houver realmente necessidade.

A propósito, ainda escrevemos aplicativos em C # .NET e fazemos isso há muito tempo. Então, eu acho que tenho uma perspectiva positiva.

Como eu disse, cada ferramenta para cada situação,

mas Qt é sem dúvida uma estrutura consistente e útil.


9
+1 Thaks! Eu só queria escrever o mesmo. O mais absurdo é "argumento não comercial / de código aberto". Surpreendente, quantas pessoas entendem errado o termo Código Aberto. O Qt era de código aberto desde que eu o uso (1.4). E costumava ter a licença mais justa: ganhar dinheiro com Qt -> pay.
Valentin Heinitz

16
Ah, e eu realmente não me importo sobre a adição de 10 MB DLLs de aplicativo que contém 50 MB de arte e muito mais 200 MB de tutoriais em vídeo e dados :)
Петър Петров

9
O espaço necessário para o Qt é barato atualmente.
trusktr

5
Isso corresponde à minha experiência com o Qt (a estrutura de widgets, não usei o QML / QtQuick para nada sério até agora). É adequado escrever aplicativos grandes com requisitos complexos de interface do usuário. Depois de aprender, você pode ser muito produtivo. Os contras mencionados (etapa de compilação separada para arquivos de interface do usuário, etc) não são um problema se o sistema de compilação estiver configurado corretamente. Eu posso recomendar qmake ou cmake.
Nils

a partir do Qt 5.8 depois, há um projeto chamado Qt Lite que minimiza extremamente o Qt para suas necessidades específicas. esse é um recurso comercial;)
SMMousavi 28/02

36

De todas as coisas que eu não gosto no Qt, o fato de ele não funcionar bem com modelos me incomoda mais. Você não pode fazer isso:

template < typename T >
struct templated_widget : QWidget
{
  Q_OBJECT;

public signals:
  void something_happened(T);
};

Também não funciona bem com o pré-processador. Você não pode fazer isso:

#define CREATE_WIDGET(name,type) \
struct name ## _widget : QWidget \
{ \
  Q_OBJECT; \
\
public signals: \
  void something_happened(type); \
}

Isso, misturado ao fato de que tudo o que responde a um sinal precisa ser um Q_OBJECT, torna o Qt difícil de trabalhar para um programador de C ++. As pessoas acostumadas à programação no estilo Java ou Python provavelmente se saem melhor na verdade.

Na verdade, gastei muito tempo e esforço pesquisando e desenvolvendo uma maneira de recuperar a segurança de tipo e conectar um sinal Qt a qualquer objeto funcionador: http://crazyeddiecpp.blogspot.com/2011/01/quest-for-sane-signals -in-qt-step-1.html

O tipo de coisa que eu quero fazer é o desenvolvimento básico e diário de C ++, quase impossível de ser feito pelo Qt moc ... que por si só é totalmente desnecessário nos dias de hoje, se é que realmente foi.

Francamente, eu estou preso a isso, porque se você quiser fazer testes automatizados de interface do usuário, o Qt é praticamente o único jogo na cidade com exceção do MFC ... que é tão 1980 (é uma droga trabalhar muito nessa merda). Alguns podem dizer WX, mas há problemas ainda mais sérios. O GTKmm teria sido a minha primeira escolha, mas, como tudo é feito pelo proprietário e não faz acessibilidade ... não pode ser conduzido pelo software de teste padrão do setor. O Qt é bastante difícil nesse sentido ( mal funciona quando você modifica o plug-in de acessibilidade).


1
Fora de interesse, quais são os principais problemas do WX?
Tom Anderson

7
@ Tom - documentação ruim, especialmente para as coisas novas. Os componentes AUI quase não são documentados, com grandes seções ausentes, dificultando o uso em um ambiente de produção. A documentação para o processo do evento está fundamentalmente errada com relação ao caminho que é seguido, pelo menos no win32. Passei muito tempo gritando com o computador: "Isso deve estar funcionando !!!" antes de entrar no código de processamento profundo para descobrir que o que o WX faz não segue os documentos e o que eu estava fazendo NUNCA funcionaria.
Edward Strange

1
Também fiquei perturbado com a aceitação da biblioteca da grade de propriedades na linha principal. Eu usei essa biblioteca e ela mostrou inúmeras falhas fundamentais de design, além da falta real de conhecimento em nome do programador que a escreveu (chamadas funções virtuais em construtores, por exemplo). Ele e o mau estado da AUI mostraram uma tendência para padrões mais pobres. Também não sou muito fã de tabelas de eventos estáticos, embora pelo menos haja outra maneira de responder a eventos ... ao contrário do MFC, que o WX parece muito empolgante.
Edward Strange

Obrigado. Eu usei apenas um pouco, e através da API wxPython, onde parecia bastante agradável. Compreendo que isso oculte um pouco do mal, mas também que simplesmente não me envolvi o suficiente para enfrentar os problemas mais sérios. Algo para eu estar ciente.
Tom Anderson

1
tudo o que responde a um sinal tem que ser um Q_OBJECT, hoje em dia ... Agora, funções estáticas, funções e até funções lambda podem responder a um sinal (você pode usar ponteiros de função como slots). As classes No-QObject também podem ter slots de membro se você se conectar a elas usando um std :: bind para converter o membro da instância em um ponteiro de função.
Vinícius A. Jorge

28

Um motivo para não usar o Qt é que, se você escrever apenas para uma arquitetura, como o Windows, convém usar C # /. NET (ou Cocoa no Mac), porque eles sempre poderão tirar proveito dos mais recentes sinos - e assobios do sistema operacional.

Se você estiver escrevendo aplicativos de plataforma cruzada, já poderá estar fortemente investido em outra tecnologia, como Java (ou seja, você trabalha em uma "Java Shop"). Sua escolha de tecnologia pode ser ditada pelo ecossistema em que você está desenvolvendo, como APIs específicas de idioma. Nesses tipos de casos, minimizar o número de tecnologias pode ser benéfico.

Uma terceira razão pela qual consigo pensar é que o Qt é baseado em C ++, e C ++ é uma linguagem relativamente difícil / perigosa para se programar. Acho que é uma linguagem para profissionais. Se você precisa ter o melhor desempenho e é capaz de ser meticuloso, o C ++ ainda é provavelmente o melhor jogo da cidade. Na verdade, o Qt melhora muitos problemas de gerenciamento de memória se você configurar as coisas para ficar fora do escopo. Além disso, o próprio Qt faz um bom trabalho isolando o usuário de muitos dos problemas desagradáveis ​​de C ++. Toda linguagem e estrutura tem seus prós e contras. É uma questão muito, muito complicada, que geralmente pode ser resumida pelo ditado frequentemente visto nos clientes: velocidade, qualidade e preço (mas você pode escolher apenas duas).

Embora as regras digam que devo manter o foco em responder à pergunta, quero refutar algumas das questões levantadas por Billy ONeal, que acho que faz um bom trabalho resumindo os motivos mais citados para não usar o Qt:

  1. Qt é de fato uma biblioteca C ++ / framework / arquivos de cabeçalho. É aumentadopor um processador de macro (moc) que permite sinais e slots, entre muitas outras coisas. Ele transforma comandos de macro adicionais (como Q_OBJECT) para que as classes tenham introspecção e todos os tipos de outras vantagens que você pode considerar adicionando a funcionalidade Objective-C ao C ++. Se você sabe o suficiente sobre C ++ para se ofender com essa falta de pureza, ou seja, você é um profissional, então 1) não use Q_OBJECT e sua classe ou 2) seja grato por isso, e programe em casos muito limitados onde isso causa um problema. Para as pessoas que dizem "Use o Boost para sinais e slots!" então eu diria que você está trocando um "problema" por outro. O Boost é enorme e tem seus próprios problemas comumente citados, como documentação ruim, API horrenda e horrores de plataforma cruzada (pense em compiladores antigos como o gcc 3.

  2. Para suporte ao editor, isso também segue de 1, eu concordo um pouco. Na verdade, o Qt Creator é o IMHO o melhor editor gráfico de C ++, ponto final, mesmo que você não use o material do Qt. Muitos programadores profissionais usam emacs e vim. Além disso, acho que o Eclipse lida com a sintaxe adicional. Portanto, não há problemas com as macros Qt (Q_OBJECT) ou com adições de sinais / slots. Você provavelmente não encontrará essas macros no Visual Studio, porque (eu admito) elas são adições ao C ++. Mas, em geral, o pessoal do C # /. NET não utilizará o Qt de qualquer maneira, devido ao fato de que eles têm grande parte da funcionalidade coberta por suas próprias técnicas proprietárias.

  3. Quanto ao tamanho da fonte Qt, desde que seja compilada da noite para o dia, quem se importa? Compilei o Qt 4 no meu Macbook dual core em "menos que da noite para o dia". Eu certamente espero que não seja isso que esteja motivando sua decisão de usar ou não uma tecnologia específica. Se isso for realmente um problema, você poderá fazer o download dos SDKs pré-compilados para Mac, Linux e Windows no site da Qt.

  4. O licenciamento está disponível em três opções: 1) Licença proprietária no caso de você desejar modificar o Qt ITSELF e não compartilhar, ou ocultar o fato de que alguém está usando o Qt e não está disposto a atribuir (pode ser muito importante para a marca e a imagem!) 2 ) GPL e 3) LGPL. Sim, há problemas com a vinculação estática (rolando todo o Qt no binário) - mas acho que é mais porque não se pode espiar por dentro e perceber que você está usando o Qt (atribuição!). Tentei comprar uma licença proprietária da Digia e eles me disseram "pelo que você está fazendo, você realmente não precisa". Uau. De uma empresa que está vendendo licenças.

  5. O tamanho do binário / pacote é porque você precisa distribuir o material Qt para as pessoas que não o possuem: o Windows já possui? o material do Visual Studio ou você precisa instalar o tempo de execução. O Mac já vem com o enorme cacau e pode ser vinculado dinamicamente. Embora eu não faça muita distribuição, nunca encontrei muito problema em distribuir o arquivo estático de ~ 50 megabytes (que eu posso tornar ainda menor com alguns dos utilitários binários de stripper / compactação como o UPX). Eu simplesmente não me importo o suficiente para fazer isso, mas se a largura de banda fosse um problema, eu adicionaria uma etapa UPX ao meu script de construção.

  6. O que define "Aparência e sensação nativas?" Eu acho que "a maioria" concorda que o Mac se aproxima mais da aparência unificada. Mas aqui estou, olhando para o Safari, iTunes, Aperture, Final Cut Pro, Pages, etc. e eles não se parecem em nada, apesar do fato de serem feitos pelo fornecedor do SO. Eu acho que o aspecto "sentir" é mais relevante: estilo do widget, capacidade de resposta, etc. Se você se preocupa com a capacidade de resposta, aqui está um bom motivo para usar C ++ em vez de Java, ou alguma outra linguagem altamente dinâmica. (O objetivo C também é ótimo, mas estou tentando dissipar mitos sobre o Qt)

Em resumo, é uma questão complicada. Mas gostaria de salientar que acho que há menos razões para "não usar o Qt", como se poderia pensar com base em mitos e informações desatualizadas de uma década.


1
O que não entendo é por que essas bibliotecas de plataforma cruzada não são simplesmente funções de invólucro, ou até melhor; se defs em torno das funções Cocoa, Win32, KDE / Gnome, garantindo a melhor interface do usuário, com todos os seus recursos.
MarcusJ

2
@MarcusJ Escrever um wrapper em torno de um kit de ferramentas é claramente não trivial, não importa 4 ou mais - mas se você acha que é assim tão fácil, você pode tentar. Quanto à idéia de que isso poderia ser alcançado usando apenas pré-processamento condicional ... você deve estar brincando, certo?
underscore_d

O @MarcusJ libui é exatamente isso (embora sem o suporte do KDE).
Demi

Quero acrescentar que agora você pode usar o Qt / QML com o .NET. Você não precisa tocar em C ++. github.com/qmlnet/qmlnet PS: Eu sou o autor.
Paul Knopf

26

Parte disso é licenciamento. Consulte https://en.wikipedia.org/wiki/Qt_(software)#Licensing para obter um pouco do histórico de licenciamento. Até 2000, pessoas que se preocupavam muito com o código aberto, não usavam o Qt. Período. (De fato, essa era a motivação original para o desenvolvimento do Gnome.) Até 2005, as pessoas que queriam lançar o software livre para Windows não usavam o Qt. Mesmo após essa data, as pessoas que queriam software livre sob algo diferente da GPL, simplesmente não tinham a opção de usar o Qt. Portanto, qualquer projeto de software livre anterior a essas datas não poderia usar o Qt. E, é claro, as pessoas que escrevem código proprietário tiveram que pagar pelo privilégio.

Além disso, não é como se houvesse escassez de outras opções. Por exemplo , WxWidgets , GTK + e Tk são todos kits de ferramentas de código aberto e plataforma cruzada.

Além disso, por muito tempo, o Windows era tão dominante na área de trabalho que muitos softwares estavam contentes em rodar apenas no Windows. Se você instalar o conjunto de ferramentas da Microsoft, é mais fácil usar as coisas proprietárias da Microsoft do que se preocupar com qualquer outra coisa, e muitos programadores fizeram exatamente isso.


1
@btilly: GTK + é multiplataforma. Por exemplo, o cliente Pidgin IM é gravado no GTK +.
Billy ONeal

1
Ok, no entanto, é possível 'de alguma forma' para ser executado no Windows :)
Dehumanizer

6
Basta instalar o GIMP no Windows e dar uma olhada.
User281377

2
Sim, e o GIMP funciona bem no Windows, mas certamente não se encaixa na aparência da interface do usuário do Windows 7.
Alan B

5
Pidgin é provavelmente um exemplo melhor do GTK no Windows. Não faz nada sofisticado, mas se encaixa e pode durar 10 anos ou mais?
Brendan Long

14

Eu concordo com quase todas as razões discutidas acima, no entanto, muitas pessoas aqui disseram que não usariam o Qt por causa da sobrecarga extra que isso traz consigo. Eu discordo disso porque todas as linguagens mais comuns hoje em dia (Java, C # e Python) carregam uma grande quantidade de sobrecarga.

Em segundo lugar, o Qt torna a programação com C ++ tão fácil e direta que compensa os recursos extras que usa. Eu me deparei com vários aplicativos de console escritos em Qt, em vez de C ++ padrão, devido à facilidade com que eles podem ser escritos.

Eu diria que a produtividade do Qt é maior que a do C / C ++, mas menor que as linguagens como Python.


2
Eu acho que é tudo relativo à experiência do indivíduo, porque eu posso codificar OK no C ++ 14, mas toda vez que olho para algum código Qt, tenho que apertar os olhos para reconhecê-lo como a mesma linguagem ... então certamente acho que é o aumento unânime da produtividade que você está sugerindo aqui.
underscore_d

1
@underscore_d obviamente, se você conhece C ++ muito bem e não conhece o Qt, não será mais produtivo com o último. Mas quando você conhece C ++ e Qt, a estrutura está realmente tornando muitas coisas mais fáceis e rápidas de implementar (C ++ 11, 14 etc. estão preenchendo a lacuna, mas ainda não totalmente).
Ymoreau 2/08

11

Isso realmente não é uma tentativa de iniciar uma guerra de chamas, eu só queria abordar alguns dos pontos.

Provavelmente, o motivo real pelo qual o Qt não é mais amplamente usado é o C ++ e menos pessoas usam o c ++ para aplicativos de desktop.

Qt não é uma biblioteca C ++. Requer uma etapa de compilação separada, o que torna o processo de criação muito mais complicado quando comparado com a maioria das outras bibliotecas.

O vs-addin para visual studio faz isso automaticamente, assim como o próprio processo de criação de linha de comando do Qt. O compilador de recursos usado para criar as caixas de diálogo para o MFC também é uma etapa separada, mas ainda é c ++.

Qt é uma grande quantidade de fontes, que deve estar presente e pré-instalada em qualquer máquina usada antes da compilação. Isso pode tornar a configuração de um ambiente de construção muito mais entediante.

Há um download binário para cada versão do visual studio e a compilação a partir da fonte é um único comando. Eu não vejo o tamanho da fonte do SDK hoje em dia. O Visual Studio agora instala todas as bibliotecas C ++ em vez de permitir que você escolha, como resultado, o tamanho da instalação do compilador é> 1 GB.

Está disponível apenas na LGPL, o que dificulta o uso da implantação binária única quando é necessário liberar sob uma licença mais restritiva ou menos restritiva.

A LGPL se aplica apenas à lib, não afeta o seu código. Sim, significa que você precisa enviar DLLs em vez de um único binário (a menos que você pague), mas em um mundo em que você precisa baixar um tempo de execução Java ou uma atualização .Net para um pequeno utilitário, isso não é um problema. Também é menos problemático em plataformas com uma única ABI, para que outros aplicativos Qt possam compartilhar as bibliotecas.

Em alguns casos, simplesmente não se parece com programas nativos. O design de uma interface do usuário única para todas as plataformas inerentemente não parecerá correto quando movido de máquina para máquina, por vários motivos de estilo visual.

É suposto usar widgets e temas nativos. Devo admitir que faço principalmente aplicativos técnicos, para que meus usuários não se preocupem muito com estilo. Especialmente no Windows, a nova moda de ter todo o estilo de widget de smartphone significa que existe cada vez menos um padrão.


1
Muitas empresas de software grandes criam aplicativos comerciais em C ++, mas não conheço muitas que usam o QT. Portanto, embora eu entenda que desenvolvedores não C ++ podem evitar o QT, há outros motivos para evitá-lo, mesmo quando você estiver escrevendo um aplicativo C ++, ao que parece. Na verdade, não há realmente nenhuma linguagem de plataforma cruzada e kit de ferramentas da GUI que não encontre falhas. Parece que o desenvolvimento de plataforma cruzada é MUITO DURO, e que fazê-lo bem nunca é fácil ou gratuito, e que a promessa que o QT faz (escreva sua GUI uma vez e reutilize essa GUI em todos os lugares) não é suficiente.
Warren P

A maioria dos softwares C ++ para desktop está no MFC porque foi iniciada há 20 anos ou usa um kit de ferramentas interno iniciado há 20 anos para evitar o MFC (por exemplo, MS-Office ou Autocad). Duvido muito que esteja sendo escrito em C ++ / CLR com WPF. Mas, mesmo sem considerações entre plataformas, considero o Qt o melhor (ou o menos pior!) Kit de ferramentas para desktop. Como a maioria das pessoas que estão se movendo em direção a uma extremidade dianteira Webby (possivelmente em QtQuick / QML) e um ++ backend servidor C - o que provavelmente vai usar sinais QT / ranhuras, mas nenhuma gui
Martin Beckett

Concordo. Pior. E mesmo em aplicativos somente para Windows, eu prefiro depurar problemas de QT do que problemas de MFC.
Warren P

@ WarrenP - sim, não sinto falta de pesquisar no codeproject por todas as coisas que faltam no MFC. Mas com o novo amor encontrado pelo código nativo da MSFT - eles não fizeram muito para facilitar a escrita de uma GUI.
Martin Beckett

7

O motivo é simples: ele não possui boas ligações para todos os idiomas comuns e nem sempre é magicamente apropriado para o trabalho em questão.

Use a ferramenta certa para o trabalho. Se estou escrevendo um aplicativo de linha de comando simples, por que eu iria inchar o Qt apenas por isso?

Como uma resposta mais geral (que eu posso dar porque sou relevante aqui), alguns programadores simplesmente nunca experimentaram e decidiram usá-lo. Em alguns casos, não há outra razão específica a não ser que o programador nunca tenha encontrado uma necessidade e a tenha analisado.


1
Mas o Qt fornece a capacidade de gravar apenas aplicativos de console. Não é?
Dehumanizer

9
@ Desumanizador: não faço ideia. Mas por que eu o usaria para uma pequena ferramenta utilitária? Que benefício isso me traria quando posso escrever trivialmente o aplicativo apenas em C ++ padrão? Parece que você está procurando um motivo para usar uma biblioteca , que é uma maneira reversa de programar.
Lightness Races in Orbit

12
@ Deshumanizer: Como eu disse, essa é uma abordagem inversa. Quando encontrar uma necessidade de uma biblioteca, você saberá e poderá experimentar alguns e ver o que melhor se adapta às suas necessidades. Tentar reunir opinião sobre uma biblioteca quando você não tem um caso de uso é uma tarefa fácil.
Lightness Races in Orbit

3
"Se eu estou escrevendo um aplicativo simples de linha de comando, por que eu acrescentaria isso ao Qt", pelo menos, há pelo menos uma ferramenta não-GUI muito famosa, escrita em Qt - Doxygen :-)
Valentin Heinitz

4
@ Dehumanizer, por exemplo, quando você precisa lidar com arquivos, xml, unicode, json, regexp, concurency, bancos de dados, etc, etc, muito rápido e não deseja baixar, adotar, manter dezenas de bibliotecas de terceiros.
Valentin Heinitz

5

Frameworks como Qt são apropriadas quando você está mais preocupado com o seu produto procurando o mesmo em todas as plataformas do que com o seu produto de vista direita em todas as plataformas. Hoje em dia, cada vez mais, esses tipos de aplicativos estão migrando para tecnologias baseadas na Web.


4

Concordo que o Qt é uma estrutura legal para se trabalhar. Ainda assim, tenho vários problemas com ele:

  1. Está escrito em C ++, que é realmente uma linguagem de baixo nível. Só o fato de ser C ++ tornará cada programador Qt significativamente menos produtivo em comparação com os Frameworks escritos em outras linguagens. Meu principal problema com o C ++ como linguagem de desenvolvimento da GUI é que ele quase não tem noção de gerenciamento automático de memória, o que torna o processo de desenvolvimento muito mais propenso a erros. Não é introspectivo, o que torna a depuração muito mais difícil. A maioria dos outros kits de ferramentas principais da GUI possui alguma noção de gerenciamento e introspecção automáticos de memória.
  2. Todo kit de ferramentas de plataforma cruzada sofre com o problema de que apenas pode implementar o denominador menos comum de todas as plataformas suportadas. Isso e as diferentes diretrizes de interface do usuário em plataformas diferentes questionam muito a conveniência das GUIs de plataforma cruzada como um todo.
  3. O Qt está muito centrado na codificação de toda a sua interface do usuário. Mesmo que você possa usar o QtDesigner para criar algumas partes da sua interface do usuário, falta muito em comparação com, por exemplo, o Construtor de Interface (Cocoa / Obj-C) ou as ferramentas .Net.
  4. Embora o Qt inclua muitas funcionalidades de aplicativos de baixo nível, ele não pode ser comparado a ter uma estrutura personalizada para uma determinada plataforma. As bibliotecas nativas do sistema operacional para Windows e OSX são significativamente mais poderosas que as implementações do Qt. (Pense em estruturas de áudio, acesso ao sistema de arquivos de baixo nível etc.)

Dito isto, adoro usar o PyQt para prototipagem rápida de aplicativos ou aplicativos internos. Usar o Python para fazer toda a codificação alivia as preocupações com o C ++ e torna o Qt um local muito agradável.


Edite, em resposta a alguns comentários:

Quando escrevi sobre o Qt sendo escrito em C ++, não estava reclamando tanto do próprio Qt, mas mais do ambiente em que ele vive. É verdade que o Qt gerencia seus próprios recursos muito bem, mas todas as suas GUI relacionadas a O código não-Qt também deve ser escrito em C ++. Mesmo lá, o Qt fornece muitas ferramentas legais, mas, no final das contas, você precisa lidar com o C ++ nesse nível. O Qt torna o C ++ suportável, mas ainda é o C ++.

Quanto à introspecção, o que quero dizer é o seguinte: os casos mais difíceis de depurar são quando você tem um ponteiro para algum objeto que não se comporta da maneira que você pensa que deveria. Com o C ++, seu depurador pode procurar um pouco dentro do objeto (se houver informações de tipo no ponto thwt), mas mesmo isso nem sempre funciona. Tome, por outro lado, cacau na mesma situação. No Cocoa / Obj-C, você seria capaz de enviar mensagens ('funções de chamada') para um objeto dentro do depurador. Você pode alterar o estado dos objetos, consultar seus atributos, solicitar seu tipo e nome de função ... Isso pode tornar a depuração muito mais conveniente. Qt / C ++ não tem nada nem perto disso.


11
1. O Qt se preocupa com o gerenciamento de memória por si só, você não precisa chamar 'delete' após cada 'novo'. 1a. C ++ NÃO é uma linguagem de baixo nível, é uma linguagem de alto nível com 'habilidades' de baixo nível. 3. Concordo, mas o Qt fornece para criar uma interface do usuário com o QtDesigner e com 'código simples' ao mesmo tempo. 4. Concorde novamente, mas o Qt também fornece o uso de APIs nativas.
Dehumanizer

11
ao ponto 1: Eu acho que o c ++ possui um tipo de gerenciamento de memória semiautomático: se você usa ponteiros inteligentes como std :: auto_ptr ou boost :: shared_ptr etc., geralmente não precisa se preocupar em liberar memória. Esse tipo de contêiner também pode ser criado para outros recursos (arquivos, recursos do sistema que precisam ser liberados). O uso do padrão RAII ajuda muito no gerenciamento de memória e, à medida que cresce, você realmente não precisa se preocupar com memória.
deo

8
"Somente o fato de ser C ++ tornará cada programador Qt significativamente menos produtivo em comparação com os frameworks escritos em outras linguagens." [citation needed] #
Nathan Osman

4
@ SK-logic: Embora eu ache que entendo todas as palavras da sua terceira frase, não faço ideia do que você está dizendo. O que é um "nível de limite de abstração"? Por falar nisso, sua primeira frase é falsa, dada a definição da Wikipedia de "linguagem de baixo nível".
David Thornley

6
@ SK-logic: A metaprogramação de modelos é completa em Turing, e há pessoas inteligentes e conhecedoras o suficiente para tirar proveito disso. O RAII não é uma ótima coleta de lixo, mas o fato de funcionar para todos os tipos de recursos mais ou menos compensa isso. Agora, especificamente, que tipo de abstração funciona em Java, mas não em C ++?
David Thornley

3

Eu realmente gosto do Qt, mas é um pouco pesado para muitas aplicações. Às vezes você simplesmente não precisa desse nível de complexidade. Às vezes, você só precisa de algo simples, sem toda a sobrecarga do Qt. Nem todo aplicativo precisa ser orientado a eventos e o C ++ fornece um conjunto razoável de modelos. O Boost fornece outro conjunto muito bom e inclui muitas das funcionalidades de baixo nível (arquivo, soquete, ponteiros gerenciados, etc.) que o QT fornece.

Outras aplicações têm requisitos de licenciamento que não se adaptam bem à licença comercial da GPL, LGPL ou Qt. A GPL é inadequada para software comercial. A LGPL é inadequada para software vinculado estaticamente e a licença comercial custa dinheiro - algo que muitos não estão dispostos a pagar.

Alguns têm considerações de segurança ou estabilidade que não permitem bibliotecas complexas como o Qt.

Você precisa executar o moc para pré-processar suas fontes. Esse não é um problema enorme, mas pode ser assustador para o novo usuário. Muitos programadores acham que você precisa usar o qmake com o Qt, mas isso é um nome impróprio. É possível conectar o Qt em outros sistemas de compilação facilmente.

Alguns destinos têm muita memória ou restrição de CPU.

Existem algumas dicas específicas da plataforma. A maioria dessas pegadinhas não tem documentos. Crie um aplicativo suficientemente grande e você os encontrará e se perguntará o que está acontecendo (aviso de isenção de responsabilidade, a última vez que usei o Qt com raiva foi há mais de 18 meses, por isso pode ter melhorado).

É apenas C ++. Existem outras associações de idioma, mas elas tendem a ocultar ou a expor mal muitas funcionalidades para as quais você deseja o Qt.

Existem muitas razões para não usar o Qt, é por isso que existem alternativas. Se tudo o que você tem é um martelo, todo problema parecerá um prego.


3

A coisa mais importante, mas não mencionada. No grande projeto, uma coisa causa muitos problemas e código não necessário. Os mecanismos de slot de sinal do Qt são ineficientes. Os widgets Qt não fornecem sinais necessários para widgets simples de eventos. Por exemplo, você não pode definir sinais para onHover, onMouseEnter, onMouseLeave, onKeyReleased, onLostFocus, onGainFocus e etc. Até o widget mais complexo, como o QTreeWidget, fornece um ou dois sinais inúteis ultra simples.

Sim, você pode usar eventos MAS !!! você criou uma nova classe para cada widget com evento customizado. Isso é enorme eficiência perdida;

  • Você reescreve cada evento de objeto de widget customizado; há pequenas alterações.
  • Você perde todas as coisas do Qt Designer. Você precisa promover todos os widgets com eventos personalizados.
  • O projeto ficou maior e difícil de manter.
  • Você começou a não gostar do qt por causa disso. E começando a falar sobre como o .net fornece delegados, como é muito, muito mais melhor do que o slot de sinal, como os componentes .net (widgets) geralmente fornecem todos os eventos que você pode imaginar. E etc.

Um membro da minha faculdade escreveu uma nova classe de caixa de combinação para cada widget de caixa de combinação, porque ele teve que usar algum evento sem sinal. História real...

No entanto, o Qt é a melhor estrutura de interface do usuário C ++ até agora, com baixos e altos.


Sobre eventos e criação de novas classes: você pode usar filtros de eventos em classes que precisam reagir a eles.
MrFox

"Sim, você pode usar eventos, MAS !!! você criou uma nova classe para cada widget com evento personalizado. Isso é uma enorme eficiência perdida;" - NÃO EXATAMENTE. Acabo com o bool eventFilter que lida com vários widgets e depois instalo o EventFilter (this) em todos os widgets filhos. E isso não está perdendo eficiência e desempenho de programação! Na verdade, eu nunca uso "Widgets Promovidos" ... Largo apenas um widget vazio, instalo como eventFilter nele e reimplemento a maioria dos meus eventos na minha classe principal do cpp. Experimente, não doeu :) Você pode personalizar quase TUDO no Qt sem criar novas classes todas as vezes
21413

3

na minha opinião, aprender programação C ++ é mais simples do que cair em outras linguagens que escondem sua complexidade, e o programador não sabe o que realmente acontece em segundo plano. O Qt, por outro lado, adiciona alguns benefícios sobre o C ++, para torná-lo mais alto que o C ++ nativo. Portanto, o Qt C ++ é uma ótima estrutura para quem deseja desenvolver tarefas de baixo nível, ou de alto nível, da mesma maneira. C ++ é (por algumas práticas) uma linguagem complexa e simples. Complexo para quem não quer desafiar, simples para quem gosta. Não deixe por sua complexidade!


2

O motivo real não é técnico.

As pessoas são diferentes. Então, são as escolhas deles. A uniformidade não é uma característica humana.


É por isso que todas as pessoas andam sobre as pernas? Bem, quem tem pernas, pelo menos ...
DTECH
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.