Какая программа создает заголовочный c файл для ui файла созданного в designer

Обновлено: 06.07.2024

Файлы пользовательского интерфейса Qt Designer представляют дерево виджетов формы в формате XML.Формы могут быть обработаны:

  • Во время компиляции это означает, что формы преобразуются в код C ++, который можно скомпилировать.
  • Во время выполнения , что означает, что формы обрабатываются классом QUiLoader, который динамически создает дерево виджетов при синтаксическом анализе XML-файла.

Обработка временных форм

Вы создаете компоненты пользовательского интерфейса с помощью Qt Designer и используйте интегрированные инструменты сборки Qt, qmake и uic , чтобы сгенерировать для них код при сборке приложения. Сгенерированный код содержит объект пользовательского интерфейса формы. Это структура C ++, которая содержит:

  • Указатели на виджеты формы,макеты,элементы макета,группы кнопок и действия.
  • setupUi() to build the widget tree on the parent widget. --> Функция-член setupUi() для построения дерева виджетов на родительском виджете.
  • retranslateUi() that handles the translation of the string properties of the form. For more information, see Reacting to Language Changes. --> Функция-член retranslateUi() которая обрабатывает перевод строковых свойств формы. Дополнительные сведения см. В разделе « Реакция на изменения языка» .

Сгенерированный код может быть включен в ваше приложение и использоваться непосредственно из него.Кроме того,вы можете использовать его для расширения подклассов стандартных виджетов.

Форма обработки времени компиляции может быть использована в Вашем приложении с одним из следующих подходов:

  • Прямой подход : вы создаете виджет для использования в качестве заполнителя для компонента и настраиваете внутри него пользовательский интерфейс.
  • Подход с единым наследованием : вы создаете подкласс базового класса формы (например, QWidget или QDialog ) и включаете частный экземпляр объекта пользовательского интерфейса формы.
  • Подход с множественным наследованием : вы подклассифицируете как базовый класс формы, так и объект пользовательского интерфейса формы. Это позволяет использовать виджеты, определенные в форме, непосредственно из области действия подкласса.

Чтобы продемонстрировать, мы создаем простую форму калькулятора. Он основан на исходном примере формы калькулятора .

main.cpp and a UI file. --> Приложение состоит из одного исходного файла, main.cpp и файла пользовательского интерфейса.

calculatorform.ui file designed with --> calculatorform.ui файл разработан с Qt Designer показан ниже:

qmake to build the executable, so we need to write a .pro file: --> Мы будем использовать qmake для сборки исполняемого файла, поэтому нам нужно написать файл .pro :

FORMS declaration that tells qmake which files to process with uic . In this case, the calculatorform.ui file is used to create a ui_calculatorform.h file that can be used by any file listed in the SOURCES declaration. --> Особенностью этого файла является объявление FORMS , которое сообщает qmake , какие файлы обрабатывать с помощью uic . В этом случае calculatorform.ui файл используется для создания ui_calculatorform.h файл , который может быть использован любой файл , указанный в SOURCES декларации.

Примечание: Вы можете использовать Qt Creator для создания проекта формы калькулятора. Он автоматически генерирует файлы main.cpp, UI и .pro, которые затем можно изменять.

Прямой подход

ui_calculatorform.h file directly in main.cpp : --> Чтобы использовать прямой подход, мы ui_calculatorform.h файл ui_calculatorform.h непосредственно в main.cpp :

main function creates the calculator widget by constructing a standard QWidget that we use to host the user interface described by the calculatorform.ui file. --> main функция создает калькулятор виджет, создав стандартный QWidget , который мы используем для размещения пользовательского интерфейса , описываемый calculatorform.ui файл.

Ui::CalculatorForm is an interface description object from the ui_calculatorform.h file that sets up all the dialog's widgets and the connections between its signals and slots. --> В данном случае Ui::CalculatorForm - это объект описания интерфейса из файла ui_calculatorform.h , который устанавливает все виджеты диалогового окна и связи между его сигналами и слотами.

Прямой подход обеспечивает быстрый и простой способ использования простых,автономных компонентов в ваших приложениях.Однако компоненты,созданные с помощью Qt Designer CalculatorForm code provided above will compile and run, but the QSpinBox objects will not interact with the QLabel as we need a custom slot to carry out the add operation and display the result in the QLabel. To achieve this, we need to use the single inheritance approach. --> часто требует тесной интеграции с остальным кодом приложения. Например, приведенный выше код CalculatorForm будет скомпилирован и запущен, но объекты QSpinBox не будут взаимодействовать с QLabel, так как нам нужен специальный слот для выполнения операции добавления и отображения результата в QLabel . Чтобы добиться этого, нам нужно использовать подход единственного наследования.

Подход к единичному наследованию

Чтобы использовать подход одиночного наследования,мы подклассифицируем стандартный виджет Qt и включаем частный экземпляр объекта пользовательского интерфейса формы.Это может принять форму:

  • Переменная-член
  • Переменная члена указателя

Использование переменной члена

Ui::CalculatorForm structure is a member of the class. --> В этом подходе мы создаем подкласс виджета Qt и настраиваем пользовательский интерфейс из конструктора. Компоненты, используемые таким образом, предоставляют виджеты и компоновки, используемые в форме, для подкласса виджетов Qt и предоставляют стандартную систему для установления соединений сигналов и слотов между пользовательским интерфейсом и другими объектами в вашем приложении. Сгенерированная структура Ui::CalculatorForm является членом класса.

Этот подход используется в примере формы калькулятора .

uic generates before referring to Ui::CalculatorForm : --> Чтобы убедиться, что мы можем использовать пользовательский интерфейс, нам нужно включить файл заголовка, который uic генерирует, прежде чем обращаться к Ui::CalculatorForm :

.pro file must be updated to include calculatorform.h : --> Это означает , что .pro файл должен быть обновлен , чтобы включить calculatorform.h :

Подкласс определяется следующим образом:

ui object which provides the code for setting up and managing the user interface. --> Важная особенность класса является частным ui объекта , который содержит код для настройки и управления пользовательского интерфейсом.

ui object's setupUi() function. Once this has been done, it is possible to modify the user interface as needed. --> Конструктор подкласса конструирует и настраивает все виджеты и макеты для диалога, просто вызывая функцию setupUi() объекта ui . Как только это будет сделано, можно при необходимости изменить пользовательский интерфейс.

Мы можем подключить сигналы и слоты в виджетах пользовательского интерфейса обычным способом, добавив префикс on_ <имя объекта> -. Для получения дополнительной информации см. Widgets-and-dialogs-with-auto-connect .

ui data member. We can use this method to define a number of user interfaces within the same widget, each of which is contained within its own namespace, and overlay (or compose) them. This approach can be used to create individual tabs from existing forms, for example. --> Преимуществами этого подхода являются простое использование наследования для предоставления интерфейса на основе QWidget и инкапсуляция переменных виджета пользовательского интерфейса внутри элемента данных ui . Мы можем использовать этот метод для определения ряда пользовательских интерфейсов в одном и том же виджете, каждый из которых содержится в своем собственном пространстве имен, и накладывать (или составлять) их. Этот подход можно использовать, например, для создания отдельных вкладок из существующих форм.

Использование переменной члена указателя

Ui::CalculatorForm structure can be made a pointer member of the class. The header then looks as follows: --> В качестве альтернативы структуру Ui::CalculatorForm можно сделать членом-указателем класса. Заголовок выглядит следующим образом:

Соответствующий исходный файл выглядит следующим образом:

ui_calculatorform.h file in the header. The form can then be changed without recompiling the dependent source files. This is particularly important if the class is subject to binary compatibility restrictions. --> Преимущество этого подхода заключается в том, что объект пользовательского интерфейса может быть объявлен вперед, что означает, что нам не нужно включать сгенерированный файл ui_calculatorform.h в заголовок. Затем форму можно изменить без перекомпиляции зависимых исходных файлов. Это особенно важно, если на класс действуют ограничения двоичной совместимости.

Обычно мы рекомендуем этот подход для библиотек и больших приложений. Для получения дополнительной информации см. Создание общих библиотек .

Подход с множественным наследованием

Формы,созданные с Qt Designer может быть разделен на подклассы вместе со стандартным классом на основе QWidget . Этот подход делает все компоненты пользовательского интерфейса, определенные в форме, напрямую доступными в рамках подкласса, и позволяет выполнять соединения сигналов и слотов обычным способом с помощью функции connect () .

Этот подход используется в примере множественного наследования .

uic generates from the calculatorform.ui file, as follows: --> Нам необходимо включить заголовочный файл , который uic генерируют из calculatorform.ui файла, как показано ниже:

Класс определяется аналогично тому, который используется в подходе с единичным наследованием , за исключением того, что на этот раз мы наследуем от both Ui::CalculatorForm , as follows: --> QWidget и Ui::CalculatorForm следующим образом:

Ui::CalculatorForm privately to ensure that the user interface objects are private in our subclass. We can also inherit it with the public or protected keywords in the same way that we could have made ui public or protected in the previous case. --> Мы наследуем Ui::CalculatorForm конфиденциально, чтобы гарантировать, что объекты пользовательского интерфейса являются частными в нашем подклассе. Мы также можем унаследовать его с public или protected ключевыми словами так же, как мы могли бы сделать пользовательский ui общедоступным или защищенным в предыдущем случае.

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

ui prefix to access them. --> В этом случае к виджетам, используемым в пользовательском интерфейсе, можно получить доступ так же, как к виджетам, созданным в коде вручную. Нам больше не нужен префикс ui для доступа к ним.

Реагирование на языковые изменения

retranslateUi() of the user interface object, we reimplement QWidget::changeEvent() in the form class, as follows: --> Qt уведомляет приложения, если язык пользовательского интерфейса изменяется, отправляя событие типа QEvent :: LanguageChange . Чтобы вызвать функцию-член retranslateUi() объекта пользовательского интерфейса, мы повторно QWidget::changeEvent() в классе формы следующим образом:

Временная форма обработки

В качестве альтернативы формы можно обрабатывать во время выполнения, создавая динамически генерируемые пользовательские интерфейсы. Это можно сделать с помощью модуля QtUiTools, который предоставляет класс QUiLoader для обработки форм, созданных с помощью Qt Designer .

Подход UiTools

qmake project file, ensuring that the application is compiled and linked appropriately. --> Файл ресурсов, содержащий файл пользовательского интерфейса, необходим для обработки форм во время выполнения. Кроме того, приложение необходимо настроить для использования модуля QtUiTools . Это делается путем включения следующего объявления в файл проекта qmake , гарантируя, что приложение скомпилировано и правильно скомпилировано.

Класс QUiLoader предоставляет объект загрузчика формы для создания пользовательского интерфейса. Этот пользовательский интерфейс может быть получен из любого QIODevice , например, объекта QFile , для получения формы, хранящейся в файле ресурсов проекта. Функция QUiLoader :: load () создает виджет формы, используя описание пользовательского интерфейса, содержащееся в файле.

В QtUiTools модуль классы могут быть включены , используя следующую директиву:

Функция QUiLoader :: load () вызывается, как показано в этом коде из примера Text Finder :

В классе, который использует QtUiTools для построения своего пользовательского интерфейса во время выполнения, мы можем находить объекты в форме с помощью QObject :: findChild (). Например, в следующем коде мы находим некоторые компоненты на основе их имен объектов и типов виджетов:

Обработка форм во время выполнения дает разработчику свободу изменения пользовательского интерфейса программы,просто изменяя файл пользовательского интерфейса.Это полезно при настройке программ в соответствии с различными потребностями пользователей,например,при использовании сверхбольших значков или другой цветовой схемы для поддержки доступности.

Автоматические соединения

Соединения сигналов и слотов, определенные для форм времени компиляции или времени выполнения, могут быть установлены вручную или автоматически, используя способность QMetaObject устанавливать соединения между сигналами и слотами с подходящими названиями.

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

Диалог без автоподключения

Мы определяем диалог так же,как и раньше,но теперь включаем слот в дополнение к конструктору:

checkValues() slot will be used to validate the values provided by the user. --> checkValues() слот будет использоваться для проверки значений , указанных пользователем.

В конструкторе диалогового окна мы настраиваем виджеты, как и раньше, и подключаем сигнал clicked () кнопки Отмена к слоту reject () диалогового окна. Мы также отключаем свойство autoDefault на обеих кнопках, чтобы диалог не мешал тому, как редактирование строки обрабатывает возвращаемые ключевые события:

Подключаем OK баттона щелкнул () сигнал checkValues для диалога () слот , который мы реализуем следующим образом :

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

Виджеты и диалоги с автоподключением

uic automatically generates code in the dialog's setupUi() function to do this, so we only need to declare and implement a slot with a name that follows a standard convention: --> Хотя легко реализовать настраиваемый слот в диалоговом окне и подключить его в конструкторе, мы могли бы вместо этого использовать средства автоматического подключения QMetaObject для подключения сигнала clicked () кнопки OK к слоту в нашем подклассе. uic автоматически генерирует код в функции setupUi() диалогового окна для этого, поэтому нам нужно только объявить и реализовать слот с именем, которое соответствует стандартному соглашению:

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

on_findButton_clicked() slot. --> Другим примером автоматического соединения сигнала и слота может быть Text Finder с его on_findButton_clicked() .

Мы используем систему QMetaObject для включения соединений сигналов и слотов:

Это позволяет нам реализовать слот,как показано ниже:

Автоматическое подключение сигналов и слотов обеспечивает как стандартное соглашение об именовании,так и явный интерфейс для работы дизайнеров виджетов.Предоставляя исходный код,реализующий заданный интерфейс,дизайнеры пользовательских интерфейсов могут проверить,что их дизайн на самом деле работает без необходимости писать код самостоятельно.

У меня есть приложение, в котором у меня есть файл mainwindow.ui, и я создаю новый файл-конструктор dialoge.ui в том же приложении, как я могу создать исходный файл и заголовочный файл для dialoge.ui. Я использую QtCreater (окна).

Я новичок в qt, я думаю, что для этого должен быть способ, но я не получаю. Помоги мне. Благодаря

Я не уверен, что полностью понял ваш вопрос. У вас есть приложение, разработанное в QtCreator, в котором у вас есть 2 файла .ui. И вы хотите сгенерировать соответствующие файлы заголовка/источника для этих 2 файлов.

Используя QtCreator, вам не нужно беспокоиться о создании файлов заголовков. Это делается автоматически. Во время фазы сборки User Interface Compiler (uic) вызывается и переводит файлы .xml в файлы заголовков С++.

Вы можете создать источник и заголовок из файла .ui извне, а затем импортировать их в свое приложение (не забывайте ссылаться затем в файле .pro). Создайте исполняемый файл (.bat или .exe) для выполнения следующих команд. Ниже находится оболочка script (я пользователь linux.)

Для каждого файла someidget.ui, во время процесса сборки будут созданы ui_somewidget.h и ui_somewidget.cpp. Инструмент, используемый для их создания, является uic. Все, что вы должны убедиться, что .ui файлы добавлены в .pro файл вашего проекта вместе с другими исходными и заголовочными файлами, например:

qmake/make будет автоматически генерировать и создавать файлы .cpp и .h для someidget.ui.

вы можете сделать это:

Сохраните файл dialoge.ui в каталоге. Используйте qmake для создания файла .pro(qmake -project), qmake достаточно умен, чтобы обнаружить .ui. Это также сгенерирует соответствующие правила makefile для вызова uic, компилятора пользовательского интерфейса Qt. Если вы используете визуальную студию, вы можете вызвать qmake -tp vc, это создаст визуальный студийный проект, связанный и готовый к использованию. Проект visual studio будет генерировать ui_dialoge.h для вас, вы можете скопировать его в другой проект и использовать его в другом файле заголовка, который будет использовать этот диалог .ui

Дополнительно к уже правильным ответам: переход из режима отладки в режим выпуска в общих настройках. В моем случае заголовочный файл не был создан в режиме отладки

У меня есть приложение, в котором у меня есть файл mainwindow.ui, и я теперь создаю новый файл конструктора dialoge.ui в том же приложении, как я могу создать исходный файл и файл заголовка для dialoge.ui. Я использую QtCreater (windows ).

Я новичок в Qt, я думаю, что должен быть способ для того же, но я не понимаю. Помоги мне. Благодаря

Я не уверен, что полностью понял ваш вопрос. У вас есть приложение, разработанное в QtCreator, в котором у вас есть 2 файла .ui. И вы хотите сгенерировать соответствующие заголовочные /исходные файлы для этих двух файлов.

Используя QtCreator, вам не нужно беспокоиться о создании заголовочных файлов. Это делается автоматически. На этапе сборки вызывается User Interface Compiler (uic) и преобразует файлы .xml в файлы заголовков c ++.

Вы можете создать источник & внешний заголовок файла .ui & затем импортируйте их в свое приложение (не забудьте обратиться к файлу .pro.). Создайте исполняемый файл (.bat или .exe) для выполнения следующих команд. Ниже приведен скрипт оболочки (я пользователь Linux).

Для каждого файла somewidget.ui в процессе сборки будут созданы файлы ui_somewidget.h и ui_somewidget.cpp. Инструмент, используемый для их генерации, является утилитарным. Все, что вам нужно, это убедиться, что файлы .ui добавлены в файл .pro вашего проекта вместе с другими файлами исходного кода и заголовков, например так:

qmake /make автоматически сгенерирует и создаст файлы .cpp и .h для somewidget.ui.

вы можете сделать это:

Сохраните файл dialoge.ui в каталоге. Используйте qmake для создания файла .pro (qmake -project), qmake достаточно умен, чтобы обнаружить .ui. Это также сгенерирует соответствующие правила make-файла для вызова uic, компилятора пользовательского интерфейса Qt. Если вы используете Visual Studio, вы можете вызвать qmake -tp vc, это сгенерирует проект Visual Studio, связанный и готовый к использованию. Проект Visual Studio создаст для вас файл ui_dialoge.h, вы можете скопировать его в другой проект и использовать в другом заголовочном файле, который будет использовать этот dialoge.ui

В дополнение к уже правильным ответам: перейдите из режима Debug в режим Release в общих настройках. В моем случае файл заголовка не был создан в режиме Debug

У меня есть приложение, в котором у меня есть файл mainwindow.ui, и теперь я создаю новый файл конструктора dialoge.ui в том же приложении, как я могу создать исходный файл и файл заголовка для dialoge.ui. Я использую QtCreater (windows).

Я новичок в qt, думаю, должен быть способ сделать то же самое, но я не понимаю. Помоги мне. Спасибо

Я не уверен, что полностью понял ваш вопрос. У вас есть приложение, разработанное в QtCreator, в котором у вас есть 2 файла .ui. И вы хотите сгенерировать соответствующие заголовочные / исходные файлы для этих двух файлов.

Используя QtCreator, вам не нужно беспокоиться о создании файлов заголовков. Это делается автоматически. На этапе сборки вызывается User Interface Compiler (uic) , который переводит файлы .xml в файлы заголовков C ++.

В дополнение к уже правильным ответам: измените режим Debug на Release в общих настройках. В моем случае файл заголовка не был создан в режиме Debug .

Ты можешь это сделать:

Сохраните файл dialoge.ui в каталоге. Используйте qmake для создания файла .pro (qmake -project), qmake достаточно умен, чтобы обнаружить .ui. Это также сгенерирует соответствующие правила make-файла для вызова uic, компилятора пользовательского интерфейса Qt. Если вы используете Visual Studio, вы можете вызвать qmake -tp vc, это сгенерирует проект Visual Studio, связанный и готовый к использованию. Проект Visual Studio сгенерирует для вас ui_dialoge.h, вы можете скопировать его в другой проект и использовать его в другом файле заголовка, который будет использовать этот dialoge.ui.

Для каждого файла somewidget.ui в процессе сборки будут созданы ui_somewidget.h и ui_somewidget.cpp. Инструмент, используемый для их создания, - uic. Все, что вам нужно - убедиться, что файлы .ui добавлены в файл .pro вашего проекта вместе с другими исходными файлами и файлами заголовков, например:

Qmake / make автоматически сгенерирует и построит файлы .cpp и .h для somewidget.ui.

Вы можете создать исходный код и заголовок из файла .ui извне, а затем импортировать их в свое приложение (не забудьте указать это в файле .pro.). Создайте исполняемый файл (.bat или .exe) для выполнения следующих команд. Ниже приведен сценарий оболочки (я пользователь Linux).

Рассмотрим, как файлы форм интегрируются в проект. Как мы уже отмечали ранее, для того чтобы добавить файл формы в проект существует специальная переменная FORMS. Если мы откроем .рro -файл, то увидим:

При создании проекта для нашего примера мы установили флажок "Generate form" для того, чтобы автоматически сгенерировать форму для главного окна и добавить необходимый код для доступа к элементам на форме в программе. Среди кода, мастер автоматически добавил к объявлению и реализации класса MainWindow :

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

Обратите внимание на то, как мы используем класс Qt QKeySequence для того, чтобы задать горячие клавиши для действий. Помимо возможности задать комбинацию клавиш текстовой строкой (например QKeySequence (Ctrl + X)) или с помощью специально определенных констант для клавиш (например QKeySequence (Qt :: CTRL + Qt :: Key_X)), можно воспользоваться набором стандартных клавиатурных сокращений, которые будут соответствовать стандартам системы. Так для повторения отмененного действия в ОС Linux пользователь сможет воспользоваться комбинацией клавиш Ctrl+Shift+Z, а в ОС Windows привычной комбинацией Ctrl+Y.

Нашему текстовому редактору еще не хватает функциональности: нам необходимо запрограммировать создание, открытие и сохранение текстового файла, а также пункты меню Help .

Для начала добавим объявления слота для создания нового файла и добавим поле для сохранения пути текущего открытого файла:

Мы используем частный метод updateTitle() для того, чтобы обновить заголовок окна и вывести название программы и путь к текущему открытому файлу:

Реализация метода обновления заголовка:

Метод setWindowTitle() позволяет не только задать текст заголовка для окна, но и отметить несохраненные изменения в текущем открытом документе. Для этого, после заголовка мы добавили шаблон [*] . Теперь, если сообщить главному окну о редактировании содержимого посредством вызова слота QWidget::setWindowModified(bool) со значением true , то после текста заголовка появится символ " * ", означающий, что содержание главного окна изменено и его следует сохранить. Слот setWindowModified(bool) мы соединили с сигналом modificationChanged(bool) текстового поля QPlanTextEdit с помощью редактора сигнально-слотовых соединений в редакторе форм (см. предыдущий пункт).

Добавим реализацию слота MainWindow::slotNew() :

Теперь присоединим объект QAction для создания нового документа к слоту:

Сигнал выпускается при выполнении действия (вызова пункта меню, нажатие кнопки на панели инструментов, для которой была добавлено действие и т.д.). В конце конструктора вызовем слот slotNew() :

Остальные пункты меню мы запрограммируем в следующем параграфе, в котором мы рассмотрим работу со стандартными системными диалогами в Qt .

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