Политика конфиденциальностиКонтактыО сайтеОтзывыGitHubDonate
© EVILEG 2015-2018
Рекомендует хостинг
TIMEWEB

Qt/C++ - Урок 068. Hello World с использованием системы сборки CMAKE в CLion

Qt, cmake, C++

Напишем "Hello, World!!!" на Qt в IDE CLion с использованием системы сборки CMAKE . Акцент на то, что проект разрабатывается в IDE CLion был сделан потому, что для работы с проектом необходимо сделать небольшую настройку для работы с CMAKE .

В результате получим следующее приложение:

Настройка IDE CLion

После того, как Вы создатите проект, необходимо его настроить для работы с библиотекой Qt необходимо настроить путь к этой библиотеке через аргумент CMAKE_PREFIX_PATH.

Для этого перейдите в настройки IDE. File -> Settings -> Build, Execution, Deployment -> CMake

Далее в CMake Options через CMAKE_PREFIX_PATH указываем путь к библиотекам Qt для CMAKE.  Полный путь к библиотекам может быть следующим:

/home/user/Qt/5.9.1/gcc_64/lib/cmake

Вся запись префикса будет следующей:

-DCMAKE_PREFIX_PATH=/home/user/Qt/5.9.1/gcc_64/lib/cmake

В настройках же это окно будет выглядеть следующим образом.

CMakeLists.txt

В CMakeLists.txt кроме информации добавленной по умолчанию необходимо будет добавить поиск и подключение библиотек Qt через использование функций find_package и target_link_libraries.

cmake_minimum_required(VERSION 3.8)
project(HelloWorld)

set(CMAKE_CXX_STANDARD 17)

# включаем поиск библиотек с использованием find_package()
# через REQUIRED указываем, что библиотеки обязательны
find_package(Qt5Core REQUIRED)
find_package(Qt5Gui REQUIRED)
find_package(Qt5Widgets REQUIRED)

set(SOURCE_FILES main.cpp)
add_executable(HelloWorld ${SOURCE_FILES})

# указываем, какие библиотеки необходимо подключить
target_link_libraries(${PROJECT_NAME} Qt5::Core)
target_link_libraries(${PROJECT_NAME} Qt5::Gui)
target_link_libraries(${PROJECT_NAME} Qt5::Widgets)

main.cpp

В остальном же написание первого HelloWorld будет сходным  разработкой под Qt Creator.

#include <QtWidgets/QApplication>
#include <QtWidgets/QWidget>
#include <QtWidgets/QGridLayout>
#include <QtWidgets/QLabel>

int main(int argc, char *argv[]) {

    QApplication app(argc, argv);

    QWidget widget;
    widget.resize(640, 480);
    widget.setWindowTitle("Hello, world!!!");
    
    QGridLayout *gridLayout = new QGridLayout(&widget);

    QLabel * label = new QLabel("Hello, world!!!");
    label->setAlignment(Qt::AlignVCenter | Qt::AlignHCenter);
    gridLayout->addWidget(label);

    widget.show();

    return app.exec();
}

При разработке под Qt Creator с использованием системы сборки CMake не понравилось то, что при добавлении файлов в проект Qt Creator не прописывает их в CMakeLists.txt, то есть файлы создаются, но не включаются в проект. Также имеет ещё ряд небольших неудобств, хотя IDE CLion ещё далеко по удобству в работе с очень специфическим функционалом Qt, хотя бы взять автодополнение макросов Qt, автоматическое создание недостающих участников класса (переменные и методы) по этим макросам, работу с дизайнером и т.д.

При том подходе в разработке что ведет JetBrains, скоро CLion обгонит QtCreator. Даже сейчас он в некоторых местах по функционалу уже обходит QtCreator(работа с VCS уже превосходит в удобстве). Так что будем посмотреть)

I

Спасибо! Очень помогло в освоении CMake.

I

При компиляции примера Qt Creator выдаёт следующую ошибку:
"Для сборки необходимо, чтобы была задана утилита CMake. Задайте её в настройках комплекта."

При этом комплект настроен как надо (в моём понимании): при наведении курсора на комплект показывается перечень настроек комплекта во всплывающей подсказке. В т.ч. и про CMake: "CMake Системная CMake в %путь_до_cmake.exe%".

Windows 7 Корпоративная Service Pack 1
Qt Creator 4.6.2

А что у вас в настройка во вкладке CMake, есть что-нибудь? У меня например по умолчанию ничего нет под Windows.

Хотя при наведении на комплект кое-что есть в тултипе, однако - это переменные в Path, но не сами пути.

I

А где найти вкладку CMake?

Вот здесь



I

Вот.

Ну теоретически он должен быть установлен в комплекте. Покажите информацию о комплекте.

Если CMake Tool пустой, то нужно установить, если нет, то пересборка проекта, шаманство с переменными окружения и т.д. Где-то получается, что не находит адекватно CMake. К сожалению под Qt Creator я проекты на CMake не собирал, только CLion использую для этого.

I

Вот.


Главное, под linux-версией всё сразу взлетело...

Под linux как правило проще, там всё по свои каталогам и полочкам разложено сразу.

Думается мне, что проблема все-таки где-то в путях переменных...

I

В переменной PATH путь к CMake был указан как G:\soft\CMake\bin, в реальности же каталог называется Cmake.

Причём после изменения в переменной PATH всё заработало, а в Qt Creator путь остался по-прежнему с CMake.

Значит всё-таки в переменных окружения была проблема. Полагаю, что Qt Creator берёт информацию сначала из переменных PATH, либо записывает её из  своего конфига, а потом берёт уже из PATH при запуске сборки. По какой-то причине у вас сменилось название каталога, Qt Creator не обнаружил изменения и не изменил переменные окружения. И по прежнему пытался тянуть из несуществующего каталога cmake.

Хорошо, что нашли, где ошибка была.

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
v
17 января 2019 г. 11:51
vitalir12

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:20баллов,
  • Очки рейтинга-10
v
17 января 2019 г. 11:49
vitalir12

C++ - Тест 002. Константы

  • Результат:50баллов,
  • Очки рейтинга-4
v
17 января 2019 г. 11:13
vitalir12

C++ - Тест 003. Условия и циклы

  • Результат:28баллов,
  • Очки рейтинга-10
Последние комментарии
I
16 января 2019 г. 8:06
IscanderChe

Заработало. Забыл model->select(); вписать.
I
16 января 2019 г. 8:02
IscanderChe

Всё равно пусто, хотя строка с данными в базу добавляется.
16 января 2019 г. 7:51
Евгений Легоцкой

потому, что нужно сохранять информацию для всех остальных ролей и столбцов через вызов переопределённого метода. Да к тому же вы ещё и зациклили вызов метода data. QVariant MySqlTableModel:...
I
16 января 2019 г. 7:43
IscanderChe

Сделал вот так. В tableView ничего нет, кроме заголовка. QVariant MySqlTableModel::data(const QModelIndex &index, int role) const{ if (role == Qt::DisplayRole) { QTime ...
Сейчас обсуждают на форуме
18 января 2019 г. 11:26
nayk1982

Для Desktop делал так: void pause(int ms){ QTimer timer; timer.setInterval( qBound(1, ms, 3600000) ); timer.setSingleShot(true); QEventLoop loop; QObject::connect(&...
17 января 2019 г. 12:01
Алексей Внуков

у меня просто есть отдельное поле с чекбоксамими какие колонки нужно отображать CheckBox { id: checkBox text: qsTr("some text") checked: true onC...
15 января 2019 г. 16:53
Михаиллл

Спасибо, заработало.Но выдало обычный текст без форатирования HTML.Придется искать дальше
15 января 2019 г. 12:52
BlinCT

Я же вам выше написал CLion умеет работать с ремоут машинами. И Qt так же собирает.
Присоединяйтесь к нам в социальных сетях

Для зарегистрированных пользователей на сайте присутствует минимальное количество рекламы