Lis 27 2009

Kurs Qt - Część 5 - Layout

Kategorie: Kurs Qt Programowanie Qt Śmietnik Techblog Matthew @ 21:51:16

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. #ifndef WINDOW_HPP
  2. #define WINDOW_HPP
  3.  
  4. #include <QWidget>
  5. #include <QHBoxLayout>
  6. #include <QPushButton>
  7. #include <QLabel>
  8. #include <QSpacerItem>
  9.  
  10. class Window : public QWidget
  11. {
  12.         QHBoxLayout *layout;
  13.         QSpacerItem *spacer;
  14.         QPushButton *button;
  15.         QLabel *label;
  16.         QLabel *label2;
  17.  
  18. public:
  19.          Window();
  20. };
  21.  
  22. #endif // WINDOW_HPP
  23.  

window.cpp:

  1. #include "window.hpp"
  2. #include <QTextCodec>
  3.  
  4. Window::Window()
  5. {
  6.         QTextCodec::setCodecForTr (QTextCodec::codecForName ("UTF-8"));
  7.  
  8.         layout = new QHBoxLayout();
  9.         setLayout(layout);
  10.  
  11.         label = new QLabel(tr("Etykieta"));
  12.         label2 = new QLabel(tr("Druga etykieta"));
  13.         button = new QPushButton(tr("Wciśnij mnie!"));
  14.  
  15.         spacer = new QSpacerItem(100, 1, QSizePolicy::Expanding, QSizePolicy::Minimum);
  16.  
  17.         layout->addWidget(label);
  18.         layout->addSpacerItem(spacer);
  19.         layout->addWidget(label2);
  20.         layout->addWidget(button);
  21. }
  22.  

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. #include "window.hpp"
  2. #include <QTextCodec>
  3.  
  4. Window::Window()
  5. {
  6.         QTextCodec::setCodecForTr (QTextCodec::codecForName ("UTF-8"));
  7.  
  8.         layout = new QGridLayout();
  9.         setLayout(layout);
  10.  
  11.         label = new QLabel(tr("Etykieta"));
  12.         label2 = new QLabel(tr("Druga etykieta"));
  13.         button = new QPushButton(tr("Wciśnij mnie!"));
  14.  
  15.         spacer = new QSpacerItem(50, 50, QSizePolicy::Expanding, QSizePolicy::Minimum);
  16.  
  17.         layout->addItem(spacer, 0, 0);
  18.         layout->addWidget(label, 1, 0, Qt::AlignCenter);
  19.         layout->addWidget(button, 1, 1, Qt::AlignCenter);
  20.         layout->addWidget(label2, 0, 1);
  21. }
  22.  

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. ;]

Komentarze:

  1. sirsimon:

    A screeny ;> Wreszcie nowa część ;)

  2. ith:

    Fajne, szkoda że troszkę późno, zdążyłem nauczyć się sam :D
    To może teraz coś co tygryski lubią najbardziej - bazy danych - temat na kilka tutków :)
    Potrafię już pracować w Qt z bazami danych mimo to z chęcią bym poczytał taki tekst :)

  3. Cykus:

    @ith Popieram, dosyć ciekawy temat.

  4. sirsimon:

    @ith A z czego się po lekcjach uczyło? :> Też bym coś więcej poczytał...

Dodaj komentarz: