Qt: различия между версиями

Материал из Викиучебника — открытых книг для открытого мира
Содержимое удалено Содержимое добавлено
м →‎Англоязычные сайты о Qt: замена категории на шаблон для работы полки, removed: Категория:Программирование с помощью AWB
м →‎Англоязычные сайты о Qt: установка шаблона "по алфавиту" по консенсусу на форуме с помощью AWB
Строка 258: Строка 258:


{{Темы|Программирование}}
{{Темы|Программирование}}

{{По алфавиту}}

Версия от 22:02, 24 марта 2016

Qt — кроссплатформенная библиотека разработки GUI на С++.

Разработчики:

Отличается хорошей документацией, стабильностью, простотой освоения и написания кода.

Что такое библиотека Qt?

Библиотека Qt задумывалась и начиналась как кросс-платформенный тулкит (toolkit) для быстрой разработки графических интерфейсов (GUI) приложений на языке C++, с целью упростить жизнь программистов, пишущих на C++ кросс-платформенные, переносимые GUI-приложения, которые должны работать и в среде Windows, Symbian, и в среде Unix/Linux под X11, и на компьютерах Macintosh.

В настоящее время Qt значительно переросла рамки тулкита для разработки графических интерфейсов приложений. Она предоставляет использующему её программисту целостный фреймворк (framework), позволяющий при написании большей части приложения использовать только «родные» классы Qt и практически полностью отказаться от написания системно-зависимого кода, использования системных вызовов (будь то Win32 API или Unix system calls) или от изобретения собственных кросс-платформенных обёрток и «велосипедов». Классы Qt покрывают почти все потребности программиста. В Qt предусмотрены классы и для работы со строками, и для работы с файлами, сетью, базами данных, XML, и для обеспечения многопоточности в приложении, и многое-многое другое. По своим возможностям и богатству библиотека Qt сравнима с .NET Framework или с системой классов Java 2 EE.

Почему стоит использовать Qt?

Qt предоставляет программисту не только удобный набор библиотек классов, но и определённую модель разработки приложений, определённый каркас их структуры. Следование принципам и правилам «хорошего стиля программирования на C++/Qt» существенно снижает частоту таких трудно отлавливаемых ошибок в приложениях, как утечки памяти (memory leaks), необработанные исключения, незакрытые файлы или неосвобождённые дескрипторы ресурсных объектов, чем нередко страдают программы, написанные «на голом C++» без использования библиотеки Qt.

Важным преимуществом Qt является хорошо продуманный, логичный и стройный набор классов, предоставляющий программисту очень высокий уровень абстракции. Благодаря этому программистам, использующим Qt, приходится писать значительно меньше кода, чем это имеет место при использовании, например, библиотеки классов MFC. Сам же код выглядит стройнее и проще, логичнее и понятнее, чем аналогичный по функциональности код MFC или код, написанный с использованием «родного» для X11 тулкита Xt. Его легче поддерживать и развивать.

Кроме того, даже если программисту в данный конкретный момент не нужна кроссплатформенность для его конкретного приложения (например, планируется версия только для Windows или только для Macintosh), никто не может знать, что понадобится завтра. Бизнес-планы могут поменяться, и может оказаться и нужным, и выгодным выпустить версию для другой операционной системы или другой аппаратной платформы. В случае использования Qt для этого понадобится всего лишь перекомпиляция исходного кода. В случае же использования, например, MFC или «родных» системных API понадобится много тяжёлой работы по портированию, адаптации и отладке, а то и переписыванию с нуля существующего исходного кода для другой ОС или аппаратной платформы.

Многие компании-разработчики приложений Windows используют Qt ещё по одной причине: даже если код пишется и в обозримом будущем будет писаться только для платформы Windows и тестируется только на ней, возможность откомпилировать один и тот же исходный код на одной и той же платформе Windows двумя разными компиляторами (Microsoft Visual C++ и GCC/Win32) гарантирует лучшее качество исходного кода и лучшую его совместимость со стандартом C++. Что немаловажно для кода, который планируется длительно поддерживать и развивать.

Установка Qt 4.2.2. из исходных кодов под «Visual C++ 2005 Express Edition»

Достаточно будет установить «Microsoft Windows Core SDK». Если вам понадобится доустановить какой-нибудь другой SDK, вы сможете это сделать в «Установка и удаление программ» «Панели управления». Нужно поставить галочку с установкой переменных окружения, иначе придется их ставить самостоятельно, либо запускать перед сборкой Qt скрипт в SetEnv.

Настройка «Visual C++ 2005 Express Edition» под «MS Platform SDK».

См. здесь (англ.)

Обновите директории Visual C++

В разделе Projects and Solutions диалогового окна Options добавьте пути в следующих секциях:

  • Executable files: C:\Program Files\Microsoft Platform SDK\Bin;
  • Include files: C:\Program Files\Microsoft Platform SDK\include;
  • Library files: C:\Program Files\Microsoft Platform SDK\lib.

Замечание: Обновить директории можно другим способом, для этого нужно изменить файл VCProjectEngine.dll.express.config размещенный в \vc\vcpackages. Убедитесь что вы удалили файл «vccomponents.dat» размещенный в «%USERPROFILE%\Local Settings\Application Data\Microsoft\VCExpress\8.0» перед перезапуском Visual C++ Express Edition.

Обновите файл corewin_express.vsprops.

Этот шаг нужен для того, чтобы сделать в Visual C++ Express шаблон приложений Win32.

Измените файл corewin_express.vsprops, размещённый в C:\Program Files\Microsoft Visual Studio 8\VC\VCProjectDefaults:

AdditionalDependencies="kernel32.lib"

замените следующим:

AdditionalDependencies="kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib"

Настройка «Visual C++ 2005 Express Edition» под Qt 4.2.2.

Измените файл vsvars32.bat

(если вы установили Visual C++ 2005 Express Edition в папку C:\Program Files\Microsoft Visual Studio 8\, то файл должен находиться в папке C:\Program Files\Microsoft Visual Studio 8\Common7\Tools\)

в следующих местах:

@set INCLUDE=C:\Program Files\Microsoft Visual Studio 8\VC\INCLUDE;%INCLUDE%

замените строкой

@set INCLUDE=C:\Program Files\Microsoft Platform SDK\Include;C:\Program Files\Microsoft Visual Studio 8\VC\INCLUDE;%INCLUDE%

а

@set LIB=C:\Program Files\Microsoft Visual Studio 8\VC\LIB;C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\lib;%LIB%

замените строкой

@set LIB=C:\Program Files\Microsoft Platform SDK\Lib;C:\Program Files\Microsoft Visual Studio 8\VC\LIB;C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\lib;%LIB%

Скачивание и сборка

  • Скачайте Qt 4.2.2./Windows Open Source Edition и разархивируйте его в любую свободную папку (далее будем считать, что это папка C:\qt-win\).
  • Скачайте патч для Qt 4.2.2 и разархивируете его туда же.
  • Сборка (конфигурирование, компиляция и линковка)
    • Запустите «MS Visual C++ 2005 Express Edition».
    • Выберите пункт меню Tools->Visual Studio 2005 Command Prompt.
    • Наберите в командной строке cd c:\qt-win чтобы перейти в каталог с исходными текстами.
    • Наберите в командной строке installpath42.bat чтобы пропатчить исходные тексты.
    • Наберите в командной строке qconfigure msvc2005 чтобы произвести конфигурирование. На все запросы нажимайте 'y'.
    • После успешного конфигурирования, система попросит набрать nmake, так и сделайте. Процесс очень долгий.

Если у вас Service Pack 1

Замечание: конфигурирование для MS Visual C++ 2005 Express Edition SP1 может не пройти, нужно подправить исходный текст: в файле C:\qt\src\corelib\tools\qmap.h кусок кода:

 template <class Key, class T>
 class QMultiMap : public QMap<Key, T>
 {
 public:
     QMultiMap() {}
     QMultiMap(const QMap<Key, T> &other) : QMap<Key, T>(other) {}
 
     inline typename QMap<Key, T>::iterator replace(const Key &key, const T &value);
     inline typename QMap<Key, T>::iterator insert(const Key &key, const T &value);
 
     inline QMultiMap &operator+=(const QMultiMap &other)
     { unite(other); return *this; }
     inline QMultiMap operator+(const QMultiMap &other) const
     { QMultiMap result = *this; result += other; return result; }
 
 private:
     T &operator[](const Key &key);
     const T operator[](const Key &key) const;
 };
 
 template <class Key, class T>
 Q_INLINE_TEMPLATE Q_TYPENAME QMap<Key, T>::iterator QMultiMap<Key, T>::replace(const Key &akey, const T &avalue)
 { return QMap<Key, T>::insert(akey, avalue); }
 
 template <class Key, class T>
 Q_INLINE_TEMPLATE Q_TYPENAME QMap<Key, T>::iterator QMultiMap<Key, T>::insert(const Key &akey, const T &avalue)
 { return QMap<Key, T>::insertMulti(akey, avalue); }

заменить следующим кодом:

 template <class Key, class T>
 class QMultiMap : public QMap<Key, T>
 {
 public:
     QMultiMap() {}
     QMultiMap(const QMap<Key, T> &other) : QMap<Key, T>(other) {}
 
     inline typename QMap<Key, T>::iterator replace(const Key &akey, const T &avalue)
 	{ return QMap<Key, T>::insert(akey, avalue); }
     inline typename QMap<Key, T>::iterator insert(const Key &akey, const T &avalue)
 	{ return QMap<Key, T>::insertMulti(akey, avalue); }
 
     inline QMultiMap &operator+=(const QMultiMap &other)
     { unite(other); return *this; }
     inline QMultiMap operator+(const QMultiMap &other) const
     { QMultiMap result = *this; result += other; return result; }
 
 private:
     T &operator[](const Key &key);
     const T operator[](const Key &key) const;
 };
 
 //template <class Key, class T>
 //Q_INLINE_TEMPLATE Q_TYPENAME QMap<Key, T>::iterator QMultiMap<Key, T>::replace(const Key &akey, const T &avalue)
 //{ return QMap<Key, T>::insert(akey, avalue); }
 //
 //template <class Key, class T>
 //Q_INLINE_TEMPLATE Q_TYPENAME QMap<Key, T>::iterator QMultiMap<Key, T>::insert(const Key &akey, const T &avalue)
 //{ return QMap<Key, T>::insertMulti(akey, avalue); }

и в файле C:\qt\src\corelib\tools\qhash.h кусок кода:

 template <class Key, class T>
 class QMultiHash : public QHash<Key, T>
 {
 public:
     QMultiHash() {}
     QMultiHash(const QHash<Key, T> &other) : QHash<Key, T>(other) {}
 
     inline typename QHash<Key, T>::iterator replace(const Key &key, const T &value);
     inline typename QHash<Key, T>::iterator insert(const Key &key, const T &value);
 
     inline QMultiHash &operator+=(const QMultiHash &other)
     { unite(other); return *this; }
     inline QMultiHash operator+(const QMultiHash &other) const
     { QMultiHash result = *this; result += other; return result; }
 
 private:
     T &operator[](const Key &key);
     const T operator[](const Key &key) const;
 };
 
 template <class Key, class T>
 Q_INLINE_TEMPLATE Q_TYPENAME QHash<Key, T>::iterator QMultiHash<Key, T>::replace(const Key &akey, const T &avalue)
 { return QHash<Key, T>::insert(akey, avalue); }
 
 template <class Key, class T>
 Q_INLINE_TEMPLATE Q_TYPENAME QHash<Key, T>::iterator QMultiHash<Key, T>::insert(const Key &akey, const T &avalue)
 { return QHash<Key, T>::insertMulti(akey, avalue); }

заменить следующим кодом:

 template <class Key, class T>
 class QMultiHash : public QHash<Key, T>
 {
 public:
     QMultiHash() {}
     QMultiHash(const QHash<Key, T> &other) : QHash<Key, T>(other) {}
 
     inline typename QHash<Key, T>::iterator replace(const Key &akey, const T &avalue)
 		{ return QHash<Key, T>::insert(akey, avalue); }
     inline typename QHash<Key, T>::iterator insert(const Key &akey, const T &avalue)
 		{ return QHash<Key, T>::insertMulti(akey, avalue); }
 
     inline QMultiHash &operator+=(const QMultiHash &other)
     { unite(other); return *this; }
     inline QMultiHash operator+(const QMultiHash &other) const
     { QMultiHash result = *this; result += other; return result; }
 
 private:
     T &operator[](const Key &key);
     const T operator[](const Key &key) const;
 };
 
 //template <class Key, class T>
 //Q_INLINE_TEMPLATE Q_TYPENAME QHash<Key, T>::iterator QMultiHash<Key, T>::replace(const Key &akey, const T &avalue)
 //{ return QHash<Key, T>::insert(akey, avalue); }
 //
 //template <class Key, class T>
 //Q_INLINE_TEMPLATE Q_TYPENAME QHash<Key, T>::iterator QMultiHash<Key, T>::insert(const Key &akey, const T &avalue)
 //{ return QHash<Key, T>::insertMulti(akey, avalue); }

Настройка переменных окружения

  • Мой компьютер -> Свойства, вкладка дополнительно, кнопка Переменные среды.
    • Установите переменную окружения QTDIR в c:\qt-win.
    • Установите переменную окружения QMAKESPEC win32-msvc2005.
    • Добавляем к переменной окружения PATH путь %QTDIR%\bin.

Hello world

  • Создайте папку helloworld;
  • Создайте в папке helloworld файл helloworld.cpp следующего содержания:
 #include <QApplication>
 #include <QLabel>
 int main(int argc, char *argv[])
 {
     QApplication app(argc, argv);
     QLabel *label = new QLabel("Hello Qt!");
     label->show();
     return app.exec();
 }
  • Запустите «MS Visual C++ 2005 Express Edition»;
  • Выберите пункт меню Tools->Visual Studio 2005 Command Prompt;
  • Из консоли перейдите в вами созданную папку helloworld;
  • В консоли наберите:
qmake -project
qmake -tp vc helloworld.pro
  • Откройте созданный файл helloworld.vcproj;
  • В среде Visual Studio выберите пункт меню Debug → Start Debugging.

Документация по разным версиям

См. также

Русскоязычные сайты о Qt

Англоязычные сайты о Qt