O conceito de widget está explicado em Programação em GUI/Widgets.

No Qt, os widgets existem dentro de uma aplicação.

Analisando o primeiro programa

editar

Voltando ao "Hello, world" do capítulo anterior:

#include <qapplication.h>
#include <qlabel.h>

int main( int argc, char *argv[])
{
    QApplication app(argc, argv);
    QLabel label("Hello, world!", 0);
    app.setMainWidget(&label);
    label.show();
    return app.exec();
}

Vemos que dois objetos foram criados: a aplicação app, de classe QApplication, e o widget label, de classe QLabel.

label é o widget principal (na verdade, é o único) do programa. A sua criação da forma

    QLabel label("Hello, world!", 0);

indica que label contém o texto "Hello, world" (primeiro argumento) e que não está subordinado a nenhum outro widget (segundo argumento).

A classe QWidget

editar

Todas as classes de widgets tem como base a classe QWidget[1].

Seu construtor tem a forma:

    explicit QWidget ( QWidget * parent = 0, const char * name = 0, WFlags f = 0 )

Ou seja, é preciso especificar qual é o parent (pai/mãe) de cada widget.

Em um programa simples, haverá um único widget que será ancetral de todos os outros widgets; vários serão seus filhos, mas alguns serão (por analogia) netos, bisnetos, etc. É preciso indicar ao programa quem é este widget raiz; no "Hello, world" acima, isto foi feito através da linha:

    app.setMainWidget(&label);

Lista dos widgets disponíveis

editar

Uma lista dos widgets que herdam da classe QWidget:

  • QAxWidget, QButton, QFrame, QDialog, QComboBox, QDataBrowser, QDataView, QDateTimeEditBase, QDateTimeEdit, QDesktopWidget, QDial, QDockArea, QGLWidget, QHeader, QMainWindow, QMotifWidget, QNPWidget, QScrollBar, QSizeGrip, QSlider, QSpinBox, QSplashScreen, QStatusBar, QTabBar, QTabWidget, QWorkspace e QXtWidget.

Exemplo

editar
 

Este programa tem o objetivo de mostrar como é simples exibir vários widgets em um aplicativo. O widget raiz é o QVBox (Vertical Box) que empilha seus widgets filhos verticalmente. Um destes filhos é o QHBox (Horizontal Box); observa-se que os filhos do box horizontal são exibidos horizontalmente.

Estes widgets não fazem nada: os botões podem ser pressionados, pode-se entrar com texto nos campos de texto, pode-se mover o slider, mas não acontece nada de prático com estas modificações (a imagem que aparece à direita é um screenshot do programa, que foi chamado de qt_demo_1 - esta imagem, obviamente, é totalmente estática).

O programa também carece de estética: o objetivo é mostrar que se pode empilhar widgets.

#include <qapplication.h>
#include <qvbox.h>
#include <qhbox.h>
#include <qlabel.h>
#include <qpushbutton.h>
#include <qslider.h>
#include <qtextedit.h>
#include <qlineedit.h>

int main( int argc, char *argv[])
{
    QApplication app(argc, argv);
    QVBox vbox;

    QLabel label("Label", &vbox);
    QPushButton pbutton("Click here", &vbox);
    QSlider slider(Qt::Horizontal, &vbox);
    QTextEdit txt(&vbox);
    QHBox hbox(&vbox);
      QLabel label1("x =", &hbox);
      QLineEdit line("100", &hbox);
    
    app.setMainWidget(&vbox);
    vbox.show();
    return app.exec();
}

Referências

  1. QWidget - documentação oficial em inglês