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




