Conselhos sobre arquitetura em QT/C++

143 views
Skip to first unread message

Gustavo Laureano

unread,
Aug 3, 2017, 6:53:11 AM8/3/17
to sis_embarcados
Bom dia senhores,

Surgiu aqui a necessidade de se fazer um software para PC para comunicar com o firmware que estou escrevendo, e resolvi me aventurar em aprender QT com C++
Pelas pesquisas que fiz, o correto é separar logica de interface e usar o paradigma signal-slot para fazer a comunicação entre os modulos pai, filho e neto..
Mas ao começar a desenvolver assim, vi que o número de signal/slots deverá ser relativamente alto (pelo menos para os meus padroes) e que um sinal (nos casos diretos) deverá propagar de uma ponta para a outra, por exemplo:

No meu caso tenho que o main() instancia a Classe "logica", essa classe por sua vez instancia algumas classes, entre elas a classe de "interface", e essa então instancia diversas classes de forms, entre eles um form com um "botao".. ficando assim:
main() > Logica > Interface > Janela > Botao

No caso de uma ação que deve ser diretamente disparada pelo botão, a logica do sinal fica:

botão>Janela>Interface>Logica. sendo necessário 3 "connects" diferentes (em 3 constructors diferentes) somente para 1 "ação", isso está correto? essa é realmente a forma usual de se desenvolver? ou perdi algo no aprendizado? (e eu já percebi também as vantagens do signal/slot, como a possibilidade de conectar diversos signals ou slots simultaneamente, essa flexibilidade é realmente interessante)

Como o pessoal mais experiente em QT da lista implementa esse tipo de comunicação entre pai-filho-neto ??
Podem me sugerir algum material extra para leitura?

Obrigado!

willian henrique

unread,
Aug 3, 2017, 8:35:17 AM8/3/17
to sis_emb...@googlegroups.com
Bom dia,

Uso o Qt para desenvolvimento de software PC e para linux embarcado a algum tempo e acho uma ferramenta fantástica. (principalmente pelo signal/slot)
A grande vantagem que vejo é a facilidade de modularizar o código, exemplo para interface de rede:

classe do cliente de rede  (genérico para todos os projetos) -> trata os eventos de rede (mantém a conexão e coisas do tipo), disponibiliza os pacotes de rede como um signal.
classe que trata os pacotes (específico para o protocolo/projeto) -> instancia a classe de rede e recebe os dados por slot, trata o protocolo específico da aplicação e emit os sinais para as classes cadastradas.
classe de interface gráfica (específico do projeto) -> recebe e gera os pacotes para serem enviados pela rede.

Um projeto que acho legal você dar uma olhada é o gqrx (https://github.com/csete/gqrx) toda parte de interface gráfica é feita com o Qt.

Só para finalizar não acho que necessário utilizar tantas interfaces de signals e slots, entretanto se você planejar a sua arquitetura assim também não vejo tantos problemas do ponto de vista de performance.

Abraços,
Willian Henrique


--
Você recebeu essa mensagem porque está inscrito no grupo "sis_embarcados" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para sis_embarcados+unsubscribe@googlegroups.com.
Para postar nesse grupo, envie um e-mail para sis_embarcados@googlegroups.com.
Acesse esse grupo em https://groups.google.com/group/sis_embarcados.
Para mais opções, acesse https://groups.google.com/d/optout.

Diogo Martins

unread,
Aug 3, 2017, 8:36:04 AM8/3/17
to sis_embarcados

Cara, eu desenvolvo no PyQT, que no final das contas é mesma coisa.
Então, a gente aqui não faz tantas camadas não. Geralmente a própria View tem "lógica" implementada, também não sabemos se é a melhor forma, mas é a que vem funcionando devido a facilidade de utilizar as variáveis da View em questão.
Eu uso signal/slot customizado e isso ajuda demais.

Acho que você deveria continuar com sua abordagem mesmo sendo mais trabalhosa, porém ela tende a não te amarrar.

Sobre material de leitura, a documentação do Qt é bem completa e o fórum para C++ me parece bem ativo.


--
Você recebeu essa mensagem porque está inscrito no grupo "sis_embarcados" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para sis_embarcado...@googlegroups.com.
Para postar nesse grupo, envie um e-mail para sis_emb...@googlegroups.com.
--

Grato,
Diogo Martins

Gustavo Laureano

unread,
Aug 3, 2017, 12:20:09 PM8/3/17
to sis_embarcados
Obrigado Willian, vou dar uma olhada nesse projeto!

E obrigado Antonio, sim, foi o que imaginei, usar signal/slot me deixa mais livre para a implementação segmentada, já está facilitando bastante aqui, e a documentação do QT é muito didatica também, já usei como base

entao parece que compreendi a essencia da abordagem.
No final das contas acho que nao serão tantos signal/slot implementados quanto imaginei, já que quando eu implemento o da logica>interface a primeira vez ele já fica disponível para ser conectado diversas vezes pelas classes dos forms....

No meu caso a aplicação tem diversas telas diferentes, e todas elas sao sincronizadas pela atualização do estado da maquina de estados que roda no firmware, entao a logica cuida de manter o link entre PC<>Device e de checar validade e CRC dos pacotes recebidos.. e quando uma atualização de parametro é recebida, a logica emite para a interface essa atualização

Cleiton Bueno

unread,
Aug 4, 2017, 10:20:35 AM8/4/17
to sis_embarcados
Legal que esta começando utilizar Qt Gustavo.

Signal & Slot é um mecanismo poderoso no Qt, legal também é saber usar a nova sintaxe de Signal & Slot com lambda no slot, já usei para chamar algo ou despachar


No mundo com Linux Embarcado saber trabalhar com estes caras fazem diferença:

QTextStream(http://doc.qt.io/qt-4.8/qtextstream.html)
QByteArray(http://doc.qt.io/qt-4.8/qbytearray.html)
QFile(http://doc.qt.io/qt-5/qfile.html)
QBuffer(http://doc.qt.io/qt-5/qbuffer.html)
QProcess(http://doc.qt.io/qt-5/qprocess.html)
QIODevice(http://doc.qt.io/qt-5/qiodevice.html)
QEventLoop(http://doc.qt.io/qt-5/qeventloop.html)
QNetwork(http://doc.qt.io/qt-5/qtnetwork-programming.html)
QtSerialPort(http://doc.qt.io/qt-5/qtserialport-index.html)
QtSerialBus(https://doc.qt.io/qt-5/qtserialbus-index.html)
QSocketNotifier(http://doc.qt.io/qt-5/qsocketnotifier.html)
QTimer(http://doc.qt.io/qt-5/qtimer.html)
Multithreading Qt (http://doc.qt.io/qt-5/threads-technologies.html)

Debugging(http://doc.qt.io/qt-5/debug.html)


Digo isso pois as vezes em sistemas embarcados, muitas vezes um processamento custoso em segundo plano pode "travar" sua interface, então lidando com os signals/slots destes caras, usando uma das derivações de Multithreading e disparando sinais conforme o uso, funciona show.


O repositório do Qt você tem acesso a tudo e se aprende muito com o fonte:

Qt Git Source
http://code.qt.io/cgit/

Marcelo Jo

unread,
Aug 4, 2017, 2:37:42 PM8/4/17
to sis_emb...@googlegroups.com
Antigamente o QT era de grátis (beem antigamente ok.. hehehe)

Como q é hoje o esquema, alguém pode explicar? 

--
Você recebeu essa mensagem porque está inscrito no grupo "sis_embarcados" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para sis_embarcados+unsubscribe@googlegroups.com.
Para postar nesse grupo, envie um e-mail para sis_embarcados@googlegroups.com.

Diogo Martins

unread,
Aug 4, 2017, 2:46:55 PM8/4/17
to sis_emb...@googlegroups.com

Para vender o produto que utiliza QT tem que pagar licença.
Projetos de uso interno/pessoal continua gratuito.


Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para sis_embarcado...@googlegroups.com.
Para postar nesse grupo, envie um e-mail para sis_emb...@googlegroups.com.

--
Você recebeu essa mensagem porque está inscrito no grupo "sis_embarcados" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para sis_embarcado...@googlegroups.com.
Para postar nesse grupo, envie um e-mail para sis_emb...@googlegroups.com.
--

Grato,
Diogo Martins

Alain Mouette

unread,
Aug 4, 2017, 2:53:29 PM8/4/17
to sis_emb...@googlegroups.com
Não é era grátis, era GPL ou $$
Agora até melhorou, quase tudo é LGPL...

Alain Mouette
=== Projetos especiais: <http://lnkd.in/dEu8cNq> ===
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para sis_embarcado...@googlegroups.com.
Para postar nesse grupo, envie um e-mail para sis_emb...@googlegroups.com.

Gustavo Laureano

unread,
Aug 4, 2017, 2:55:13 PM8/4/17
to sis_embarcados
Certeza Antonio?

Estou considerando o licenciamento LGPL...
Aonde a aplicação linka de forma dinamica com a lib do QT, assim daria para usar "comercialmente" sem comprar a licença..
Só precisa fornecer os meios para o usuário poder trocar qual lib do QT sua aplicação usa, mas isso nao é problema se o link for dinamico (ele troaria somente as DLLs do QT que sua aplicação usa)
Segue uma (otima e muito mais completa) explicação
http://www.embeddeduse.com/2016/04/10/using-qt-5-6-and-later-under-lgpl/

quem pode explicar isso melhor, acredito eu, é o @Cleiton!

@Cleiton, obrigado pelas indicações de leitura! Os seus posts no Embarcados sobre QT me ajudaram bastante nessas ultimas semanas! :D
E esse recurso de lambdas do C11 é uma mão na roda, já utilizei algumas vezes aqui (mas ainda preciso acostumar, comecei a programar em C++ junto com o QT, então até 2 semanas atrás conhecia apenas em teoria)

Alain Mouette

unread,
Aug 4, 2017, 2:55:32 PM8/4/17
to sis_emb...@googlegroups.com
Só lembrando, você pode vender produtos com uma lib LGPL

Também pode com GPL, mas tem que entregar o fonte...


Alain Mouette
=== Projetos especiais: <http://lnkd.in/dEu8cNq> ===

Diogo Martins

unread,
Aug 4, 2017, 2:58:51 PM8/4/17
to sis_emb...@googlegroups.com

@gustavo foi o que a responsável por licenças do meu projeto falou.


Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para sis_embarcado...@googlegroups.com.
Para postar nesse grupo, envie um e-mail para sis_emb...@googlegroups.com.
Acesse esse grupo em https://groups.google.com/group/sis_embarcados.
Para mais opções, acesse https://groups.google.com/d/optout.
--
Você recebeu essa mensagem porque está inscrito no grupo "sis_embarcados" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para sis_embarcado...@googlegroups.com.
Para postar nesse grupo, envie um e-mail para sis_emb...@googlegroups.com.
Acesse esse grupo em https://groups.google.com/group/sis_embarcados.
Para mais opções, acesse https://groups.google.com/d/optout.

--
Você recebeu essa mensagem porque está inscrito no grupo "sis_embarcados" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para sis_embarcado...@googlegroups.com.
Para postar nesse grupo, envie um e-mail para sis_emb...@googlegroups.com.
Acesse esse grupo em https://groups.google.com/group/sis_embarcados.
Para mais opções, acesse https://groups.google.com/d/optout.

--
Você recebeu essa mensagem porque está inscrito no grupo "sis_embarcados" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para sis_embarcado...@googlegroups.com.
Para postar nesse grupo, envie um e-mail para sis_emb...@googlegroups.com.
Acesse esse grupo em https://groups.google.com/group/sis_embarcados.
Para mais opções, acesse https://groups.google.com/d/optout.
--

Grato,
Diogo Martins

willian henrique

unread,
Aug 4, 2017, 3:53:53 PM8/4/17
to sis_emb...@googlegroups.com

@Gustavo Laureano - também entendo da mesma forma que você.

Alguém que já trabalhou com isso poderia dar o seu depoimento?

E para sistema embarcados quando não é possível trocar as bibliotecas como que fica?


Abraços,


Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para sis_embarcados+unsubscribe@googlegroups.com.
Para postar nesse grupo, envie um e-mail para sis_embarcados@googlegroups.com.
--
Você recebeu essa mensagem porque está inscrito no grupo "sis_embarcados" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para sis_embarcados+unsubscribe@googlegroups.com.
Para postar nesse grupo, envie um e-mail para sis_embarcados@googlegroups.com.

--
Você recebeu essa mensagem porque está inscrito no grupo "sis_embarcados" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para sis_embarcados+unsubscribe@googlegroups.com.
Para postar nesse grupo, envie um e-mail para sis_embarcados@googlegroups.com.

--
Você recebeu essa mensagem porque está inscrito no grupo "sis_embarcados" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para sis_embarcados+unsubscribe@googlegroups.com.
Para postar nesse grupo, envie um e-mail para sis_embarcados@googlegroups.com.
--

Grato,
Diogo Martins

--
Você recebeu essa mensagem porque está inscrito no grupo "sis_embarcados" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para sis_embarcados+unsubscribe@googlegroups.com.
Para postar nesse grupo, envie um e-mail para sis_embarcados@googlegroups.com.

Cleiton Bueno

unread,
Aug 8, 2017, 9:47:52 AM8/8/17
to sis_embarcados
Fico feliz que os artigos ajudaram @Gustavo.

Este link do Stubert que passou  sensacional, muito bom, é a melhor explicação.

É importante conhecer os Módulos x versão do Qt, a partir do Qt5.6 os LGPL "trivialmente" passaram a ser LGPLv3, e entre suas obrigações a cumprir esta a linkagem dinâmica das bibliotecas e a garantia(procedimentos e rotinas se necessário) para que consigam replicar o ambiente e executar sua aplicação, mas em si seu código pode ser fechado.

Recomendo a leitura dos links abaixo, principalmente o item 3.6 sobre LGPLv2/LGPLv3 e TIVOIZATION e DRM:

https://www.qt.io/faq/#_Toc_3_6
https://www.qt.io/qt-licensing-terms/


Quem tiver interesse recomendo entrar em contato com o Qt pois o custo da licença comercial varia de acordo com a tecnologia que ira utilizar, a licença é perpetua, o Boot2Qt abstraindo toda parte de buildsystem do Yocto e entregando uma image otimizada e até versões fastboot, solução para OTA, Debugging in Device, e o acesso aos módulos comerciais como Qt Charts, Qt Data Visualization e Qt Virtual Keyboard (GPLv3 ou Commercial).

Algo importante que acho compartilhar é uma versão para Startups:
https://www.qt.io/start-up-plan/

E o Qt Lite, algo muito novo ainda e que vai receber grandes esforços para chegar onde quer chegar, somente  disponível >Qt5.8:
http://blog.qt.io/blog/2016/08/18/introducing-the-qt-lite-project-qt-for-any-platform-any-thing-any-size/


No contexto geral, Qt evoluiu muitos quando "saltou" do Qt4.8 para Qt5, mudando modelo de negócios ano a ano o que é bom para um mercado adverso como é o Brasil, e este ano foi direcionado um contato para o mercado da América Latina o que antes era difícil para resolver, no qual estará presente no QtCon neste mês em São Paulo.


Um abraço.



Em quinta-feira, 3 de agosto de 2017 07:53:11 UTC-3, Gustavo Laureano escreveu:
Reply all
Reply to author
Forward
0 new messages