интегрируем QT в VS Code

Итак куда мы без Qt - никуда. Изначально наш код программ использовал библиотеки Qt и работали мы в Qt Creator.

Но не Qt-ом единым жив программист. Например куда мы без openssl, он никогда не являлся частью Qt (хотя и был интегрирован) или например boost. То есть все равно мы подключали извне еще какой-то функционал. К тому же мы постоянно дописывали свое развитие Qt (да и такое приходится делать, ибо Qt не панацея).

В общем к интеграции в VS Code нас подтолкнул CMake, потому что qmake ушел и ничего нового своего Qt не придумал.

И тут мы начинаем предполагать, что подготовитель сборки CMake это бесплатный открытый и популярный вариант. И если от него плясать, то нам пофигу какая среда разработки используется, главное чтобы инструмент был по фен шую:

1. Отладка нужна конечно же;
2. Удобный редактор с автозаполнением желательно, подсказками, навигацией, переходом на источник объявления и т.д.
3. Удобная интеграция разных источников открытого (и не очень) кода в свой единый проект;

И вот тут почему-бы не попробовать VS Code как среду (она вроде еще бесплатная).

Qt и VS Code

Сборку с++ проекта в VS Code с использованием библиотек Qt не трудно оказалось организовать через CMake. Здесь пример начальной отладки минимального с++ проекта

Для использования Qt просто нужно добавить несколько команд в CMakeLists.txt:

find_package(Qt5 COMPONENTS Core REQUIRED)

#find_package(Qt5 COMPONENTS Widgets REQUIRED)
#find_package(Qt5 COMPONENTS Widgets  REQUIRED)
message("QT4_INSTALLED : " ${QT4_INSTALLED} )   # working
message("QT_LIBRARIES : " ${QT_LIBRARIES} )
message("Qt5Widgets_LIBRARIES : " ${Qt5Widgets_LIBRARIES} )
message("Qt_lib : " ${Qt_lib})
#message("Qt5Core_INCLUDE_DIRS : " ${Qt5Core_INCLUDE_DIRS} )

foreach(path ${Qt5Core_INCLUDE_DIRS})
  message("Qt5Core_INCLUDE_DIRS: "  ${path})
endforeach(path)

foreach(path ${Qt5Gui_INCLUDE_DIRS})
  message("Qt5Gui_INCLUDE_DIRS: "  ${path})
endforeach(path)

#message("Qt5Widgets_DIR : " ${Qt5Widgets_DIR} )
message("Qt5Core_DIR : " ${Qt5Core_DIR} )

add_executable(test1  main.cpp)

target_link_libraries(test1 Qt5::Core)

message(STATUS ${QT_CORE_FOUND})

message("CMAKE_INSTALL_LIBDIR:" ${CMAKE_INSTALL_LIBDIR})
message("CMAKE_INSTALL_BINDIR:" ${CMAKE_INSTALL_BINDIR})

install(TARGETS test1
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)

В общем сборка происходит нормально, вот маленький проект:

#include <QtCore/QCoreApplication>
#include <iostream>
#include <QDebug>
#include <QEvent>

int main(int argc, char *argv[])
{
   QCoreApplication a(argc, argv);
    int ii =123;
    std::string str ="std string 123";
    std::cout  << "0 string" << std::endl;
    std::cout  << "1 string" << std::endl;
    qDebug() << "*************************************************";
    qDebug() << "------------------------------------------------------";
    qDebug() << "               work            ";
    qDebug() << "------------------------------------------------------";
    qDebug() << "*************************************************";
    
    return a.exec();
    //return 0;
}

Но вот отладка не хочет работать именно при использовании кода Qt.

Qt Tools

Для начала можно попробовать установить расширение Qt Tools. В нашем случае это сразу помогло и отладка, в том числе и с кодом Qt пошла нормально.

Вот это расширение:

фотка 1
 

Старая как мир windows - проблема

Конечно среда разработки запускает наш test1.exe в каталоге Debug (да кстати у нас дебажная сборка) и test1.exe не видит библиотеку QtCore5.dll и тупо вылетает к сожалению без информации об какой-бы то  ни было ошибке.

Но мы люди опытные и подкидываем QtCore5.dll в каталог Debug и "о чудо" - отладка начинает работать.

Таким образом надо как-то сообщить среде VS Code, чтобы она запускала test1.exe в среде исполнения с путями к библам Qt. Qt Creator это кстати делает автоматом.

Как все банально в Windows - все должно через переменную PATH находится: библиотеки, разные утилиты и фин еще знает что. Иначе ваша программа может чего-то не подключить и вылет к чертям собачим.

В самой программульке test1.exe выводим переменную PATH через  qEnvironmentVariable("PATH") и видим что никто нам пути к библам QT не установил:

    "C:\\Program Files\\Common Files\\Oracle\\Java\\javapath"
    "C:\\Program Files (x86)\\Common Files\\Oracle\\Java\\javapath"
    "C:\\Users\\p\\AppData\\Roaming\\ActiveState\\bin"
    "C:\\Python27\\"
    "C:\\Python27\\Scripts"
    "C:\\WINDOWS\\system32"
    "C:\\WINDOWS"
    "C:\\WINDOWS\\System32\\Wbem"
    "C:\\ProgramData\\chocolatey\\bin"
    "D:\\PROG\\Strawberry\\c\\bin"
    "D:\\PROG\\Strawberry\\perl\\site\\bin"
    "D:\\PROG\\Strawberry\\perl\\bin"
    "C:\\WINDOWS\\system32"
    "C:\\WINDOWS"
    "C:\\WINDOWS\\System32\\Wbem"
    "C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\"
    "C:\\WINDOWS\\System32\\OpenSSH\\"
    "C:\\Program Files (x86)\\Common Files\\Acronis\\SnapAPI\\"
    "C:\\Program Files\\PuTTY\\"
    "C:\\Program Files (x86)\\Microsoft SQL Server\\100\\Tools\\Binn\\"
    "C:\\Program Files\\Microsoft SQL Server\\100\\Tools\\Binn\\"
    "C:\\Program Files\\Microsoft SQL Server\\100\\DTS\\Binn\\"
    "C:\\Program Files (x86)\\INPAS\\DualConnector\\"
    "D:\\MinGW\\bin"
    "D:\\MinGW\\msys\\1.0\\bin"
    "C:\\Program Files\\Git\\cmd"
    "C:\\Program Files (x86)\\Windows Kits\\10\\Windows Performance Toolkit\\"
    "C:\\Program Files\\Microsoft SQL Server\\110\\Tools\\Binn\\"
    "C:\\Program Files\\CMake\\bin"
    "C:\\Program Files (x86)\\GNU Tools Arm Embedded\\9 2019-q4-major\\bin"
    "C:\\Users\\p\\AppData\\Local\\Microsoft\\WindowsApps"
    "C:\\Users\\p\\AppData\\Local\\GitHubDesktop\\bin"
    "C:\\Users\\p\\AppData\\Local\\Microsoft\\WindowsApps"
    "C:\\xampp\\php"
    "C:\\VSCode\\bin"
    "C:\\Program Files (x86)\\CMake\\bin"

Как изменить значение PATH для среды выполнения вашей программы

В файле launch.json добавляем для ветки запуска программы:

"env": {
	"Path": "${env:Path};G:\\QT\\Qt5.15.14-Windows-x86_64-VS2019\\bin"
},

В самом CMake нельзя установить переменную в PATH, так как он сам вызывается из среды разработки, то есть среда разработки вызывает cmake для подготовки сборки и изменить PATH родителя CMake не может естественно. Потом среда разработки VS Code настраивает среду запуска программы через launch.json. В общем есть один вариант и хватит этого.

Что работает уже с Qt на данном этапе

Таким образом отладка работает нормально (с кодом Qt).

Ошибки в коде с Qt командами подсвечиваются нормально, но только после сборки. Если все хорошо не подсвечиваются. Возможно это связано с установленными lint расширениями или cppchecker трудно разобраться... 

Чего еще не работает

Навигация по коду не работает, то есть нельзя перейти на файл определения какой-то сущности по F2 например (как в Qt).

Подсказки для наборе кода

Речь от тем как заставить редактор помогать при наборе команд, директив и т.д.

Примечание: cppchecker что-то начинает подсказывать, но это не то что нам нужно.

Вообще говоря похоже это называется auto completer. Находим первый попавшийся под руку cpp-include-complete и он уже начинает что-то подсказывать после #include ...

фотка 2

Не так хорошо как в Qt Creator работает , но лучше чем ничего: 

фотка 3