QT-C ++ vs C ++ genérico e STL [fechado]


19

Ultimamente, estou atualizando meu C ++ no Ubuntu QQ. Eu amo o framework Qt para tudo, especialmente para criar GUI's. Eu me familiarizei bastante com isso ao usar o PyQt nos últimos anos.

Ao usar o PyQt, tive alguns problemas que agora são mais pronunciados ao usar o C ++ com o Qt: Qt tem muitas extensões para o C ++ que são específicas do Qt - o QString é apenas um exemplo comum, sem mencionar a coleta automática de lixo. É possível escrever aplicativos Qt usando C ++ sem saber muito sobre C ++ e o STL.

Talvez eu precise entrar no mercado de trabalho novamente em breve e gostaria de considerar posições em C ++ - mas eu tenho medo de me vincular demais ao Qt limitará minhas habilidades de trabalhar com C ++ genérico, que antes eram bastante formidáveis, mas agora estão dormentes e enferrujados há muito tempo.

Devo evitar o Qt? Seria melhor usar WxWidgets ou GTK ++ para criar GUI's?

Qual é a melhor estrutura de GUI a ser usada que permite / requer o maior uso de C ++ genérico e do STL? Como me tornar mais comercializável como programador de C ++ quando se trata de estruturas de GUI, etc?

Respostas:


15

Eu não evitaria usar o Qt apenas por esses motivos. Você não é obrigado a usar todas as classes de utilitários do Qt; para aqueles que substituem o STL, você será forçado a usar o QString e, possivelmente, o QStringList. Além disso, geralmente há muito mais em um programa do que a GUI. Você sempre pode usar C ++ exclusivamente genérico para o restante do seu programa e usar o Qt apenas para a GUI.

Na minha opinião, trabalhar com STL tem mais a ver com entender quais estruturas de dados subjacentes são usadas e suas complexidades e, consequentemente, em quais momentos você deve usar cada contêiner. E quando se trata de programação C ++, trata-se especialmente de saber como usar o cabeçalho <algorítmo> muito essencial, que também deve funcionar nos contêineres do Qt, já que eles são compatíveis com STL.

Não vejo muito mal em usar todas essas extensões que o Qt fornece, desde que você saiba (ou tenha pelo menos uma idéia geral) de como elas são implementadas internamente. Verifique se coisas como Q_OBJECT, SIGNAL (), SLOT (), foreach () não são mágicas, mas macros que se expandem para instruções C ++ válidas. Por exemplo, não é tão complicado entender como as classes compartilhadas implicitamente e os relacionamentos pai-filho que fazem o Qt parecer mais com o Java são implementados. Você sempre pode tentar recriar algumas funcionalidades em um projeto separado, apenas para ver se você pode fazê-lo com C ++ genérico e não se sentir mal por usá-las no Qt.

Além disso, dê uma olhada nas bibliotecas do Boost. Eles fornecem utilitários extras que a biblioteca C ++ padrão não oferece, e são realmente uma boa maneira de se aproximar um pouco do C ++ genérico, pois seguem essencialmente as mesmas convenções que o C ++ genérico. Algumas das bibliotecas têm classes de modelo bastante complexas, e simplesmente tentar entender como elas funcionam é, por si só, um bom estudo em C ++. O Boost possui muitos utilitários que não podem ser encontrados no Qt e outros que implementam conceitos iguais ou semelhantes às de algumas classes do Qt e podem ser usados ​​em seu lugar.

Se você chegar ao mercado de trabalho trabalhando com C ++, é provável que trabalhe com o Qt ou outra estrutura que, da mesma forma, tenha suas próprias classes de utilitários que tentam simplificar o C ++.


4
+1 para "Você sempre pode usar C ++ exclusivamente genérico para o resto do seu programa e usar Qt apenas para a GUI."
precisa saber é o seguinte

@MahbuburRAaman - sim - este é um excelente conselho. Use o Qt apenas para GUI e o que é necessário conectar novamente. Escreva o restante usando Generic C ++, STL, Boost - as ferramentas que são usadas universalmente.
Vector

5

Concordo com a maioria dos elogios ao Qt, mas a pergunta era: Qual é a melhor estrutura de GUI a ser usada que permite / requer o maior uso de C ++ genérico e do STL? A esse respeito, o Qt é um pouco esquizofrênico: duplica contêineres e algoritmos STL com suas próprias reviravoltas. Ele também fornece contêineres diferentes do STL. A interoperabilidade entre Qt e STL nem sempre é fácil. Em alguns casos, leva algumas chamadas de função para começar a partir std::stringde QStringe para trás.

O wxWidgets tem uma opção para compilação STL, que usa contêineres STL exclusivamente - não há universo paralelo com substituições criadas em casa, como no caso do Qt. Ele também compila com um compilador C ++ padrão sem a necessidade de extensões não padrão. É uma estrutura GUI de qualidade que vale a pena considerar.

Você também pode dar uma olhada em gtkmm, que é um wrapper C ++ em torno do GTK +. Está mais perto de cumprir seu primeiro requisito do que o Qt.


1
'wxWidgets tem uma opção para compilação STL, que usa contêineres STL exclusivamente ...' - eu vejo - isso é importante saber. 'Em alguns casos, são necessárias algumas chamadas de função para passar de std :: string para QString' - entendido - ainda não a investiguei. Eu estou um pouco familiarizado com GTK e Wx - mas o Qt parece brilhar em comparação, pelo menos da minha perspectiva - C ++ NÃO é minha primeira língua - eu vim do mundo Clipper / Delphi e aprendi C ++ porque precisava lidar com o Win 32s etc.
vetor

2

Eu não me preocuparia muito em não usar bibliotecas STL específicas, como std :: string ou std :: iostream ou std :: vector. Os equivalentes de QT têm um sabor diferente, mas não estão muito distantes para causar qualquer problema.

A diferença mais idiomática na minha opinião parece ser o estilo de programação pesado para usar newna alocação. Enquanto para um programa QT, isso pode ser bom para a parte Gui, a virtude de C ++ e RAII é que você pode realmente manter muitos dados na pilha em vez da pilha. Ao mudar para escrever código não GUI, lembre-se disso.


1
o ponto que eu estava tentando enfatizar não é que a alocação de heap geralmente seja ruim, simplesmente não é a melhor coisa para variáveis ​​locais. As classes da GUI tendem a durar muito e são melhor alocadas no heap; as variáveis ​​locais que são temporariamente necessárias apenas permanecem bem na pilha. em C # com Garbace Collection, eles serão destruídos em breve, então o heap também é bom. Mas com new/deletechamadas manuais , isso não é tão fácil e propenso a erros. Nas seções críticas (manipulação de big data), isso pode fazer a diferença, especialmente as deletechamadas podem ser bastante lentas.
Wirrbel

1
isso não é um problema de 10000 objetos da interface do usuário, mas para estruturas de dados em árvore complexas com um milhão de entradas etc. onde uma vez poderia recorrer a maneiras mais inteligentes de alocar coisas (alocação em massa ou muitas classes de reforço escritas com inteligência etc.). Conclusão: o heap não é ruim, deve ser usado com inteligência. O modo Qt às vezes não é escalável para outras coisas. Ainda é um fabuloso kit de ferramentas na minha opinião.
Wirrbel #

Então, e o C ++ 11? ponteiros inteligentes etc parecem aliviar muitas de suas preocupações. Estou apenas começando a mexer com isso agora. Como eu disse, eu concordo que Qt KICK BUTT. Meu plano é usar o Qt para GUI e fazer o que mais for possível usando o C ++ 11 - o que parece render uma boa parte do Boost, por exemplo, obsoleto e fecha em grande parte as lacunas entre Java / C # e C ++ da velha escola. Tenho a sensação (a certa altura, a certa distância) de que uma combinação de Qt e C ++ 11 pode ser uma grande vencedora.
Vector

2
Eu acho que você entendeu: você tem muitas opções com C ++, com c ++ você deve escolher sabiamente. Ponteiros inteligentes, etc. também têm problemas. Farto do C #, você pode dar uma olhada no dlang.org, que faz muitas coisas melhores (GCed).
Wirrbel #

Enquanto isso, eu tenho que montar uma cadeia de ferramentas que suporte C ++ 11. Eu uso o codelite agora - IDE muito bom - mas pronto para uso (compilador GNU) ele não suporta 11, como acabei de descobrir ... Talvez eu pode conectar um compilador 11 compatível. Não vou começar com D ou Boo etc etc - como eu disse em questão, talvez eu precise entrar no mercado de trabalho novamente em breve e quero ter os principais idiomas para a comercialização, não o único. MUITOS trabalhos de Python por aí - pena que eu não aguento mais o Python!
Vector
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.