Gerenciar telas no QT

651 views
Skip to first unread message

André Prado

unread,
Apr 11, 2013, 4:03:49 PM4/11/13
to sis_emb...@googlegroups.com
Galera estou desenvolvendo uma aplicação para Arm com múltiplas telas, desenhei as telas no Qt Creator e cada tela tem seu UI que gera um .h e um .cpp.

Quero fazer a navegação entre as telas mas não acho uma forma eficiente de faze-la, tentei criar uma nova segunda janela em um onclicked da main window escondendo a mainwindow e mostrando a segunda janela mas não ficou muito bom...
Provavelmente vou ter cerca de 100 telas diferentes, alguém já brincou com isto?

Abs

--
Att
André

Caio

unread,
Apr 11, 2013, 4:13:31 PM4/11/13
to sis_emb...@googlegroups.com
@André ,

Gostei do assunto estou começando a desenvolver um sistema parecido,
mas vamos tentar optar por webkit e fazer as telas em html.

abs
> --
> Você está recebendo esta mensagem porque se inscreveu no grupo
> "sis_embarcados" dos Grupos do Google.
> Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie
> um e-mail para sis_embarcado...@googlegroups.com.
> Para postar neste grupo, envie um e-mail para
> sis_emb...@googlegroups.com.
> Visite este grupo em http://groups.google.com/group/sis_embarcados?hl=pt-BR.
> Para obter mais opções, acesse https://groups.google.com/groups/opt_out.
>
>



--
----------------------------------------------
Caio Pereira

Fernando Martines

unread,
Apr 11, 2013, 4:13:32 PM4/11/13
to sis_emb...@googlegroups.com
Oi André.

Uma opção é manter apenas uma janela (se a sua app não for MDI, pode ser uma instância de QMainWindow)  e criar várias views (QWidget) para cada tela. A navegação entre as telas pode ser feita pela alteração do widget na propriedade centralWidget da janela (pelo método setCentralWidget()).

Espero que ajude.

[]'s
~Fernando Martines



2013/4/11 André Prado <andrep...@gmail.com>

--
Você está recebendo esta mensagem porque se inscreveu no grupo "sis_embarcados" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para sis_embarcado...@googlegroups.com.
Para postar neste grupo, envie um e-mail para sis_emb...@googlegroups.com.
Visite este grupo em http://groups.google.com/group/sis_embarcados?hl=pt-BR.
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.
 
 



--
~Fernando Martines

André Prado

unread,
Apr 11, 2013, 4:14:35 PM4/11/13
to sis_emb...@googlegroups.com
Webkit com GWT? O mGWT?
Para sistemas de tempo real onde é necessário plotar fasores a cada 100 ms, por exemplo, será que da conta?
De qualquer jeito vou utilizar mGWT para um projeto pessoal que não precisa de tanto desempenho e vai rodar em android :) se quiser criar outro topico no sisembarcados.

abs


2013/4/11 Caio <cai...@gmail.com>



--
Att
André

André Prado

unread,
Apr 11, 2013, 4:15:33 PM4/11/13
to sis_emb...@googlegroups.com
Fernando no caso cada view eu posso editar com o QtCreator em um arquivo .ui separado? E o que é uma aplicação MDI? Desculpa a ignorancia sou bem novo neste assunto de telas hehe

abs


2013/4/11 Fernando Martines <fernando...@gmail.com>



--
Att
André

Caio

unread,
Apr 11, 2013, 4:16:13 PM4/11/13
to sis_emb...@googlegroups.com
Ainda não definimos, estamos na fase de planejamento.

É realmente pra realtime acho que não rola, no nosso caso não temos
essa premissa... ainda! rs

abs

Fernando Martines

unread,
Apr 12, 2013, 8:17:31 AM4/12/13
to sis_emb...@googlegroups.com
Oi André,

Recomendo que utilize o QtCreator sim para criação de UI. Ele facilita um bom tanto o desenvolvimento de suas telas.

Você pode criar novos widgets usando a opção "Qt Designer Form Class" com o template "Widget". Você terá 3 arquivos de código-fonte para cada widget (.h, .cpp, .ui).

A partir daí você pode começar a codificar a lógica de cada tela da aplicação em separado.

Em casos mais sofisticados, você poderia projetar uma tela "template" e criar novas telas a partir desta usando o conceito de herança em OO, reutilizando código comum entre as telas. 

Indo um pouco mais além, você pode implementar a arquitetura da aplicação baseando-se no padrão MVC (Model/View/Controller). Usando o modelo de programação de signals/slots no Qt, o código fica bem coeso e com baixo acoplamento.

Aplicações MDI (Multiple documents interface) são aplicações cuja interface gráfica é baseada em uma janela principal e várias outras (children) que residem dentro da principal. Um exemplo típico é o MS-Word/Excel/Powerpoint etc. que são compostos de uma janela principal contendo o conteúdo de um ou mais arquivos em edição dentro dela. Já vi esta abordagem sendo usada para CRUDs em um Sistema de Informação também. Os comandos podem constar na janela principal e a aplicação deles é feita na janela-filha ativa. Podem-se aplicar operações como minimização, maximização etc. nestas jenalas-filhas dentro do contexto da janela principal. MDI são mais comuns em aplicações Desktop.

O seu oposto são as aplicações SDI (Single documents interfaces), que são a escolha mais comum quando o conteúdo das janelas são independentes entre si.

Em IHM/IHC de Sistemas Embarcados tenho visto mais o uso SDI com a abordagem de widgets para cada tela da aplicação. É uma maneira bem interessante de gerenciar o desenvolvimento de telas.

Espero que ajude.

Um abraço,

~Fernando Martines


André Prado

unread,
Apr 12, 2013, 8:31:30 AM4/12/13
to sis_emb...@googlegroups.com
Olá Fernando obrigado pela explicação, realmente estou desenvolvendo uma aplicação SDI.
Estou utilizando MVC e signals/slots, a nível de código fonte mesmo que fica a minha dúvida sobre o que fazer.

Quanto a aplicação inicializa na minha main faço o seguinte (codigo do QT basicamente)
QApplication a(argc, argv);
MainWindow w;
w.setWindowFlags( Qt::CustomizeWindowHint );
w.showFullScreen();
return a.exec();

Na minha main window eu tenho um botão "Waveforms" que abre a tela que plota os fasores em tempo real em coordenadas polares (esta tela com as regras de negócio já está pronta).

Eu estou declarando um *Waveforms (minha tela de fasores) como atributo privado da classe MainWindow e no slot onclick do botão waveforms eu estou dando um new na waveform e um hide na atual. 

Indo para tela waveforms eu não sei como fazer um botão que retorne para a MainWindow e também não sei se minha abordagem de dar um new na waveforms e ela como um atributo da main está correto, se for seguir esta abordagem vou ter que incluir todos os .h de todas as telas em todas as telas que ela faz referencia, é isto mesmo?? Parece que fica confuso...


Abraço e obrigado pela ajuda


2013/4/12 Fernando Martines <fernando...@gmail.com>



--
Att
André

Fernando Martines

unread,
Apr 12, 2013, 11:53:53 AM4/12/13
to sis_emb...@googlegroups.com
Oi André.

Há várias alternativas de implementação mas a mais direta e pragmática, na minha opinião, seria criar uma classe Controller que implemente o padrão Singleton. Nela ficariam, como atributos, todas as views (widgets) da sua aplicação. O controller pode inicializar as telas (usando Lazy Loading, se preferir) e gerenciar o fluxo entre as telas.

Ele é quem deve ter o conhecimento e ser responsável pelo controle da navegação entre as telas. Para isso, ele deve ter slots que serão conectados aos sinais de todos os controles das views (ele próprio, na inicialização das views, pode registrar-se para os eventos). Você pode, ainda, externar os controles nas views usando getters/setters de modo que o controller tenha acesso aos componentes UI da interface.

Assim, ao ser notificado que o botão de retorno da sua tela waveforms foi clicado, ele pode ocultar a janela (ou destruir o objeto para liberar a memória) e redefinir o centralWidget para aquela view que você pretende. 

Há controvérsias sobre o uso de um único controller para a solução (por poder ser visto como um God Object), mas, como dito anteriormente, optemos inicialmente pelo pragmatismo da solução. Na medida em que a aplicação crescer, você pode criar controllers especializados para conjuntos comuns de funcionalidades na aplicação. Refatoração sempre =)

Espero que ajude!

Um abraço,

~Fernando Martines


2013/4/12 André Prado <andrep...@gmail.com>



--
~Fernando Martines

André Prado

unread,
Apr 12, 2013, 12:01:44 PM4/12/13
to sis_emb...@googlegroups.com
Valeu Fernando! Vou implementar desta forma.

Um abraço
Reply all
Reply to author
Forward
0 new messages