Visual studio отладка qt

Обновлено: 07.07.2024

Настройка среды разработки Mingw / Visual Studio + Qt5

1. Введение в QT Framework

Фреймворк Qt - это кроссплатформенный фреймворк для разработки интерфейса пользовательского интерфейса, который поддерживает язык C ++ для быстрой разработки графического интерфейса, который может быть перенесен на платформу. По сравнению с традиционной разработкой графического интерфейса Win32 / MFC, библиотека QT имеет более элегантную и лаконичную инкапсуляцию, предоставляет множество стандартных элементов управления и функциональных интерфейсов, а также инкапсулирует механизмы многих операционных систем, позволяя разработчикам сосредоточиться на бизнесе и графическом интерфейсе. логическая реализация.

Во-вторых, среда создана

1. Установите версию qt-windows-mingw или установите версию MSVC (Visual Studio)

Mingw - это полностью бесплатная версия для разработки на основе GPL.

Версия msvc обеспечивает интеграцию с Microsoft Visual Studio для быстрой разработки сложных приложений корпоративного уровня. Библиотеки времени выполнения, на которые полагаются эти два, совершенно разные. Поскольку компания разрабатывает продукты на базе Visual Studio, здесь используется версия msvc.

Если расширение и кроссплатформенность рассматриваются с самого начала, приоритет следует отдавать версии Mingw.

2. Конфигурация среды (из-за этого наиболее важный qtenv2.bat имеет много ошибок компиляции и компоновки)

После установки требуется простая настройка.

После успешной настройки откройте любое окно CMD, удача Qmake должна отобразить интерфейс, подобный следующему



3. Выполните отладку и сообщите об ошибке утверждения в Visual Studio.

Создайте новый проект приложения Qt Gui в Vs для тестирования Hello Word.

int main(int argc, char *argv[])
QApplication app(argc, argv);
QLabel *label = new QLabel("Hello Qt!");
label->show();
return app.exec();
>

Скомпилируйте и запустите, возникает ошибка утверждения.



Причина в том, что в реестре есть ключ, связанный со шрифтом, имя - simsum в китайской Windows, а имя псевдонима в реальной работе - " ".

Это приводит к утверждению, решение состоит в том, чтобы удалить значение ключа

Эту проблему можно решить позже, удалив это значение.

В-третьих, общая конфигурация проекта компиляции.

Поскольку ресурсы Qt, созданные проектом Visual Studio, не подходят для публикации, а сама VS не принадлежит к соглашению GPL, проекты с открытым исходным кодом Qt, которые обычно выпускаются онлайн бесплатно, обычно подпадают под действие соглашения GPL.

Это требует использования Toolchain на основе GPL для компиляции проектов Qt.

1. Выполните следующую команду

2. Добавьте эту строку в сгенерированный файл pro

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

Поскольку Qt5 изменил архитектуру и переместил компонент QtGui в QtWidget, а конфигурация проекта по умолчанию не будет добавлена ​​в QtWidget, будет много ошибок, если вы будете использовать командную строку для компиляции. Нужно добавить эту строку

3. Выполните следующую команду

Сгенерирует файлы make, которые в конечном итоге нужно будет скомпилировать

4. Выполните mingw32-make для компиляции (Clang также можно использовать в системе Windows), если вам нужно использовать основной компилятор текущей платформы в Linux и MacOsx.

5. Проблема конвертации проекта в visual studio. При использовании qmake для преобразования по умолчанию возникает множество проблем (обратитесь к онлайн-скрипту). После преобразования нет проблем для компиляции и запуска.

В-четвертых, другие конфигурации

1. Конфигурация Visual Studio

Чаще всего встречается в VS то, что он не создает mocxxx.cpp и, в конечном итоге, вызывает множество проблем с подключением.

Решение заключается в следующем: щелкните правой кнопкой мыши свойства файлов, которые не создаются и не компилируются автоматически, выберите Custom Build и измените содержимое следующим образом.



2. Открытие проекта, созданного Qmake в Visual Studio, будет вызывать перекомпиляцию каждый раз после отладки.

Используйте Qt Plugin для Visual, чтобы открыть файл pro, созданный Qmake, он автоматически построит правильную конфигурацию и не будет перекомпилировать каждый раз при отладке.

Справочный документ "Программирование на C ++ Gui с помощью Qt4"

Я отлаживаю приложение Qt в Visual Studio 2013. У меня установлен официальный плагин Visual Studio из Qt. Я могу видеть содержимое QString , но для любого другого QObject такой как QDir или QFileInfo объект Я не могу увидеть его содержимое.

Я что-то не так делаю или это просто невозможно?

Когда я разверну QDir Экземпляр я могу видеть только член с именем d_ptr который ссылается на QDirPrivate объект, который я не могу осмотреть. Я также не могу назвать другие функции QDir или же QFileInfo такие как path() , или же filePath() во время выполнения от отладчика. Когда я пытаюсь это сделать, Visual Studio утверждает, что адрес функции был оптимизирован.

Есть ли способ отладить это без добавления десятков операторов журнала в программу?

Решение

ОБНОВИТЬ

После уточнения в последнем ответе, что это было невозможно, сегодня я нашел способ заставить отладчик показывать приватную (скрытую) информацию.

Примечание: я сохранил старый пост ниже, потому что он раскрывает весь путь, по которому я пошел, чтобы найти это решение, и я думаю, что стоит отслеживать ошибки и неправильные выводы, поэтому никто больше не сделал их снова;).

Предположим, у вас есть QDir d; переменная. Вы можете проверить его внутренние данные, выполнив приведение вручную в окне Watch:

Смотреть окно

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

Однако с этого момента вы можете теперь изменить свой файл .natvis, чтобы отображать нужные данные при наведении:

сделанный!

Я не смог распечатать эту информацию в окне просмотра (если я добавлю Expand раздел к файлу .natvis, кажется, опущен), но по крайней мере у вас есть эта информация о времени отладки.

Я предлагаю вам взглянуть на файлы закрытого заголовка или окно Watch (как описано в начале ответа) для типов, которые вы хотите проверить, чтобы вы могли добавить правильные данные в файл .natvis.

Что было не так в предыдущем анализе?

Я думаю, что ключевым моментом является ручное литье. Я упоминал, что

dirEntry это часть QDirPrivate Таким образом, ясно, что отладчик не может его проверить.

Это было частично правильно. Проблема была в том, что отладчик не знал, где найти QDirPrivate так как это не экспортируемый символ Qt; как только мы указали это явно (через (Qt5Cored.dll!QDirPrivate*) бросил) смог осмотреть его.

ОРИГИНАЛЬНЫЙ ОТВЕТ

AFAIK это не возможно для тех классов. К сожалению, есть некоторые частный структуры, которые не экспортируются и кажутся отладчику не могут Посмотреть.

Примечание: я работаю с Qt 5.6.1, поэтому я собираюсь использовать его исходный код из репозитория qt.io, чтобы соответствовать моим примерам.

Давайте принимать QDir например: это определено в qdir.h , который является частью публичного API Qt. В том же файле это объявляет QDirPrivate но его полное определение в qtdir_p.h который не является частью публичного API.

Даже если символы загружены, определение этого класса остается неясным для отладчика. Смотрите пример файла .natvis, который я использовал:

Но при попытке посмотреть отладчик показывает следующее QDir d(qApp->applicationDirPath()); :

но dirEntry является часть QDirPrivate Таким образом, ясно, что отладчик не может его проверить. dirEntry имеет тип QFileSystemEntry , определенный в qfilesystementry_p.h (еще один частный класс).

Наконец, если вы посмотрите на qt5.natvis файл из Qt VS Tools и найдите соответствующие классы в исходном коде, вы увидите, что все включенные классы предоставляют определение структур, используемых файлом .natvis.

ОБНОВИТЬ

Единственным открытым API таких классов являются методы, к сожалению, вызов функций из отладчика не поддерживается. Ссылаясь на ответ в MSDN форум от сотрудников Microsoft :

Вызов функции из отладчика играет с огнем. Скорее всего, вы заблокируете межпоточные зависимости (даже если у вас нет явных межпоточных зависимостей, существуют общие блокировки для таких вещей, как распределение памяти). Вот почему отладчик C ++ не поддерживает неявный funceval.

Ошибка: функция QDir :: absolutePath не имеет адреса, возможно, из-за оптимизации компилятора.

НЕ ТАК ЭЛЕГАНТНАЯ РАБОТА

Возможным решением было бы использовать классы-обертки, которые хранят эти частные значения. Вам нужно будет заменить каждый объект оболочкой, но это может помочь.

Ниже вы найдете очень простой пример QDir (вам нужно заполнить необходимые конструкторы и сохранить нужную информацию). Имейте в виду, что классы этого типа в Qt были разработаны так, чтобы не быть расширяемыми, поэтому здесь нет виртуальных методов (поэтому следует помнить о переопределении некоторых из них и об использовании объекта, приведенного к базовому классу).

и следующий файл .natvis для отображения MyQDir Путь на висение:

Как примечание стороны, этот урок объясняет, как написать собственный файл .natvis. Это на 2015 год, но я использовал его на 2017 год без нареканий. Надеюсь, это будет действовать и в 2013 году.

Другие решения

У меня есть следующие расширения к qt5.natvis, который предоставляет некоторые из содержимого QDir, QFile и QFileInfo, основываясь на оригинальном предложении выше:

Я установил Qt, но я получаю ошибки при попытке отладки кода C++ в QtCreator. Я использую Visual Studio 2017 в Windows, и это похоже на отладчик, который нужен QtCreator (cdb.exe) не установлен. Как настроить отладку для работы с 64-разрядным кодом в QtCreator при использовании компилятора MSVC2017?

то, что я обсуждаю здесь, - это работа QtCreator с компилятором Visual Studio 2017 (MSVC2017), включая отладку! Установка по умолчанию MSVC2017 и Qt 5.10 позволит вам компилировать и запускать код, но вы не получите поддержку отладки по умолчанию. Я покажу шаги, необходимые для установки всего (включая поддержку отладки) для следующей справочной системы:

Справочная Система

  • Windows 7 SP1 x64 (работает точно так же с Win10, тоже)
  • Visual Studio 2017 (Версия 15.5.1)
  • Qt 5.10.0
  • Qt Creator 4.5.0 (MSVC 2015, 64-бит)
  • инструменты отладки для Windows (CDB.exe), который не поставляется с Visual Studio 2017
    • через Windows 10 SDK

    я протестировал эти шаги как на Windows 10, так и на Windows 7 (x64), и, похоже, работает. Обратите внимание, что версия QtCreator, которая поставляется в комплекте с установщиком Qt, является 32-битной версией, и она не будет работать из коробки, Если вы пытаетесь выполнить отладку с помощью MSVC. Это задокументировано, но не пошагово (см. Отладка Windows QtCreator и QtCreator Отладчик Двигатели), и не все находится в одном месте, поэтому я собираюсь предоставить простые инструкции здесь о том, как заставить вещи работать для справочной системы, которую я описываю выше.

    предпосылки

    • Windows 7 x64 или Windows 10
    • Visual Studio 2017 (протестировано с версией 15.5.1)

    предполагая, что у вас установлены Win7 / Win10 и MSVC2017, давайте начнем!

    Qt 5.10 Setup

    Windows 10 SDK

    Windows 10 SDK feature selection

      веб-установщик загрузит выбранный компонент и создаст папку под названием "наборы Windows."

    установите эти два файла (версия x86 является необязательной):

    • Windows Kits\10\WindowsSDK\Installers\X64 Отладчики и инструменты-x64_en-us.компания MSI
    • Наборы Windows\10\WindowsSDK\Установщики\Отладчики X86 И Инструменты-x86_en-us.компания MSI

    Win SDK debugger installers

    установите 64-разрядный автономный установщик для QtCreator

    Примечание: Если вы устанавливаете QtCreator после установки инструментов отладки Windows, QtCreator автоматически определит местоположение отладчиков, экономя хлопоты при создании наборов. Если вы уже установили QtCreator, не волнуйтесь, настройка наборов в QtCreator показана под.

    enter image description here

    • эта версия, похоже, имеет возможность выбрать "поддержка отладчика CDB" (не найдена при установке полного пакета Qt, в который входит Qt Creator)

    Qt Creator 4.5.0 (64-bit) setup

    настройка наборов в QtCreator

    на языке или терминологии QtCreator "комплект" представляет собой комбинацию отладчик + компилятор + версия Qt + другие. (В этом смысле слово " комплект "не означает то же самое, что и для" комплектов Windows", когда мы установили отладчик выше; это неудачное столкновение имен.) Настройте "QtCreator Kit", выбрав Сервис -> Параметры -> сборка и запуск. Мне нравится начинать с крайней правой вкладки и работать слева, заканчивая "комплекты"."Причина этого заключается в том, что все вкладки (1,2,3) ниже должны быть настроены для того, чтобы сделать полный Комплект.

    QtCreator kit configuration order

    • прописать путь к C:\Program Files (x86)\Windows Kits\Debuggers\x64\cdb.exe и дайте ему имя типа "Window Kit 10 cdb x64".

    Debugger Tab in QtCreator

    настройки компилятора. Убедитесь, что в списке есть" компилятор Microsoft Visual C++ 15.0 (amd64)". Обратите внимание, что QtCreator автоматически обнаружит эти местоположения, если вы установили вещи в пути по умолчанию. Добавлять путь к компилятору, если он не указан.

    обратите внимание, что для Visual Studio 2017 x64 bit требуется версия "amd64", которая является 64-разрядным компилятором. Если вам интересно, почему в списке так много компиляторов-это "кросс-компиляторы"."Это означает, что они нацелены на разные архитектуры, например, "x86_amd64" - это 32-разрядный процесс, который создает 64-разрядное приложение; вы бы использовали эту версию, если бы разрабатывали 64-разрядный код на 32-разрядном компьютере (следовательно термин кросс-компиляция). Поскольку в этом руководстве предполагается, что вы работаете на 64-разрядной ОС, используйте версию amd64. (Кросс-компилятор "x86_amd64" также будет генерировать 64-битный код.) Когда я впервые увидел огромный список вариантов компилятора в QtCreator, я не знал, какой выбрать. Теперь и ты знаешь! См.при компиляции x64-кода, в чем разница между "x86_amd64"и " amd64"?.

    cpp-64-bit-compiler

    1. клик добавить.
    2. имя - дайте имя набора; это будет конфигурация, которую вы используете при компиляции приложения.
    3. компилятор - выберите " компилятор Microsoft Visual C++ 15.0 (amd64)" для C и c++.
    4. отладчик - выберите "Windows Kit 10 cdb x64", который мы настроили на вкладке" Отладчики"
    5. версия Qt - Выберите " Qt 5.10.0 (msvc2017_64). Важно компилировать с тем же битом, что и библиотеки Qt, с которыми вы будете связываться.
    6. клик применить.

    Kit Setup in Qt Creator

    проверить отладочные работы

    давайте повеселимся и напишем 64-битную программу, а затем отладим ее. Хорошим тестом является выделение большого объема памяти (типичные 32-разрядные процессы Windows ограничены 2 ГБ, см. сколько памяти может a 32-битный процесс на 64-разрядной операционной системы? ). Выделение, скажем, 32 ГБ ОЗУ должно быть положительным показателем того, что мы действительно компилируем 64-битное приложение. Вот снимок экрана QtCreator отладки 64-разрядной тестовой программы Windows:

    Сегодня практически невозможно представить приложение, в котором нет графического интерфейса пользователя (GUI -Graphical User Interface). Windows API обладает необходимыми инструментами для создания GUI. Однако их использование требует больших затрат времени и практического опыта. Даже библиотека MFC, которая призвана облегчить процесс написания GUI приложений на С++ для ОС Windows, не дает той простоты и легкости создания программ, как хотелось бы. Но самый большой недостаток этих инструментов и библиотек — это платформозависимость. В отличие от MFC библиотека Qt кроссплатформенная. При этом она предоставляет возможности создавать GUI в интерактивном режиме.


    В открывшемся окне для выбора модулей нажимаем кнопки Next>Finish (модули по умолчанию). В результате создается шаблон проекта со следующим кодом в файле main.cpp:


    Запускаем программу (клавиша F5). Тест пройден успешно, если открывается окно консоли:


    Если при запуске возникают ошибки, вероятнее всего это связано с отсутствием каких-либо необходимых компонентов в VS. Запустите снова онлайн-инсталлятор Visual Studio 2017 и доустановите их в соответствии с рекомендациями (см. Установка Visual Studio 2017 и Installing Visual Studio 2017 + Qt Interface Library).

    Давайте распечатаем «Hello World», изменив исходный файл:

    Класс QCoreApplication предоставляет цикл обработки событий для консольных приложений Qt. Для приложений с графическим интерфейсом мы будем использовать QApplication. При вызове a.exec () запускается цикл обработки событий.

    Создаем проект Qt GUI приложения (File>New>Project>Visual C++>Qt>Qt GUI Application>OK>Next>Next>Finish). Получаем шаблон приложения с заготовленным кодом. Запускаем его, открывается окно:


    Посмотрим на исходный код в файлах проекта:

    Файл main.cpp


    В первой строке подключается заголовочный файл QtGuiApplication2.h, который расположен непосредственно в созданном проекте. Во второй строке подключается заголовочный файл QApplication, который расположен в модуле QtWidgets:

    В файле main.cpp сначала создается объект класса QApplication, который осуществляет контроль и управление приложением. Для его создания в конструктор этого класса необходимо передать два аргумента. Первый аргумент представляет собой информацию о количестве аргументов в командной строке, с которой происходит обращение к программе, а второй — это указатель на массив символьных строк, содержащих аргументы, по одному в строке. Любая использующая Qt программа с графическим интерфейсом должна создавать только один объект этого класса, и он должен быть создан до использования операций, связанных с пользовательским интерфейсом. После создания элементы управления Qt по умолчанию невидимы, и для их отображения необходимо вызвать метод show().

    В последней строке программы приложение запускается вызовом QApplication::exec(). С его запуском приводится в действие цикл обработки событий, определенный в классе QCoreApplication, являющимся базовым для QApplication. Этот цикл передает получаемые от системы события на обработку соответствующим объектам. Он продолжается до тех пор, пока не будет вызван статический метод QCoreApplication::exit(), либо не закроется окно последнего элемента управления. По завершению работы приложения метод QApplication::exec() возвращает значение целого типа, содержащее код, информирующий о его завершении.

    Файл QtGuiApplication2.h

    В первой строке подключается заголовочный файл QMainWindow, который расположен в модуле QtWidgets.

    В файле QtGuiApplication2.h описывается класс QtGuiApplication2, производный от класса QMainWindow, предоставляемого системой Qt. В разделе public объявляется конструктор. В разделе private создается переменная ui, через которую устанавливается пользовательский интерфейс.

    Макрос Q_OBJECT должен появляться в закрытом разделе описания класса, который объявляет свои собственные signals и slots (см. Signals и slots. Обработка событий) или использует другие сервисы, предоставляемые системой Qt.

    Файл QtGuiApplication2.cpp

    В файле QtGuiApplication2.cpp определяется конструктор с передачей параметра parent конструктору базового класса. Функция setupUi берет на себя все действия по созданию этого (this) окна.

    Изменяем код в файле main.cpp на следующий:

    Запускаем приложение, получаем результат:


    Изменяем код в файле main.cpp на следующий:

    Запускаем приложение, получаем результат:


    Обеспечим агрегацию, чтобы элемент (виджет) label появлялся не отдельно от окна, а входил в него. Для этого изменяем код файлов проекта:

    Файл main.cpp

    Файл QtGuiApplication2.h

    Файл QtGuiApplication2.cpp

    Запускаем приложение, получаем результат:


    В модели события участвуют три участника:

    Ниже приводится описание приложения, при запуске которого появляется окно с кнопкой. При нажатии на кнопку окно закрывается.


    Создадим проект приложения под названием Click и изменим код файлов проекта.

    Файл main.cpp

    Файл Click.h

    Обратите внимание, что вместо трех заголовочных файлов (они закомментированы) можно подключать только лишь модуль QtWidgets, в котором эти файлы находятся. При большем количестве подключаемых файлов читаемость программы заметно ухудшается. Кроме того, подключение модулей дает возможность ускорить компиляцию самой программы за счет предварительно откомпилированных заголовочных файлов (Precompiled Headers) в том случае, если ваш компилятор позволяет это делать.

    Файл Click.cpp

    1. sender — указатель на объект, отправляющий сигнал;
    2. signal — это сигнал, с которым осуществляется соединение;
    3. receiver — указатель на объект, который имеет слот для обработки сигнала;
    4. slot — слот, который вызывается при получении сигнала.
    5. type — управляет режимом обработки.
    • KeyPress
    • QMoveEvent
    • Disconnecting a signal
    • Timer

    Создаем проект Qt GUI приложения (File>New>Project>Visual C++>Qt>Qt GUI Application>OK>Next>Next>Finish). Получаем шаблон приложения с заготовленным кодом. В окне Solution Explore выполняем dblclick на файле QtGuiApplicatin3. ui .


    Откроется редактор Qt Desiner. С панели виджетов перетаскиваем на заготовку окна две кнопки Push Button и меняем надписи на кнопках (через dblclick):



    Выполняем настройки соединения сигнала clicked() кнопки Quit со слотом close() через окно настроек. Окно открывается, когда отпускаем левую кнопку мышки после движения курсора от кнопки Quit.



    Сохраняем результаты роботы в редакторе Qt Desiner (Файл>Сохранить), возвращаемся в редактор VS и запускаем приложение:




    Теперь нужно добавить реализацию этого слота (метода slot1 ()) в программном коде:

    Изменяем код файлов проекта:

    Файл QtGuiApplication3.h

    Файл QtGuiApplication2.cpp

    Читайте также: