Створення додатків із графічним інтерфесом. Методологія розробки додатків із використанням форм Як написати інтерфейс програми на c

Анотація: Вивчаються віджети – візуальні елементи, з яких складається графічний інтерфейс користувача, їх компонування, політика розмірів, сигнально-слотові з'єднання, елементи графічного інтерфейсу та їх використання.

13.1 Віджети (Widgets)

Віджети (Widgets) – це візуальні елементи, з яких складається графічний інтерфейс користувача.

Приклади віджетів:

  • Кнопка (клас QPushButton);
  • Мітка (клас QLabel);
  • Поле введення (клас QLineEdit);
  • Числове поле-лічильник (клас QSpinBox);
  • Рядок прокручування (клас QScrollBar).

У Qt є близько 50 готових класів графічних елементів доступних для використання. Батьківським класом для всіх віджетів є клас QWidget. Від нього успадковуються всі основні характеристики візуальних елементів, які ми ретельно розглянемо. Дослідження методів розробки програм з графічним інтерфейсом почнемо з прикладу.

Створимо порожній файл проекту. Запустимо майстри проектів та виберемо в розділі Projects (Проекти) пункт Other Project (Інший проект). Далі виберемо тип проекту Empty Qt Project (Порожній проект Qt). До файлу проекту додамо вміст:

TEMPLATE = app #Модулі Qt, які ми будемо використовувати QT += widgets #Додаємо модуль widgets для роботи з віджетами (необхідно для Qt5). TARGET = widget#Назва виконуваного файлу SOURCES += \main.cpp

Тепер створимо просту програмуз вікном, у якому ми виводитимемо напис. Встановимо розмір вікна та текст його заголовка, а також встановимо шрифт для напису. Для цього створимо файл main.cpp з таким змістом:

#include #include int main (int lArgc, char * lArgv ) ( // Створюємо об'єкт QApplication, який ініціалізує та налаштовує віконну програму, // керує її виконанням за допомогою циклу обробки подій QApplication lApplication (lArgc, lArgv); QLabel lLabel; // Створюємо віджет QLabel - мітка lLabel.setText ("I am widget!"); тексту lLabel.setAlignment (Qt::AlignHCenter | Qt::AlignVCenter); //Клас QFont використовують для налаштування параметрів шрифту. //Вибираємо сімейство шрифтів Arial Black і розмір 12. setFont (lBlackFont); // Задаємо шрифт для мітки lLabel.show (); обробки подій.

Як бачимо, елементи, з яких складаються інтерфейси в Qt мають власні позицію і розмір - так звану "геометрію" - і, таким чином, займають відповідну прямокутну ділянку на екрані (див. рис. 13.1). Також кожен із елементів має налаштування, які визначають його поведінку та вигляд.


Мал. 13.1.

Для створення структури віджети організовують до ієрархії за принципом "частина - ціле". Кожен із віджетів може містити інші віджети. Такий візуальний елемент стає "батьком" (батьківським віджетом) для елементів, які він містить. Зазначимо, що такі відносини не слід плутати з успадкуванням у C++ - відносин між класами в програмі. Відносини між віджетами є відносинами між об'єктами. Такі відносини породжують кілька наслідків:

  • батьківський елемент відповідатиме за видалення дочірнього елемента: якщо батьківський віджет видалять - він автоматично видалить і всі дочірні елементи;
  • батьківський віджет розміщує дочірні віджети у собі, частини дочірніх віджетів, які за межі батька будуть невидимими;
  • частина стану батьківського віджету передається дочірнім - це стосується деяких властивостей (видимість, активність) та стилів, що накладаються на візуальний елемент.

Віджети, які не мають батька (віджети верхнього рівня), мають вигляд окремих вікон у програмі. Розглянемо приклад. Назвемо новий проект ParentExample. Файл проекту буде містити звичайні для GUI-проекту налаштування:

TEMPLATE = app TARGET = ParentExample QT + = widgets

Для віджету, який ми будемо використовувати як головне вікно, створимо новий клас. Для цього у категорії Files and Classes (Файли та класи)оберемо розділ З++ і оберемо З++ Class (див. рис. 13.2).

Наступним кроком буде створення кількох елементів у вікні. Для цього відкриємо файл parentwidget.cpp та змінимо код конструктора класу. Для відображення елементів достатньо створити їх у конструкторі класу та задати ParentWidget як батька для них. Код parentwidget.cpp виглядає так:

#include "parentwidget.h" #include #include #include ParentWidget::ParentWidget (QWidget * parent) : QWidget (parent) ( //Створюємо мітку, вказуючи батьківський віджет - this, тобто екземпляр класу ParentWidget. QLabel * lLabel=new QLabel (this); //Позиція щодо лівого верхнього кутабатьківського віджету. lLabel ->setGeometry (50, 0, 100, 30); lLabel -> setText ("TextLabel"); //Текст на мітці. //Створюємо кнопку, задаємо "батька", геометрію та текст QPushButton * lPushButton = new QPushButton (this); lPushButton->setGeometry (50, 50, 100, 30); lPushButton->setText ("PushButton"); //Створюємо поле введення, задаємо "батька", геометрію та текст QLineEdit * lLineEdit = new QLineEdit (this); lLineEdit ->setGeometry (50, 100, 100, 30); lLineEdit -> setText ("LineEdit"); lLineEdit ->selectAll(); //Виділяємо текст у полі введення (просто для прикладу) //Нарешті змінюємо розмір батьківського віджету setGeometry (x(), y(), 300, 150); //і задаємо текст заголовка вікна setWindowTitle ("parent widgetExample"); )

Оскільки батьківським елементом є ParentWidget, то мітка (QLabel), кнопка (QPushButton) і текстове поле (QLineEdit) знаходяться в його межах. Позицію дочірніх віджетів ставлять щодо лівого верхнього кута батька. У цьому легко переконатися, змінивши розміри та позицію вікна нашої програми. Зверніть увагу на те, як ми створювали елементи інтерфейсу користувачау динамічній пам'яті використовуючи оператор new. Це гарантує, що елементи не видаляються після завершення роботи конструктора ParentWidget .

Всім доброго дня. У своїх минулих уроках я розповідав про створення консольних програм у середовищі Borland C++ Builder. Починаючи з цього уроку ми вивчатимемо C++ з прикладу графічних додатків. Хтось хоче навчитися створювати консолки. Може прочитати книгу "Мистецтво створення консольних програм на C++". Перший наш додаток буде програма яка виводить випадкове число. Відкриваємо борландію, тільки не створюємо консольну програму. Після запуску на екрані висвітиться форма:

Зверху буде панель інструментів:

Праворуч Інспектор Об'єктів та Список Форм:

Компоненти (на відміну від бейсика) вже поділені на вкладки. За назвою не важко здогадатися, компоненти якого типу розміщені на вкладці. Відкрийте вкладку standart та розмістіть компоненти на формі як у мене:

На кнопці буде напис Button1. Її треба змінити. У нижньому лівому вікні борляндії наведено властивості компомнентів їх треба змінити на наші:

У кнопки Caption (Напис) змінюємо на Сгенерувати

У мітки Label1 властивість Caption змінюємо на Число

У Edit1 властивість Text(текст у самому їсте) просто зітремо.

Після цих маніпуляцій форма буде схожа на мою:

З візуальним стилем закінчили, до речі більшість властивостей у борлядії схожі на бейсик чи дельфі. Поекспериментуйте з ними.

Тепер поговоримо про події. У кожного компонента є події, в них розміщується код, який буде виконаний при досягненні певних умов. Наприклад, у кнопки код у події Click буде виконаний коли ми на неї натиснемо і т.д.

Сьогодні будемо користуватися лише подією Click. Тиснемо двічі на кнопку і подаємо у вікно коду:

Автоматично утворилося подія Clickдля кнопки. Код як і консольний додаток розміщується між фігурними дужками. Пишемо код:

Void __fastcall TForm1::Button1Click(TObject *Sender) ( double aaa; //Сюди помістимо число сегенероване процесором String count; //Запишемо це ж число, але приведене до рядкового вигляду randomize; //Це потрібно щоб числа не повторювалися aaa=random (34)*43646; //Генеруємо будь-яке число count=FloatToStr (aaa); //Переводимо число в рядок за допомогою функції FloatToString Edit1->Text=count;

Алгоритм простий, ми оголошуємо змінну для зберігання в ній дробового числа і змінну для числа в рядковому вигляді. Справа в тому, що відразу згенероване чилсо не можна вивести в текстбокс (буде помилка Очікувався текст, а отримано число), тому за допомогою функції FloatToStr ми переводимо число в рядок і виводимо її в текстове вікно. Для виводу звертаємось (за допомогою знака -> (аналогічно точці в vb)) до властивості тексту Edit1 і виводимо туди текст. Ось поки що все.

До речі, питання на засипку: хто розмножується швидше комп'ютерні віруси, китайці, чи кролики?


Коментарі ()

Vitay

Артемка

"randomize; //Це потрібно, щоб числа не повторювалися." У мене однаково повторюються. що робити?

Андрій

Є 2 варіанти 1-використовувати "randomize();" або у рядку 6 ускладнити функцію напр. додавати ще й число секунд

Андрій

"секунд" або результат складання двох псевдовипадкових чисел ділене на секунди - чим більше факторів тим більше непередбачуване виходить число

Артемка Олексій(alex13sh)

randomize
це щоб числа не повторювалися при включенні програми
ну тобто. включив прогу тиснеш кнопку кілька разів
1)5
2)47
3)86
це я цілими числами
ну і якщо вимкнеш прогу і по-новому включиш при серійному натисканні кнопки буде теж самі числа з тією ж послідовністю
це без randomize, а знім такого не буде

А те, що повторюються таким чином
1)3
2)69
3)1
4)3
5)8
6)1
ЦЕ НЕ ВІДНОСИТЬСЯ ДО randomize
щоб такого уникнути Андрій уже відповів))

Begzod

у мене на комп'ютері visual c++.net . Не можу знайти підручники, вихідники по ньому. Допоможіть ПЖС.

Ali05

Бачив у книгарні підручник з Visual C++.Net "Микита Культин Основи програмування в Microsoft Visual C++ 2010", там якраз показано, як створювати графічні програми під Windows (WinForms).

Кулхацкер Нінтендо

цікаво, у чому полягає його " поганість " ?

Кулхацкер

Без вміння нормально викладати матеріал і привчанні вас, панів, до поганого стилю програмування, а-ля імена змінних/функцій транслітом.

Edward Кулхацкер

C++ - одна з найпотужніших мов програмування. Щодня на ньому пишуть сотні додатків, які часто використовують GUI. Однак робота з графікою не завжди зручна програмісту – у такому разі застосовують готові графічні бібліотеки. Вони дозволять зробити розробку графічної частини додатків максимально швидкою та зручною.

SFML

Qt

Кросплатформова бібліотека Cocos2D-X покликана спростити розробку мобільних ігор. Підтримує ті самі платформи, що і Qt. З плюсів варто відзначити доступність, зручність експлуатації та створення окремого конструктора ігор, заснованого на бібліотеці Cocos Creator. У списку ігор, що базуються на движку, є всесвітньо відома BADLAND, що працює на всіх доступних платформах.

Дещо ще

Якщо при створенні гри вам потрібно працювати з графікою та анімацією у великих обсягах, то краще використовувати Unity замість Cocos2D-X. Unity має можливість плавної інтеграції з такими інструментами, як Photoshop, Maya або Blender. У Cocos2D-X вся графіка додається ззовні і її посилаються з коду.

У Рунеті немає уроків з цієї бібліотеки, але на англійськоює чудовий курс від розробників.

Juce

Мабуть, одна із найвідоміших графічних бібліотек. GTK+ - графічний фреймворк, який широко застосовується в багатьох системах. Спочатку він замислювався як компонент GIMP, але за 20 років після випуску першої стабільної версіївін знайшов застосування у сотнях інших додатків.

Зараз GTK+ - повноцінний графічний фреймворк, який не поступається тому ж QT. Він підтримує різні мови програмування та продовжує розвиватися.

Дещо ще

Свого часу бібліотека створювалася як альтернатива Qt, яка була платною. GTK+ - один з небагатьох фреймворків, які підтримують мову C. Бібліотека кросплатформова, але є думка, що програми на Linux виглядають більш нативно, ніж на Windows або Mac (GTK+ добре підтримується навіть на KDE). Цікаво, що через деякі проблеми з кросплатформністю Wireshark перейшла на Qt.

Приклад першої програми можна переглянути на Вікіпедії.

Інші цікаві статті з C++ можна переглянути у нас.

Висновок

Вище представлені найбільш популярні технології для роботи з GUI не тільки C++, але іноді і іншими мовами (наприклад, Qt і GTK +). Однак завжди слід враховувати особливості тієї чи іншої технології. Випишіть список функцій своєї програми, ще раз прочитайте описи всіх бібліотек та фреймворків, і лише після цього вибирайте те, що дійсно підходить найбільше для проекту.

Міністерство освіти та науки Російської Федерації

Федеральна державна бюджетна освітня установа

вищої професійної освіти

«УФІМСЬКИЙ ДЕРЖАВНИЙ НАФТОВИЙ

ТЕХНІЧНИЙ УНІВЕРСИТЕТ"

Кафедра обчислювальної техніки та інженерної кібернетики

Створення програми з графічним інтерфейсом користувача серед microsoft visual studio 2010

Навчально-методичний посібник

для проведення лабораторних та практичних занять

зі студентами напряму

230100 (09.03.01) «Інформатика та обчислювальна техніка»

У навчально-методичному посібнику наведено теоретичні відомості, завдання для практичних та лабораторних робіт курсу «Програмування».

Посібник адресовано викладачам дисципліни, а також студентам напряму: 230100 «Інформатика та обчислювальна техніка».

Укладачі: Габдулліна А.А., ст. викладач каф. ВПС

Дружинська О.В., ст. викладач каф. ВПС

Рецензент: Філіппов В.М., к.т.н., доцент каф. ВПС.

1.Теоретичні відомості 4

1.1.

Основні поняття 4 1.2.Знайомство з додатком Windows 2010 4

Form у Microsoft

Visual Studio

1.3.

Елемент керування Form 7

1.5.

Функція MessageBox 9

3.Лабораторна робота. Розробка програм у середовищі Microsoft Visual Studio 2010 16

3.1.

Порядок виконання лабораторної роботи 16

3.2.

Завдання 1. Табулювання функції та обчислення її значень у зазначеному інтервалі із заданим кроком 16 3.3. 21

Індивідуальні завдання 19

  1. 3.4.

  1. Завдання 2. Обробка

двовимірних масивів

3.5.

Індивідуальні завдання 27

Теоретичні відомості

1.1. Основні поняття

Автоматизація інформаційних процесів у час представляється, насамперед, розробкою програмного додатка з графічним інтерфейсом користувача (GUI), управляючого потоками даних.

Графічний інтерфейс користувача (Graphical User Interface, GUI) - це система засобів для взаємодії користувача з пристроєм, заснована на представленні всіх доступних користувачеві системних об'єктів і функцій у вигляді графічних компонентів екрана (вікон, кнопок, смуг прокручування тощо).

    Найчастіше елементи інтерфейсу в GUI реалізовані на основі метафор та відображають їх призначення та властивості, що полегшує розуміння та освоєння програм непідготовленими користувачами. Таким чином, робота користувача здійснюється з екранними формами, що містять об'єкти керування та панелі інструментів із кнопками дій для обробки.

Стандартний графічний інтерфейс користувача повинен відповідати низці вимог:

Підтримувати інформаційну технологію роботи користувача із програмним продуктом;

Орієнтуватися на кінцевого користувача, який спілкується із програмою на зовнішньому рівні взаємодії;

Задовольняти принципу «шості», як у одну лінійку меню включають трохи більше 6 понять, кожне у тому числі містить трохи більше 6 опцій;

Методами називають набір дій, які може здійснювати об'єкт.

Подія – дія, розпізнаване об'єктом (наприклад, клацання мишею, натискання кнопки), котрій можна запрограмувати відгук, тобто. реакцію об'єкта на подію.

1.1. Hello, Qt!

Нижче наводиться текст найпростішої Qt програми:

1 #include 2 #include 3 int main(int argc, char *argv) 4 ( 5 QApplication app(argc, argv); 6 QLabel *label = новий QLabel("Hello, Qt!", 0); 7 app.setMainWidget(label); 8 label ->show(); 9 return app.exec(); 10 ) Тут, у рядках 1 і 2, підключаються визначення класів QApplication і QLabel .

У рядку 5 створюється екземпляр класу QApplication, який керує ресурсами програми. Конструктору QApplication передаються аргументи argc і argv, оскільки Qt може обробляти аргументи командного рядка.

У рядку 6 створюється візуальний компонент QLabel, який відображає напис "Hello, Qt!". У термінології Qt всі візуальні компоненти, з яких будується графічний інтерфейс, називаються віджетами(Widgets). Кнопки, меню, смуги прокручування та різноманітні рамки – все це віджети.

Одні віджети можуть містити в собі інші віджети, наприклад, головне вікно програми - це звичайнісінький віджет, який може містити QMenuBar, QToolBar, QStatusBar та ін. null) покажчик, який повідомляє, що цей віджет немає " господаря " , тобто. не входить у інший віджет. У рядку 7 призначається "головний" віджет програми. Коли користувач закриває "головний" віджет програми (наприклад, натисканням на кнопку "X" у заголовку вікна), програма завершує свою роботу. Якщо у програмі не призначити головний віджет, то вона продовжить виконанняфоновому режимі

навіть після того, як користувач зачинить вікно.

У рядку 8, мітка робиться видимою. Віджети завжди створюються невидимими, щоб у програміста залишалася можливість настроїти параметри відображення до того, як вони стануть видимими.

У рядку 9 виконується передача керування бібліотеці Qt. З цього моменту програма переходить у режим очікування, коли вона нічого не робить, а просто чекає на дії користувача, наприклад, натискання на клавішу або кнопку миші.(іншими словами - "повідомлення"), у відповідь на яке програма може викликати одну або більше функцій. У цьому сенсі додатки з графічним інтерфейсом кардинально відрізняються від звичайних програм, з пакетною обробкою даних, які прийнявши введення від користувача, вони самостійно обробляють його, видають результати та завершують свою роботу без подальшої участі людини.

Малюнок 1.1. Вікно програми у Windows XP


Тепер саме час перевірити роботу нашої програми. Але перш за все - необхідно, щоб у вас була встановлена ​​Qt 3.2 (або пізніша версія), а змінна оточення PATH містила коректний шлях до каталогу bin. (В Windows налаштуваннязмінної PATH виконується автоматично, в процесі встановлення бібліотеки Qt)

Скопіюйте текст програми у файл, з ім'ям hello.cpp, у каталог hello.

Перейдіть до цього каталогу та дайте команду:

Qmake -project вона створить платформо-незалежний файл проекту (hello.pro), а потім дайте наступну команду: qmake hello.pro Ця команда створить Makefile на основі файлу проекту. Дайте команду make , щоб скомпілювати програму, а потім запустіть її, набравши в командному рядку hello(у Windows) або ./hello(у Unix) або open hello.app(Mac OS X). Якщо ви працюєте у Windows і використовуєте Microsoft Visual C++, замість команди make ви повинні дати команду nmake . Як альтернативний варіант-- Ви можете створити проект Visual Studio з файлу hello.pro, запустивши команду: qmake -tp vc hello.pro і потім скомпілювати програму Visual Studio.

Малюнок 1.2. Мітка з форматованим текстом.


А тепер трохи розважимося. Змінимо зовнішній виглядмітки, додавши форматування тексту у стилі HTML. Для цього, замініть рядок

QLabel *label = новий QLabel("Hello, Qt!", 0);

на QLabel *label = новий QLabel(" " "Hello

Qt!


", 0); і перезберіть програму.

1.2.

Обробка сигналів.


Наступний приклад показує - як організувати реакцію програми на дії користувача. Ця програма містить кнопку, при натисканні на яку програма закривається. 2 #include 3 int main(int argc, char *argv) 4 ( 5 QApplication app(argc, argv); 6 QPushButton *button = новий QPushButton("Quit", 0); 7 QObject::connect(button, SIGNAL(clicked() ), 8 &app, SLOT(quit())); 9 app.setMainWidget(button); 10 button->show(); сигнали, сповіщаючи його про те, що користувач справив якусь дію або про те, що віджет змінив свій стан. Наприклад, екземпляри класу QPushButton надсилають додатку сигнал clicked() , коли користувач натискає кнопку. Сигнал може бути "підключений" до функції-оброблювача (такі функції-обробники Qt називаються слотами).

Таким чином, коли віджет надсилає сигнал, автоматично викликається слот. У прикладі ми підключили сигнал clicked() , від кнопки, до слоту quit() , екземпляра класу QApplication . Виклики SIGNAL() і SLOT() -- це макровизначення, докладніше ми зупинимося на них у наступному розділі. Тепер зберемо програму. Сподіваємося, що ви вже створили каталог quit і розмістили файл quit.cpp . Дайте команду qmake

для створення файлу проекту, а потім вдруге - для створення Makefile: Qmake -project qmake quit.pro Тепер зберіть програму командою make

і запустіть його. Якщо ви клацнете по кнопці "Quit" або натиснете на клавіатурі клавішу "Пробіл", то програма завершить свою роботу.

У наступному прикладі ми покажемо як можна використовувати сигнали та слоти для синхронізації двох віджетів. Ця програма пропонує користувачеві запровадити свій вік.


Зробити це можна або за допомогою кнопок керування лічильником, або за допомогою повзунка. Малюнок 1.4. Програма Age. Додаток містить три віджети: QSpinBox, QSlider і QHBox (область горизонтальної розмітки). Головним віджетом програми призначено QHBox. Компоненти QSpinBox і QSlider розміщені всередині QHBox і є

підлеглими


Наступний приклад показує - як організувати реакцію програми на дії користувача. Ця програма містить кнопку, при натисканні на яку програма закривається. 2 #include , по відношенню до нього. Малюнок 1.5. Віджети програми Age. 5 int main(int argc, char *argv) 6 ( 7 QApplication app(argc, argv); 8 QHBox *hbox = новий QHBox(0); 9 hbox->setCaption("Enter Your Age"); 10 hbox-> setMargin(6); 11 hbox->setSpacing(6); ), 15 slider->setRange(0, 130); (valueChanged(int)), 19 spinBox, SLOT(setValue(int)); ); 24) У рядках з 8 по 11 створюється і налаштовується QHBox.

Щоб вивести текст у заголовку вікна, викликається setCaption(). А потім встановлюється розмір порожнього простору (6 пікселів) навколо та між підлеглими віджетами.

У рядках 12 і 13 створюються QSpinBox і QSlider , яким, як власник, призначається QHBox . Не дивлячись на те, що ми явно не задали ні положення, ні розміри віджетів QSpinBox і QSlider, вони дуже акуратно розташувалися всередині QHBox. Власне для цього і призначений QHBox. Він виконує автоматичне розміщення підлеглих віджетів, призначаючи їм координати розміщення та розміри, залежно від їх вимог тавласних налаштувань

. У Qt є багато класів, подібних до QHBox, які позбавляють нас від рутинної роботи з ручного припасування положення і розмірів візуальних компонентів.

У рядку 20 встановлюється початкове значення (35) лічильника. Коли це відбувається, лічильник посилає сигнал valueChanged(int) , зі значенням вхідного аргументу, що дорівнює 35. Це число передається в слот setValue(int) віджета QSlider , який встановлює значення цього віджета рівним 35. Після цього QSlider посилає сигнал valueChanged(int) оскільки його значення щойно змінилося, викликаючи таким чином слот setValue(int) віджету QSpinBox . Але цього разу лічильник не посилає сигнал, оскільки його значення і так дорівнювало 35. Таким чином запобігає нескінченна рекурсія. Малюнок 1.6 ілюструє цю ситуацію.

Малюнок 1.6. Зміна одного значення викликає зміну іншого.


У рядку 22 QHBox робиться видимим (разом із усіма підлеглими віджетами).

Підхід до формування інтерфейсу Qt дуже простий для розуміння і надзвичайно гнучкий. У загальному випадку, програміст вибирає необхідні йому віджети, розміщує всередині областей вирівнювання (layouts), які у своє чергу беруть він обов'язки з розміщення віджетів, і налаштовує властивості віджетів. На заключному етапі встановлюються взаємозв'язки віджетів, через механізм сигналів і слотів, які зумовлюють поведінку інтерфейсу користувача.

1.3. Робота із довідковою системою.

Довідкова система Qt - це мабуть найголовніший інструмент будь-якого розробника. Вона описує всі класи та функції у цій бібліотеці. (Документація до Qt 3.2 включає більш 400 класів і 6000 функцій.) У цій книзі ви зустрінетеся з великою кількістю класів і функцій Qt, але далеко не з усіма. Тому необхідно, щоб ви самостійно ознайомилися з довідковою системою Qt.

Стилі віджетів
Скріншоти, які ми досі бачили, було отримано у Windows XP. Проте зовнішній вигляд віджетів змінюється, залежно від платформи, де запускається додаток. З іншого боку, Qt може емулювати зовнішній вигляд будь-якої з підтримуваних платформ.