Um Programa que Faz Alguma Coisa



Pais e Filhos, quer dizer, e Signals/Slots
ANTERIOR
Página Inicial Tipos de Janela do Qt
PRÓXIMA


Criado em 26/09/2010 às 20:50

     



Foi visto na página anterior como relacionar widgets, pais e filhos. Mas vamos pensar sobre isso por um momento. Se você fez o exercício 1, você percebeu que ao usar dois comandos show() para duas widgets criadas duas janelas são abertas. Você também viu na página anterior que quando criamos o botão dentro da label, ele sobrescreveu parte da label, com isso nós chegamos a seguinte conclusão:



Como fazer com que os widgets filhos, fiquem distribuidos verticalmente como mostrado na figura acima? Existe uma classe que faz exatamente esse papel no Qt (o papel do pontilhado azul), mas atenção ela não é uma widget. É um layout, a classe QVBoxLayout.
Todos os widgets que estiverem contidos no QVBoxLayout (abreviação de Vertical Box Layout) ficarão verticalizados. Como funciona?

Fragmento de Código 1. Utilização do Layout Vertical.
        //Criação das widgets
        WidgetQualquer *um = new WidgetQualquer;
        WidgetQualquer *dois = new WidgetQualquer;

        //Criação do Layout e adição das widget a serem horizontalizadas
        QVBoxLayout *layout = new QVBoxLayout(&mamae);
        layout->addWidget(um);
        layout->addWidget(dois);
	
        //Exibindo a janela mamae e todos os filhos
	mamae.show();
	


O nosso layout vertical não é adicionado à janela mãe, ele é aplicado à janela mãe. Pense assim: Quem é adicionado à janelas mãe são widgets, Layouts não são "hierarquizados". Layouts simplesmente dizem "Ae seus pentelho! essa ai é a senhora sua mãe! Vê se não vão sair da linha hein! vazei!" E a partir do momento que o layout entrega os filhotes, agora eles são filhos. O layout é, automaticamente, o elo entre a mãe e os filhos! Mas não é filho!

Na página anterior, nos usamos uma QLabel como mãe.. mas se ela só armazenou outra widget, então podemos fazer dela uma coisa menos complicada! Porque não apenas uma widget? Se nos regredirmos na complexidade das nossas widgets pela linha de herança vamos acabar, na maioria das vezes, na classe QWidget ou QObject. Isso quer dizer que todas as widgets tem pelo menos um pedacinho comum entre elas. E o que acontece ao avançar na hierarquia é uma diferenciação das widgets! Então vamos criar uma classe QWidget para funcionar apenas como um container. O Código 5 mostra todos os conceitos vistos acima em uso, num programa que , ao digitar, ele exibe exatamente oque você digitou na label abaixo:



Código 5. Finalmente um programa que faz alguma coisa (main.cpp).
#include <QApplication> //QObject-QCoreApplication-QApplication
#include <QLabel>       //QObject-QWidget-QFrame-QLabel
#include <QLineEdit>    //QObject-QWidget-QLineEdit
#include <QVBoxLayout>  //QObject-QLayout-QBoxLayout-QVBoxLayout

int main(int argc, char *argv[])
{

	QApplication app(argc, argv);
	
        //Quem vai armazenar os outros widgets
	QWidget janela;

        //Criação das widgets
        QLineEdit *campoTexto = new QLineEdit;
        QLabel *linhas = new QLabel("Digite acima para muda esta frase");

        //Quem vai alinhar os 2 widgets criados
        QVBoxLayout *layout = new QVBoxLayout(&janela);
        layout->addWidget(campoTexto);
        layout->addWidget(linhas);
	
        //Fazendo o programa funcionar

        QObject::connect(campoTexto, SIGNAL(textChanged(QString)), linhas, SLOT(setText(QString)));

	
    //Exibindo o QWidget janela e todos os filhos
	janela.show();
	
	return app.exec();
}


Note, pelas diretivas #include, que as classes QVBoxLayout e as demais (com exceção da QApplication) se diferenciam no momento do pulo do QObject pra QWidget ou QLayout. A nossa janela container será do tipo QWidget. Em seguida duas widgets são criadas, uma label e um campo de texto (QLineEdit, você já conhece 3 widgets so far!) . Logo após, o layout é criado "tendo janela como mãe" (na verdade, o layout é criado sabendo pra quem ele vai entregar os filhos), widget são adicionados ao layout. A função connect é o que faz o programa funcionar. Consultando o Qt Assistant você facilmente descobre quais são os "SIGNALs padrões" do QLineEdit e os "SLOTs padrões" do QLabel. No caso utilizamos textChanged e setText respectivamente.

Existem mais tipos de layouts, QHBoxLayout, QGridLayout. Eles serão usados nas páginas posteriores. Se você não quiser decidir qual será a janela a qual o layout será aplicado no momento da sua criação, você poderia criá-lo sem janela mãe, adicionar os widgets, e "entregar à mãe" da seguinte forma: janela->setLayout(layout).

Na próxima página, os três conceitos principais de janelas do Qt: Dialogs, Widgets e MainWindows!!





     


Pais e Filhos, quer dizer, e Signals/Slots
ANTERIOR
Página Inicial Tipos de Janela do Qt
PRÓXIMA


Comentários: Um Programa que Faz Alguma Coisa

Se você tiver alguma sugestão ou dúvida, por favor, preencha o formulário abaixo. O seu comentário só será adicionado após uma verifição do conteúdo.



Nome*:

Email*:

Mensagem*:


Nenhum comentário sobre essa página! Seja o Primeiro!