lis 27 2009

Kurs Qt – Część 5 – Layout

Category: Kurs Qt,Programowanie,Qt,TechblogMatthew @ 21:51

Kolejna część kursu Qt. Tym razem zajmiemy się layoutami, które pozwolą nam uporządkować widgety w oknach naszych aplikacji. Przy okazji załatwią nam sprawę “ładnego” wyglądu okna w przypadku jego rozciągania.

Używanie layoutów w Qt nie jest jakoś szalenie trudne. Ot tworzymy widget, dodajemy do niego layout, na layout dodajemy kolejne widgety i zależnie od typu layoutu nam się ładnie rozkładają po całej powierzchni. Do wyboru mamy:

  • QVBoxLayout – layout pionowy,
  • QHBoxLayout – poziomy,
  • QGridLayout – siatka,
  • QFormLayout – dwukolumnowy, do dodawania etykiety wraz z odpowiadającą jej kontrolką.

Zajmijmy się najpierw QHBoxLayout. Da nam to obraz czego można się spodziewać (pominę plik main.cpp, chyba już każdy potrafi go sam zrobić? ;) ):

window.hpp:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#ifndef WINDOW_HPP
#define WINDOW_HPP

#include <QWidget>
#include <QHBoxLayout>
#include <QPushButton>
#include <QLabel>
#include <QSpacerItem>

class Window : public QWidget
{
   QHBoxLayout *layout;
   QSpacerItem *spacer;
   QPushButton *button;
   QLabel *label;
   QLabel *label2;

public:
    Window();
};

#endif // WINDOW_HPP

window.cpp:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include "window.hpp"
#include <QTextCodec>

Window::Window()
{
   QTextCodec::setCodecForTr (QTextCodec::codecForName ("UTF-8"));

   layout = new QHBoxLayout();
   setLayout(layout);

   label = new QLabel(tr("Etykieta"));
   label2 = new QLabel(tr("Druga etykieta"));
   button = new QPushButton(tr("Wciśnij mnie!"));

   spacer = new QSpacerItem(100, 1, QSizePolicy::Expanding, QSizePolicy::Minimum);

   layout->addWidget(label);
   layout->addSpacerItem(spacer);
   layout->addWidget(label2);
   layout->addWidget(button);
}

Pewną niewiadomą może być QSpacerItem. Służy on jako puste miejsce rozdzielające poszczególne elementy (lub jak wypełniacz komórek dla grida). Polecam poeksperymentować z wartościami QSpacerItema żeby uzyskać różne efekty rozłożenia widgetów. W linijkach od 17. do 20. mamy dodawanie kolejnych kontrolek do layoutu. Jak widać – żadna filozofia.

Trochę ciekawej wygląda zabawa z QGridLayout. Ponieważ kod nagłówka różni się niewiele (QGridLayout zamiast QHBoxLayout), więc pozwolę sobie na pokazanie tylko pliku z definicją klasy Window:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include "window.hpp"
#include <QTextCodec>

Window::Window()
{
   QTextCodec::setCodecForTr (QTextCodec::codecForName ("UTF-8"));

   layout = new QGridLayout();
   setLayout(layout);

   label = new QLabel(tr("Etykieta"));
   label2 = new QLabel(tr("Druga etykieta"));
   button = new QPushButton(tr("Wciśnij mnie!"));

   spacer = new QSpacerItem(50, 50, QSizePolicy::Expanding, QSizePolicy::Minimum);

   layout->addItem(spacer, 0, 0);
   layout->addWidget(label, 1, 0, Qt::AlignCenter);
   layout->addWidget(button, 1, 1, Qt::AlignCenter);
   layout->addWidget(label2, 0, 1);
}

Różnica polega na sposobie dodawania elementów. Możemy dodatkowo ustalić w której kolumnie i wierszu ma się znaleźć dany widget czy spacer (nie musimy podawać wcześniej liczby kolumn i wierszy, Qt samo odpowiednio dostosuje QtGridLayout) oraz wyrównanie elementu w komórce.

To tyle tym razem. Z okazji nadchodzących Mikołajek postaram się przygotować coś z nadchodzącego Qt 4.6. Jak znajdę odpowiednie ilości motywacji to może nawet zrobię 3 części kursu o ciekawych zastosowaniach Qt 4.6. ;]

Zostaw odpowiedź

Subskrybuj bez komentowania.