Qt как запустить файл

Обновлено: 06.07.2024

На этом уроке мы рассмотрим работу с файлами и каталогами в Qt5. Для этого мы будем использовать следующие классы:

QFile , QDir и QFileInfo — основные классы для работы с файлами в Qt5;

QFile — предоставляет интерфейс для чтения и записи информации в файлы;

QDir — обеспечивает доступ к структуре каталогов и к их содержимому;

QFileInfo — предоставляет информацию о файле, включая его имя и расположение в файловой системе, время доступа и изменения, имя владельца файла и текущие разрешения.

Размер файла

Для определения размера файла в классе QFileInfo предусмотрен метод size():

// Имя файла передается в качестве аргумента в нашу программу qWarning ( "The file does not exist" ) ; // если файл не найден, то выводим предупреждение и завершаем работу программы qint64 size = fileinfo . size ( ) ; // qint64 - это тип данных, который гарантированно будет 64-битным на всех платформах, поддерживаемых Qt

Для запуска программы проделайте следующие шаги:

ПОДГОТОВКА:

Шаг №1: Скомпилируйте вашу программу. Для этого выберите в меню "Сборка" > "Собрать всё" (или нажмите Ctrl+Shift+B ).

Шаг №2: Зайдите в папку, где лежит ваш Qt-проект (у меня он расположен в C:\dev\Qt_Project ).

Шаг №3: После выполнения первого шага у вас должна появиться еще одна папка, в которой будет создан исполняемый файл программы. Т.к. я использую компилятор MinGW 32-bit и режим компиляции Debug, то при компиляции проекта Qt автоматически создал папку build-My_QtApplication-Desktop_Qt_5_13_0_MinGW_32_bit-Debug .

Шаг №4: Зайдите в папку debug (она находится внутри папки, созданной на шаге №3).

Шаг №5: Найдите *.exe-файл вашей программы (у меня это file_size.exe ).

Шаг №6: Скопируйте этот файл в папку к соответствующему компилятору (напомню, т.к. я использовал компилятор MinGW 32-bit, то у меня этот путь выглядит следующим образом: C:\Soft\Qt\5.13.0\mingw73_32\bin ).

ЗАПУСК ПРОГРАММЫ:

Шаг №7: Откройте командную строку.

Шаг №8: Перейдите в папку, указанную в шаге №6 ( cd C:\Soft\Qt\5.13.0\mingw73_32\bin ).

Шаг №9: Запустите свою программу, передав ей в качестве параметра имя любого файла (у меня этим файлом оказалась эта же программа, поэтому в моем случае команда была следующей: file_size.exe file_size.exe ).

Результат выполнения программы:



Чтение содержимого файлов

Для того, чтобы прочитать содержимое файла, мы должны сначала открыть этот файл в режиме чтения, затем создать входящий файловый поток, из которого мы будем считывать данные. В примере, приведенном ниже, мы считываем данные из файла C:\colours.txt . Файл содержит названия семи цветов, вот его содержимое:

Red
Green
Black
Yellow
Purple
Blue
White

Hello Notepad

В первом примере, мы создадим простое окно для редактирования текста. Это самая элементарная программа с графическим интерфейсом Qt.

Исходный код примера:

Рассмотрим подробно каждую строчку кода. В первых двух, мы подключаем заголовочные файлы классов QApplication и QTextEdit, которые необходимы для работы этого примера. Каждому классу в Qt соответствует заголовочный файл с таким же названием.

В строке 6 создается объект класса QApplication, который управляет основными ресурсами, необходимыми для запуска любой программы с графическим интерфейсом Qt. Ему необходимо передать аргументы argv и args функции main() , т.к. Qt использует некоторые параметры командной строки, передаваемые при запуске программы.

В восьмой строке кода создается объект класса QTextEdit. QTextEdit — это визуальный элемент графического интерфейса. В Qt используются определенные виджеты — например, полосы прокрутки, метки и кнопки radio. Виджет может быть контейнером для хранения других виджетов. Наглядным примером является главное диалоговое окно программы.

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

В строке 11, создается объект QApplication, который генерирует цикл событий в процессе работы приложения. События генерируются и передаются на обработку виджетам. Примерами событий могут являться клики мыши, нажатия клавиш на клавиатуре и т.п. Когда вы вводите текст в окне редактирования виджета QTextEdit, нажатия клавиш обрабатываются средствами виджета, и вводимый текст отображается в процессе набора.

Для запуска программы, откройте командную строку и зайдите в директорию с .cpp файлом программы. Выполните следующие команды shell-интерпретатора, чтобы скомпилировать пример.

После успешного выполнения предыдущих команд, скомпилированная программа будет размещена в директории текущего проекта (в Windows вы можете использовать nmake вместо make . Исполняемые файлы будут размещены в директориях debug или release, которые создадутся командой make . qmake — это утилита, которая создает файлы конфигурации Qt-проекта, если ей передан аргумент -project . После создания файла конфигурации (.pro), qmake генерирует Makefile, который используется утилитой make для сборки приложения. Позже, мы рассмотрим процесс написания собственных .pro файлов.

Добавления кнопки выхода

В реальных проектах, обычно используется более одного виджета. Сегодня мы добавим кнопку QPushButton под полем редактирования текста. При клике на нее, программа будет завершаться.

Рассмотрим исходный код программы.

Сначала подключается заголовочный файл QtGui. В нем содержатся все классы графического интерфейса Qt.

В строке 10 применяется механизм сигналов и слотов, для того, чтобы закрыть программу после нажатия на кнопку выхода. Слот — это функция, которая может быть вызвана в процессе выполнения программы. Сигнал — функция, вызывающая функции-слоты, которые с ним посредством QObject::connect.

quit() — слот класса QApplication, завершающий работу приложения. clicked() — сигнал, который передает нажатая кнопка QPushButton. Статическая функция QObject::connect связывает определенный слот и сигнал. SIGNAL() и SLOT() — макросы, которые принимают сигнатуры сигналов и слотов, для их связи между собой. Также, функции connect() необходимо передать указатели на объекты, которые будут принимать и рассылать сигналы.

В строке 12 создается объект класса QVBoxLayout. Как уже было сказано, виджеты могут содержать в себе другие виджеты. Можно задавать координаты и размер вложенных виджетов непосредственно, но обычно для этого используют слои (layouts). Слой управляет границами вложенных виджетов. Например, объект QVBoxLayout размещает виджеты в одну вертикальную колонку.

В строках 13 и 14, мы добавляем поле редактирования текста и кнопку выхода к слою layout . В строке 17 задается главный слой для всего приложения.

Наследование QWidget

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

Рассмотрим следующий код.

Макрос Q_OBJECT объявляет наш класс как QObject. Он должен находиться в самом начале определения класса. QObject добавляет несколько расширенных возможностей к обычному классу C++. Например, имена классов и слотов можно запросить в процессе выполнения. Также, мы можем узнать типы параметров слота и вызвать его.

В строке 13 объявляется слот quit() . В последствии, мы присоединим этот слот к сигналу.

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

Как видно из определения класса, мы используем указатели на объекты textEdit и quitButton . Для объектов QObject, почти всегда рациональнее выделять память в куче, вместо их копирования.

Мы используем функцию tr() для обработки всех строк, которые видны пользователю. Эта функция применяется, когда приложение нужно перевести на несколько языков. Здесь мы не будем углубляться в детали, но вы можете найти нужную информацию в описании библиотеки Qt Linguist.

Создание файлов .pro

Ранее, мы использовали команду qmake -project для создания файлов .pro. В следующем примере, мы создадим этот файл вручную.

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

Использование QMainWindow

Во многих приложениях удобно использовать QMainWindow — слой, в который можно добавлять контекстные меню, встроенные виджеты, панели инструментов и строку состояния. В QMainWindow есть центральная область, куда можно добавлять любые дочерние виджеты. В этом примере мы разместим там поле для редактирования текста.

Рассмотрим определение класса Notepad .

Мы создали два дополнительных слота — open() и save() . Они будут открывать и сохранять документ. Пример их реализации будет представлен позже.

Очень часто, один и тот же слот используется одновременно несколькими виджетами. Например, в пунктах меню и соответственных кнопках на панели инструментов. Чтобы упростить этот процесс, в Qt существует класс QAction, который можно передавать сразу нескольким виджетам и присоединять к слоту. Например, QMenu и QToolBar могут создавать пункты меню, используя одно действие QAction. Скоро вы убедитесь, как это облегчает процессе разработки.

Сначала, мы используем конструктор класса Notepad для создания графического интерфейса программы.

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

Когда пользователь кликает на пункте меню, рассылается сигнал действия и вызывается соответствующий слот.

Сохранение и открытие

В этом примере, мы реализуем функционал слотов open() и save() , которые были добавлены в предыдущем примере.

Первый шаг — это запрос у пользователя имени файла для открытия. В состав Qt входит класс QFileDialog — диалоговое окно, в котором пользователь может выбрать файл. Статическая функция getOpenFileName() открывает модальное окно для выбора файла и возвращает путь к выбранном файлу. Если пользователь отменил действие, функция возвращает пустую строку.

Чтение данных становится тривиальной задачей, благодаря классу QTextStream — оберткой над объектом QFile. Функция readAll() возвращает содержимое файла, как объект QString. Это содержимое мы поместим в поле для редактирования текста. Затем, мы закрываем файл с помощью функции close(), чтобы вернуть файловый дескриптор операционной системе.

Перейдем к реализации слота save() .

Для сохранения данных мы снова используем класс QTextStream. При помощи него, можно записывать строки QString в файл, используя оператор << .



  1. Подготовка проекта Qt к развёртыванию
  2. Компоновка дистрибутива программы
  3. Подписание кода и создание установщика

1. Подготовка проекта Qt к развёртыванию

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

Программы выглядят особенно качественно и профессионально, если они несут с собой метаданные о разработчике, версии программного продукта, авторских правах, языке и многом другом. Для примера, обратимся к свойствам файла Photoshop.exe всем известной системы Adobe Photoshop. На рисунке ниже показано окно свойств данного файла:


Добавить подобную информацию можно с помощью файла ресурсов. Файл ресурсов имеет расширение .rc и несёт в себе текстовый код, описывающий используемые в приложении ресурсы. Подобные скрипты используются в проектах Visual Studio, основанных на WinAPI, и содержат различные дескрипторы иконок, строк, идентификаторов и прочего. В проектах Qt всё это имеет мало смысла, однако включение общей информации о программе всё же необходимо. Ниже приведены исходный код файла ресурсов и содержимое файла проекта, который также потребуется изменить:

В данном примере важно не забыть добавить файлы resources.rc и icon.ico в папку с исходными файлами проекта. На рисунке ниже показано окно свойств программы после сборки:


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

Следует отметить, что все указанные выше инструкции будут гарантированно работать только при использовании комплекта сборки Visual Studio. Подробную информацию о файлах ресурсов можно найти на портале MSDN в разделе «About Resource Files».

2. Компоновка дистрибутива программы

Создание дистрибутива приложения с учётом всех его файлов, которые должны устанавливаться на компьютерах пользователей, вероятно, является самым сложным этапом развёртывания. Требуется тщательно проанализировать исполняемый файл программы на наличие зависимостей, позаботиться о файлах переводов, не забыть про ресурсы приложения. Решить часть этих проблем поможет утилита windeployqt.exe, которая поставляется вместе с комплектом сборки. Данный инструмент работает в командной строке и поддерживает некоторые параметры конфигурации. На рисунке ниже показано окно командной строки с запущенной утилитой:


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

Параметр Описание
-?, -h, --help Вывод справки
-v, --version Вывод информации о версии
--dir <каталог> Использовать указанный каталог вместо каталога файлов
--libdir <путь> Каталог, в который будут скопированы библиотеки
--debug Использовать отладочные версии файлов
--release Использовать файлы для выпуска
--release-with-debug-info Использовать файлы для выпуска с отладочной информацией
--force Заменить уже существующие файлы
--dry-run Провести работу с целью проверки
--no-plugins Пропустить копирование плагинов
--no-libraries Пропустить копирование библиотек
--qmldir <каталог> Сканировать импорт QML, начиная с указанного каталога
--no-quick-import Пропустить Qt Quick
--no-translations Пропустить копирование файлов перевода
--no-system-d3d-compiler Пропустить копирование компилятора Direct3D
--compiler-runtime Копировать зависимости компилятора
--no-compiler-runtime Пропустить зависимости компилятора
--webkit2 Копировать файлы WebKit2
--no-webkit2 Пропустить WebKit2
--json Печатать вывод в формате JSON
--angle Копировать файлы ANGLE
--no-angle Пропустить ANGLE
--list <режим> Печатать только имена копируемых файлов. Режимы: source, target, relative, mapping
--verbose <уровень> Уровень отладки
-<имя библиотеки> Добавить указанную библиотеку
--no-<имя библиотеки> Не добавлять указанную библиотеку

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


Следует отметить, что перед использованием windeployqt.exe необходимо добавить путь к этому файлу в переменную среды PATH, в противном случае данный инструмент работать не будет.

3. Подписание кода и создание установщика




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

Платные Бесплатные
InstallShield Qt Installer Framework
Setup Factory NSIS
SetupBuilder Inno Setup
Smart Install Maker WiX

Сложно дать какие-либо рекомендации по поводу выбора той или иной системы. Разработчики ПО с открытым исходным кодом, вероятно, выберут бесплатные инструменты, в то же время платные продукты часто используются коммерческими компаниями.



Пишу свою первую программу на Qt, все сложное сделал, застрял на самом якобы легком=)

есть путь к exe файл (программе), есть ключи, надо запустить эту программу с этими ключами.

то программа blablabla.exe запускается без проблем..

пробую сделать это в своей программе:

process.start("c:\\Program Files (x86)\\blablabla\\blablabla.exe",arguments);

если строку process.start(. заменить на process.start("calc"); калькулятор запускается нормально.

выдает: "Process failed to start: No such file or directory"

вот исходный код программы:

process.start("c:\\Program Files (x86)\\blablabla\\blablabla.exe",arguments); Вылетает blablabla.exe? Очень сильно сомневаюсь, что QProcess::start виноват. Попробуй CreateProcess. Исходники blablabla есть?





Наши свою программку и посмотри, какие параметры она принимает при запуске из QProcess::start



попробуй с помощью QProcess::startDetached(), если еще актуально конечно.



попробовал startDetached, тоже самое =(

Если это игра от EA games, то уже вполне возможно, что вылетает оно из-за какой-нибудь cd-защиты, протектора, пакера и тому подобных навесок.



какая разница запускать программу из консоли cmd или сразу из "Выполнить"?

Yama,
нет, это бесплатная онлайн игра

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

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