Qt/Widgets
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 | editar código-fonte]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 | editar código-fonte]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 | editar código-fonte]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 | editar código-fonte]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();
}