Установка и настройка qt creator
Содержание:
- Roadmap
- Trivia
- Qt 4
- Introduction to Design Patterns in C++ with Qt (2nd Edition)
- Advanced Qt Programming: Creating Great Software with C++ and Qt 4
- C++ GUI Programming with Qt 4 (2nd Edition) — The official C++/Qt book
- Foundations of Qt Development
- The Book of Qt 4: The Art of Building Qt Applications
- An Introduction to Design Patterns in C++ with Qt 4
- C++ GUI Programming with Qt 4 (1st Edition)
- Лицензия для университетов
- mainwindow.h
- Compiling Qt Creator
- Архитектура сервера
- Дополнение №1.
- Using Resources in the Application
- Сигналы и слоты
- Про iOS стиль для Qt Quick Controls 2
- Music
- Detailed Description
- Установка Qt Creator в Linux
- C++/Qt: пора валить?. +45
- Troubleshooting
- Создание проекта
- Заключение
Roadmap
- Скорый релиз PySide — использование Qt из Python;
- Qt Quick Pointer Handlers — «более лучший» мультитач и вообще работа с тачскринами;
-
Qt for WebAssembly — запуск Qt приложений в браузере (
не знаю, зачеммогу попытаться объяснить, зачем); - Переработка (new compiler pipeline) QML Engine;
- Поддержка формата KTX;
- Qt 5.11 будет в мае-июне 2018 (уже вышел RC — release candidate);
- Следующий LTS релиз будет Qt 5.12 (ожидается в конце осени 2018). Минимум новых фич, фокус на надёжность и производительность;
- Qt 6 ожидается очень примерно года через два;
Qt на микроконтроллерах (MCU)
Очень часто спрашивают, можно ли использовать Qt для разработки ПО, и частности GUI, на микроконтроллерах.
И вот мы провели исследование, завершившееся портированием Qt под операционную систему реального времени RTEMS и оптимизацией сборки Qt для запуска на микроконтроллерах STM32F469, STM32F746 и STM32F769.
О результатах исследования недавно вышел пост в официальном блоге, и кстати говоря, оригинал этого поста вообще-то был написан на русском, так что с минимальными усилиями его можно опубликовать и на Хабре (об этом тоже будет опрос в конце статьи).
Пока идёт сбор отзывов от клиентов, кто куда и что хотел бы портировать, и потом на основе пожеланий будет планироваться дальнейшее развитие.
Trivia
- QT is a shorter version of saying cutie.
- QT is short because her sprite is based on Pico’s.
- KB crashes after singing one note in the story mode version of Termination.
- In story mode, Termination is renamed to Terminate.
- Also in the story mode version of Termination, the chart skips to the part with excessive double notes.
- KB’s teeth outlines change colors depending on the arrows he hits in Censory-Overload, Termination and Cessation.
- Despite KB still being exposed, QT is doing fine in Cessation. It means both of them can be active at the same time.
However, she shuts down again during KB’s solo.
- According to Count Nightshade, QT was originally going to be a dead girl and KB was using her as a puppet to lure in victims.
- According to the logs, Termination is not canon and happens in another timeline and Cessation
It has been confirmed that Cessation is canon by Hazard24.
happens in the future.
- KB now has blue eyes in Cessation to further indicate that Cessation takes place in the future.
- Leitmotifs of Censory-Overload can be heard in CareLess
This is further emphasized, as if one speeds up CareLess by 175%, it resembles Censory-Overload, but slowed down and replaced with QT’s vocals.
.
- During Termination and Censory-Overload, the background turns into a Blue Screen of Death which will scare Girlfriend.
- In the freeplay menu, the difficulty for Termination is forced to be «Very Hard» instead of regular Hard.
- Unlike most bonus songs that force you Into Hard mode, Cessation will force you into Normal mode.
- The TVs in the background will constantly flash different things throughout each song.
- A smiling emoticon and a heart during Cessation.
- A warning that appears when KB uses his sawblades in Termination, saying «Watch out!»
- A red warning sign.
- The red eye from «Glitcher» from the VS. Hex mod, along with other mods.
- A technical difficulties screen after KB tries to sing Termination in Story Mode.
- The emoticon frown on the blue screen.
- A warning regarding sawblades at the beginning of Termination.
- The words «Good Luck», also at the beginning of Termination.
- The words «Incoming Drop», before the drop in Censory-Overload.
- At the end of Cessation, there’s a chance the warning sign from Termination will appear, then switch to ‘Just kidding lol» with the ‘bruh’ sound effect.
- QT’s voice originates from the UTAU, Kasane Teto.
Qt 4
Introduction to Design Patterns in C++ with Qt (2nd Edition)
|
Advanced Qt Programming: Creating Great Software with C++ and Qt 4
C++ GUI Programming with Qt 4 (2nd Edition) — The official C++/Qt book
|
Foundations of Qt Development
|
The Book of Qt 4: The Art of Building Qt Applications
|
An Introduction to Design Patterns in C++ with Qt 4
|
C++ GUI Programming with Qt 4 (1st Edition)
|
Лицензия для университетов
Существует также проект «образовательной» лицензии для преподавателей и студентов университетов. Подразумевается, что она будет бесплатной.
В состав такого дистрибутива входят не только Open Source компоненты, но и коммерческие тоже. Также предоставляется ограниченный доступ к тех.поддержке (пониженный приоритет, нет фиксированного времени ответа и т.д.) и некоторые обучающие материалы. Однако, следует ожидать ограничений в условиях использования.
Проект «образовательной» лицензии всё ещё в пилотном режиме, потому особо не афишируется. Я тоже в этом обзоре не стал её включать в общую лицензионную структуру. Как станет известно больше — добавлю новую информацию.
mainwindow.h
Итак, действо следующее: три кнопки — три слота, один сигнал на все три кнопки, который подаётся в слотах кнопок и передаёт номер кнопки в один общий слот, который выдаёт сообщение с номером кнопки.
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QPushButton> #include <QMessageBox> namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); signals: void signalFromButton(int buttonID); // Сигнал для передачи номер нажатой кнопки private: Ui::MainWindow *ui; private slots: void slotButton1(); // Слоты-обработчики нажатий кнопок void slotButton2(); void slotButton3(); // Слоты вызывающий сообщение с номеро нажатой кнопки void slotMessage(int buttonID); }; #endif // MAINWINDOW_H
Compiling Qt Creator
Prerequisites:
- Qt 5.14.0 or later
- Qt WebEngine module for QtWebEngine based help viewer
- On Windows:
- MinGW with GCC 7 or Visual Studio 2017 or later
- Python 3.5 or later (optional, needed for the python enabled debug helper)
- Debugging Tools for Windows (optional, for MSVC debugging support with CDB)
- On Mac OS X: latest Xcode
- On Linux: GCC 7 or later
- LLVM/Clang 10 or later (optional, LLVM/Clang 11 is recommended.
See on how to
get LLVM.
The ClangFormat, ClangPchManager and ClangRefactoring use the LLVM C++ API.
Since the LLVM C++ API provides no compatibility guarantee,
if later versions don’t compile we don’t support that version.) - CMake
- Ninja (recommended)
The installed toolchains have to match the one Qt was compiled with.
Linux and macOS
These instructions assume that Ninja is installed and in the , Qt Creator
sources are located at , Qt is installed in
, and LLVM is installed in .
Note that if you install Qt via the online installer, the path to Qt must
include the version number and compiler ABI. The path to the online installer
content is not enough.
See on how to
get LLVM.
Windows
These instructions assume that Ninja is installed and in the , Qt Creator
sources are located at , Qt is installed in
, and LLVM is installed in .
Note that if you install Qt via the online installer, the path to Qt must
include the version number and compiler ABI. The path to the online installer
content is not enough.
See on how to
get LLVM.
Decide which compiler to use: MinGW or Microsoft Visual Studio.
For Microsoft Visual C++ you can use the «Build Tools for Visual Studio». Also
install the «Debugging Tools for Windows» from the Windows SDK installer. We
strongly recommend using the 64-bit version and 64-bit compilers on 64-bit
systems. Open the from the
start menu items that were created for Visual Studio, and run the commands
below in it.
Qt Creator can be registered as a post-mortem debugger. This can be done in the
options page or by running the tool qtcdebugger with administrative privileges
passing the command line options -register/unregister, respectively.
Alternatively, the required registry entries
can be modified using the registry editor regedt32 to contain
When using a self-built version of Qt Creator as post-mortem debugger, it needs
to be able to find all dependent Qt-libraries and plugins when being launched
by the system. The easiest way to do this is to create a self-contained Qt
Creator by installing it and installing its dependencies. See «Options» below
for details.
Note that unlike on Unix, you cannot overwrite executables that are running.
Thus, if you want to work on Qt Creator using Qt Creator, you need a separate
installation of it. We recommend using a separate, release-built version of Qt
Creator to work on a debug-built version of Qt Creator.
Options
If you do not have Ninja installed and in the , remove from
the first call. If you want to build in release mode, change the build
type to . You can also build with release
optimizations but debug information with .
You can find more options in the generated CMakeCache.txt file. For instance,
building of Qbs together with Qt Creator can be enabled with .
Installation is not needed. It is however possible, using
To create a self-contained Qt Creator installation, including all dependencies
like Qt and LLVM, additionally run
Архитектура сервера
Диаграмма классов сервера приведена на рисунке.
Толстыми стрелочками показана иерархия наследования классов, а тонкими — принадлежность членов и методов классам. В общем случае, для службы генерируется класс QServerService, где servicename — имя службы, объявленное в .proto файле. RPCCallData — это управляющие структуры, сгенерированные для каждой RPC в службе. В конструкторе класса QpingServerService происходит инициализация базового класса QGrpcServerService асинхронной службой gRPC pingpong::ping::AsyncService. Для запуска службы нужно вызвать метод Start() с адресом и портом, на которых будет работать служба. В функции Start() реализована стандартная процедура запуска службы.
В конце функции Start() вызывается вызывается чисто виртуальная функция makeRequests(), которая реализована в сгенерированном классе QpingServerService:
Второй шаблонный параметр функции needAnotherCallData — это сгенерированные структуры RPCCallData. Эти же структуры являются параметрами сигналов в сгенерированном классе Qt службы.
Сгенерированные структуры RPCCallData наследуются от класса ServerCallData. В свою очередь, класс ServerCallData наследуется от респондера ServerResponder. Таким образом, создание объекта сгеренированных структур приводит к созданию объекта респондера.
Конструктор класса ServerCallData принимает два параметра: signal_func и request_func. signal_func — это сгенерированный сигнал, который вызывается после получения тэга из очереди. request_func — это функция, которая должна быть вызвана при создании нового респондера. Например, в данном случае это может быть функция RequestSayHello(). Вызов request_func происходит именно в функции needAnotherCallData(). Это сделано для того, чтобы управление респондерами (создание и удаление) происходило в службе.
Код функции needAnotherCallData() состоит из создания объекта респондера и вызова функции, связывающей респондер с вызовом RPC:
Функции RequestRPC() — это шаблонные функции для четырех видов взаимодействия. В итоге, вызов RequestRPC() сводится к вызову:
где service_ — это служба gRPC. В данном случае, это pingpong::ping::AsyncService.
Для синхронной или асинхронной проверки очереди событий необходимо вызвать функции CheckCQ() или AsyncCheckCQ() соответственно. Код функции CheckCQ() сводится к вызовам функции синхронного получения тэга из очереди и обработки этого тэга:
После получения тэга из очереди идут проверки валидности тэга и старта сервера. Если сервер выключен, то тэг уже не нужен — его можно удалить. После этого вызывается функция cqReaction(), определенная в класса ServerCallData:
Флаг first_time_reaction_ говорит о том, что нужно создать новый респондер для вызванной RPC. Функции CouldBeDeleted() и ProcessEvent() унаследованы от класса респондера ServerResponder соответствующего вида. Функция CouldBeDeleted() возвращает признак того, что объект респондера может быть удален. Функция processEvent() обрабатывает тэг и флаг ok. Так, например, для респондера вида Client Streaming функция выглядит следующим образом:
Функция ProcessEvent() вне зависимости от вида респондера всегда возвращает true. Возвращаемое значение этой функции оставлено для возможного расширения функциональности и, теоретически, для устранения ошибок.
После обработки события следует вызов:
Переменная service_ — это экземпляр сгенерированной службы, в нашем случае QpingServerService. Переменная signal_func_ — это сигнал службы, соответствующий конкретной RPC. Например, SayHelloRequest(). Переменная genRpcCallData — это объект респондера соответствующего вида. С точки зрения вызывающего кода, переменная genRpcCallData — это объект одной из сгенерированных структур RPCCallData.
Дополнение №1.
Я писал статью с целью рассказать о видах лицензий и продуктов Qt, а не о подробностях судебной практики в сфере программного обеспечения, о которых мне мало что известно. И видимо, зря я вообще вступил в обсуждение.
И всё же, пытаясь ответить на вопрос: если вы нарушите условия коммерческого лицензионного соглашения, то, очевидно, The Qt Company может подать на вас в суд. Но этого хотелось бы избежать, и мало кто (если вообще кто-то) нарушает условия коммерческой лицензии умышленно — мне сложно придумать условия, в которых это принесло бы ощутимую выгоду.
Кстати, в русской версии статьи про FSF на Википедии есть фраза: «Программы, распространяемые на условиях GPL, но не принадлежащие Фонду, могут быть защищены только их владельцами, поскольку Фонд не имеет нужного юридического статуса для этого». Из этого следует, что как раз-таки The Qt Company должна судиться с нарушителем. Но в английской версии статьи это фразы нет. Как на самом деле — не знаю.
У меня даже появился встречный вопрос: если завтра The Qt Company исчезнет (заработает все деньги в мире и самораспустится), то кто будет подавать в суд за нарушения GPL/LGPL? Ведь сам Qt от этого не исчезнет, останется Open Source (как я и приводил пример в статье). Означает ли это, что тогда можно будет спокойно использовать Qt в своих проектах, игнорируя условия GPL/LGPL? Я подозреваю, что нет.
Using Resources in the Application
In the application, resource paths can be used in most places instead of ordinary file system paths. In particular, you can pass a resource path instead of a file name to the QIcon, QImage, or QPixmap constructor:
cutAct = new QAction(QIcon(":/images/cut.png"), tr("Cu&t"), this);
See the Application example for an actual application that uses Qt’s resource system to store its icons.
In memory, resources are represented by a tree of resource objects. The tree is automatically built at startup and used by QFile for resolving paths to resources. You can use a QDir initialized with «:/» to navigate through the resource tree from the root.
Qt’s resources support the concept of a search path list. If you then refer to a resource with instead of as the prefix, the resource will be looked up using the search path list. The search path list is empty at startup; call () to add paths to it.
Сигналы и слоты
В Qt применяется альтернативная техника, то есть используются слоты и сигналы. Сигнал выполняется тогда, когда происходит определенное событие. Виджеты Qt имеют множество предопределённых сигналов, но мы можем всегда отнаследоваться отвиджета и определить собственные сигналы для них. Слотом является функция, которая вызывается в ответ на определенный сигнал. Виджеты Qt также имеют множество предопределенных слотов, но наследование от виджетов и добавление собственных слотов является обычной практикой, так что Вы можете обрабатывать те сигналы, которые Вам интересны.
- сигналы и слоты в Qt
Сигналы и слоты являются типо-безопасным механизмом. Сигнатура сигнала должа совпадать с сигнатурой принимающего слота (Хотя фактически, слот может иметь сигнатуру короче, чем сигнал, но слот принимает сигнал, поскольку игнорирует лишние аргументы). Поскольку сигнатуры совместимы, то компилятор может помочь определить несоответствия при использовании синтаксиса основанного на указателях. Тогда как при синтаксисе, основанном на макросах SIGNAL и SLOT возможно определить несоответствие типов только в runtime процессе. Сигналы и слоты слабо связаны: класс, который вызывает сигнал знает только слот, который принимает сигнал. Механизм сигналов и слотов в Qt обеспечивается, если Вы подключили сигнал к слоту, который будет вызываться с параметрами сигнала в нужным момент. Сигналы и слоты могут иметь несколько аргументов и типов. И они являются полностью типо-безопасными.
Слоты могут быть использованы для приема сигналов, но они являются также и обычными функциями. Просто как объект не знает что приняло его сигнал, так и слот не знает, какой сигнал подключен к нему. Это обеспечивает реальную независимость компонентов, которые могут быть созданы с Qt.
Вы можете подключить как множество сигналов к одному слоту, так и сигнал может быть подключен к множеству слотов. И даже возможно подключить сигнал непосредственно к другому сигналу. (Это вызовет второй сигнал, когда был вызван первый)
Вместе, сигналы и слоты создают мощный механизм компонентного программирования.
Про iOS стиль для Qt Quick Controls 2
Как таковой стиль был более-менее готов ещё в феврале 2016:
Но в релиз не попал по ряду причин, включая и юридические.
Apple совершенно не против приложений, которые не выглядят «нативно», то есть можно творить любое безумие и всё будет нормально (кроме количества звездей от ваших пользователей). Но как только речь заходит о «родном» стиле iOS, то там всё должно выглядеть идеально и строго соответствовать гайдлайнам.
Дизайны/гайдлайны стилей Material (Android) и Universal (Windows) не только находятся в общем доступе (мне так сказали), но также и не ограничены какой-то одной платформой, и Google как и Microsoft напротив всячески поощряют распространение своих дизайнов на все платформы, не только мобильные, но и десктопы с вебом, включая платформы конкурентов. Всего этого нельзя сказать про iOS.
Ну и потому любая попытка «воссоздать» стиль iOS будет лишь имитацией и подражанием оригинальному стилю. Говоря о «look and feel», часть, которая «look», уже достаточна сложна для воссоздания, но часть «feel» — вообще нереальна. То есть GUI может и будет выглядеть «родным», но первый же свайп / скролл / пинч выдадут «подделку».
Также в результате исследования оказалось, что это чревато как раз-таки юридическими проблемами — если мы будем выдавать наш стиль за «родной» стиль iOS, то Apple может сказать что-то неприятное. Плюс приложения наших клиентов могут получить отказ в App Store по причине несоответствия UX гайдлайнам.
Кроме того, всплыл ещё один интересный момент. Так как наша реализация стиля iOS разумеется запилена на Qt, который вообще-то является кроссплатформенным фреймворком, то внезапно китайские «производители» клонов iPhone/iPad смогут использовать наш стиль в своих ведроподелиях. Честно говоря, я не понимаю, почему нас это должно волновать, но вот тем не менее, мне сказали, что это проблема.
Отличным решением может стать вот этот проект, я его уже упоминал в прошлых статьях. Вкратце, это использование реально «родного» GUI платформы (а не «воссозданного» стиля) через QML (или C++, если угодно). Но из того, что я вижу во внутреннем трекере, последняя активность по этой задаче была в октябре 2017 и с тех пор тишина.
Теперь про то, что предлагает V-Play. Я, честно говоря, не знаю, и команда тоже не ответила. Но учитывая вышесказанное, есть два варианта:
- Они пошли по пути воссоздания и реверс-инжениринга стиля iOS, и то что они предлагают, это просто реплика, и соответственно они либо их клиенты потенциально могут ожидать проблем от Apple. Я прошу учесть, что я ни в чём не обвиняю V-Play, а просто строю предположения;
- Они реализовали упомянутый в предыдущем абзаце проект — то есть работают с настоящим GUI iOS через QML-обёртку.
Music
This section contains very loud audio. If you are wearing headphones, be careful!Reason: Termination is a bit loud.
Note: «Terminate» is not broken. KB just crashes. That’s literally the entire audio file. Look in the freeplay tab if you want the real version of the song
|
BPM: 128 |
Scroll Speed: 1.1 (Easy)1.4 (Normal)1.5 (Hard) |
|
BPM: 110 |
Scroll Speed: 1.2 (Easy)1.4 (Normal)1.6 (Hard) |
|
BPM: 190 |
Scroll Speed: 1.9 (Easy)2.4 (Normal)2.9 (Hard) |
|
BPM: 190 > 222 |
Scroll Speed: 2.8 (Easy) 2.9 (Normal)3 (Hard) |
|
BPM: 190 > 222 |
Scroll Speed: 3.1 |
|
BPM: 128 |
Scroll Speed: 1.5 (All Difficulties) |
This section contains very loud audio. If you are wearing headphones, be careful!Reason: The cutscene music in Censory-Overload gradually increases in volume.
|
|
|
|
Detailed Description
An instance of a QLibrary object operates on a single shared object file (which we call a «library», but is also known as a «DLL»). A QLibrary provides access to the functionality in the library in a platform independent way. You can either pass a file name in the constructor, or set it explicitly with (). When loading the library, QLibrary searches in all the system-specific library locations (e.g. on Unix), unless the file name has an absolute path.
If the file name is an absolute path then an attempt is made to load this path first. If the file cannot be found, QLibrary tries the name with different platform-specific file prefixes, like «lib» on Unix and Mac, and suffixes, like «.so» on Unix, «.dylib» on the Mac, or «.dll» on Windows.
If the file path is not absolute then QLibrary modifies the search order to try the system-specific prefixes and suffixes first, followed by the file path specified.
This makes it possible to specify shared libraries that are only identified by their basename (i.e. without their suffix), so the same code will work on different operating systems yet still minimise the number of attempts to find the library.
The most important functions are () to dynamically load the library file, () to check whether loading was successful, and () to resolve a symbol in the library. The () function implicitly tries to load the library if it has not been loaded yet. Multiple instances of QLibrary can be used to access the same physical library. Once loaded, libraries remain in memory until the application terminates. You can attempt to unload a library using (), but if other instances of QLibrary are using the same library, the call will fail, and unloading will only happen when every instance has called ().
A typical use of QLibrary is to resolve an exported symbol in a library, and to call the C function that this symbol represents. This is called «explicit linking» in contrast to «implicit linking», which is done by the link step in the build process when linking an executable against a library.
The following code snippet loads a library, resolves the symbol «mysymbol», and calls the function if everything succeeded. If something goes wrong, e.g. the library file does not exist or the symbol is not defined, the function pointer will be and won’t be called.
myLib("mylib"); typedef void (*MyPrototype)(); MyPrototype myFunction = (MyPrototype) myLib.resolve("mysymbol"); if (myFunction) myFunction();
The symbol must be exported as a C function from the library for () to work. This means that the function must be wrapped in an block if the library is compiled with a C++ compiler. On Windows, this also requires the use of a macro; see () for the details of how this is done. For convenience, there is a static () function which you can use if you just want to call a function in a library without explicitly loading the library first:
Установка Qt Creator в Linux
На этих уроках используется операционная система Linux (Debian 9.x 64-bit), поэтому мы скачиваем , но вы также можете использовать соответствующие файлы Qt для Windows или macOS:
После окончания загрузки переходим в папку с необходимым нам файлом, нажимаем на него правой кнопкой мыши и выбираем . На вкладке видим , , , а также наименование родительской папки:
Переходим на вкладку и ставим галочку возле пункта :
Закрываем и запускаем программу.
Шаг №2: На следующем этапе установщик сообщает, что нам предоставлена версия с открытым исходным кодом Qt 5.13.0. Дальнейшая установка Qt предполагает регистрацию в Qt и создание Qt Account, который предоставляет доступ ко всем возможностям Qt. Кроме того, данное действие необходимо для проверки лицензии (коммерческая/некоммерческая). Если у вас уже есть учетная запись в Qt Account, то используйте кнопку .
Если учетной записи в Qt Account у вас еще нет, то её можно создать сейчас: для этого перейдите по соответствующей ссылке в установщике, и вы будете перенаправлены на сайт qt.io в соответствующий раздел, или просто используйте кнопку — вы сможете это сделать на следующем шаге:
Шаг №3: Здесь необходимо ввести логин и пароль от Qt Account или создать Qt Account, если его у вас еще нет. Кнопка переводит нас на следующий этап:
Добро пожаловать в настройки Qt 5.13.0! Для перехода к следующему шагу нажимаем :
Шаг №4: Выбираем каталог для установки Qt 5.13.0
Обратите внимание, адрес каталога указывается латинскими буквами (без кириллицы) и без пробелов! После того, как выбрали каталог, нажимаем :
Шаг №5: Выбираем компоненты, которые хотим установить. Если на данном этапе у вас нет уверенности в выборе конкретных компонентов, то добавление и удаление можно будет сделать позже, после установки программы:
Шаг №6: Принимаем лицензионное соглашение:
И нажимаем на кнопку :
Для завершения установки нажимаем . После завершения установки Qt Creator запустится самостоятельно (для этого необходимо поставить галочку возле пункта ):
Вот примерно следующее вы должны увидеть при запуске Qt Creator:
Поздравляем! Qt Creator установлен.
C++/Qt: пора валить?. +45
- 13.05.20 15:28
•
f-number
•
#501798
•
Хабрахабр
•
Из песочницы
•
•
29800
Из песочницы, Программирование, PHP, C++, Qt
Если бы раньше я запускал новый долгоживущий проект, в котором основные функции связаны с большим объёмом вычислений при каком-то взаимодействии с пользователем через графический интерфейс, я бы не задумываясь использовал С++/Qt. Это позволяло использовать один фреймворк/язык везде, независимо от структуры проекта и его компонентов, без дополнительных сложностей с зоопарком технологий и зависимостей.
Сейчас, в свете присходящего с Qt, придётся менять подход…
Troubleshooting
Disable/Change Qt journal logging behaviour
When using KDE and/or any other Qt desktop environment debug info may be frequently be logged in the systemd journal.
Set as environment variable to change this behaviour, e.g. to completely disable logging:
/etc/environment
QT_LOGGING_RULES='*=false'
To disable only debug logging, use .
Icon theme is not applied
Since Qt 5.1 SVG support has moved into a module. Since does not depend on it may happen that the is installed but not . This results in deceptive icon theme behaviour. Since SVG is not supported the icons are silently skipped and the icon theme may seem to be unused. Installing explicitly solves the problem.
Theme not applied to root applications
As the user theme file (), are not read by other accounts, the selected theme will not apply to X applications run as root. Possible solutions include:
- Create symlinks, e.g
# ln -s /home//.config/Trolltech.conf /etc/xdg/Trolltech.conf
- Configure system-wide theme file:
- Adjust the theme as root
Qt4 style not respected
If pure Qt4 (non-KDE) applications do not stick with your selected Qt4 style, then you will probably need to tell Qt4 how to find KDE’s styles (Oxygen, Phase etc.). You just need to set the environment variable . E.g.:
QT_PLUGIN_PATH=$HOME/.kde4/lib/kde4/plugins/:/usr/lib/kde4/plugins/
should then be able to find your kde styles and everything should look nice again!
Alternatively, you can symlink the Qt4 styles directory to the KDE4 styles one:
# ln -s /usr/lib/{kde,qt}4/plugins/styles/theme_name
All Qt5-based applications fail to run after Qt5 update
If you get an error similar to
Qt FATAL: Cannot mix incompatible Qt library (version 0x50900) with this library (version 0x50901)
then you are most likely using a Qt5 platform theme or style plugin which has not been recompiled against the latest version of Qt5. These usually use Qt private headers which means they depend on an exact version of Qt and not just a matching soname. Figure out which theme/style you are using by checking the and environment variables, and rebuild the AUR package that provides it.
Создание проекта
Вначале нам необходимо создать проект. Сразу скажу, что наша программа будет консольным приложением. Для этого выберите или можно воспользоваться сочетанием клавиш :
Перед вами появится «Мастер настройки проектов». В левой колонке отметьте пункт , а затем в правой — :
На следующем шаге нужно будет указать имя для нашей будущей программы и папку, где будут располагаться файлы проекта. У меня это и соответственно:
На следующем шаге без изменений, поэтому просто нажимаем кнопку :
Теперь нам нужно выбрать набор компиляторов, который мы будем использовать для сборки нашего проекта. Я настоятельно рекомендую выбрать (сняв при этом отметки с остальных, если они у вас есть):
На последнем шаге нажимаем :
Теперь вы можете увидеть автоматически сгенерированный Qt-проект консольного приложения. Давайте рассмотрим его детально:
В корневой папке у нас лежит файл My_QtApplication.pro — это основной файл настроек проекта
Мы разберем его позже, а пока обратите внимание на папку «Исходники», в которой расположен файл main.cpp. Данный файл содержит минимальный исходный код нашей программы
Он был автоматически сгенерирован средствами Qt. Я не буду вдаваться в детальное описание класса QCoreApplication, скажу лишь, что он предоставляет обработку сообщений для консольного приложения Qt и является особенностью архитектуры построения Qt-приложений.
Заключение
В заключении обратим внимание два момента. Первый момент связан с вызовом функций CheckCQ() клиента и сервера
Работают они, как было показано выше, по одному принципу: если в очереди есть событие, «эмитится» сигнал с соответствующей сгенерированной структурой RPCCallData. Можно вызывать эту функцию вручную и проверять (в случае клиента) наличие события. Но изначально была идея перенести всю сетевую часть, связанную с gRPC в другой поток. Именно для этих целей были написаны вспомогательные классы QGrpcSrvMonitor для сервера gRPC и QGrpcCliServer для клиента gRPC. Оба класса работают по одному принципу: создают отдельный поток, помещают в этот поток сгенерированную службу и периодически вызывают функцию CheckCQ() этой службы. Таким образом, при использовании обоих вспомогательных классов отпадает необходимость вызова функций CheckCQ() в клиентском коде. Cигналы сгенерированной службы, в этом случае, «приходят» из другого потока. Примеры клиента и сервера реализованы с использованием этих вспомогательных классов.
Второй момент касается той большей части разработчиков, кто в работе не использует библиотеку Qt. Классы и макросы Qt в QgRPC используются только в двух местах: в генерируемых файлах служб, и в файлах, содержащих вспомогательные классы: QGrpcServerMonitor.h и QGrpcClientMonitor.h. Остальные файлы с библиотекой Qt никак не связаны. Планировалось добавить сборку с использованием cmake, и сделать заглушки некоторым директивам Qt. В частности, классу QObject и макросу Q_OBJECT. Но до этого просто не дошли руки. Поэтому, любые предложения приветствуются.
На этом все. Всем спасибо!