m
21 марта 2019 г. 15:23

Ассоциация файла со своей программой QT

Qt

Доброго времени суток. Скажите, а существует механизм в Qt по ассоциации файлов со своей программой? И какие принципиальные моменты необходимо учитывать для запуска файла, если такой механизм всё же реализован в Qt. Заранее спасибо за ответы

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.
7

Для ассоциации расширения файлов с программой на Qt нужно работать с API Операционной системы. Например, для Windows нужно редактировать регистр.

Например, через QSettings в рантайме

QSettings s("HKEY_CURRENT_USER\\SOFTWARE\\CLASSES", QSettings::NativeFormat);
    s.setValue(".myextension/DefaultIcon/.",QDir::toNativeSeparators(qApp->applicationFilePath()));
    s.setValue(".myextension/.","myfirm.myapp.v1");
    s.setValue("myfirm.myapp.v1/shell/open/command/.", QDir::toNativeSeparators(qApp->applicationFilePath()) + " %1")

Или при настройке через Qt Installer Framework

component.addOperation("RegisterFileType",
                       "bob",
                       "@TargetDir@\\BobiSoft.exe \" %1\"",
                       "BobiSoft Files",
                       "application/x-binary",
                       "@TargetDir@/bobi_file_icon.ico",
                       "ProgId=BobiSoft.bob"); 
m

Большое спасибо за ответ, стал ясен принцип работы. Но я наверное плохо задал вопрос. Помимо записи расширения в реестр, интересует как именно реализовать механизм подхвата файла моей программой? При запуске программы с аргументами должен быть выполнен метод открытия моего файла? Как этот процесс должен происходить? Если есть пример/описание процесса буду рад увидеть.

Сам не занимался этим. Могу на работе посмотреть исходники и спросить у коллег в понедельник. Но скорее всего - да.

  • 22 марта 2019 г. 14:14
  • (ред.)

Можно получить параметры командной строки с помощью аргументов функции main():

int main(int argc, char *argv[])
{
    for (int i = 0; i < argc; i++)
    {
        QString  param(argv[i]); //param будет содержать i-й параметр командной строки
        ...
    }
    return 0;
}

В вашем случае 0-й параметр будет содержать имя исполняемого файла вашей программы, а 1-й - имя файла, "подхватываемого" программой

m
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    if (argc==2)
    {
        w.openFile(argv[1]);
    }

    return a.exec();
}

Допустима ли будет такая форма записи, при условии что argv[1] есть полное имя файла и в классе MainWindow существует метод openFile(QString)?

m

Отвечу на свой же вопрос, может кому то это пригодится. Да, можно в функции main использовать такую конструкцию. При запуске программы из Qt передаю свой аргумент в параметрах командной строки.

ЧГ

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

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
Donate

Здравствуйте, уважаемые пользователи EVILEG !!!

Если сайт вам помог, то поддержите разработку сайта финансово, пожалуйста.

Вы можете сделать это следующими способами:

Спасибо, Евгений Легоцкой

СБ
5 декабря 2019 г. 8:01
Сергей Бедерин

C++ - Тест 001. Первая программа и типы данных

  • Результат:60баллов,
  • Очки рейтинга-1
АС
4 декабря 2019 г. 6:39
Артур Салмин

C++ - Тест 005. Структуры и Классы

  • Результат:33баллов,
  • Очки рейтинга-10
СТ
2 декабря 2019 г. 16:05
Сергей Тимченко

Qt - Тест 001. Сигналы и слоты

  • Результат:68баллов,
  • Очки рейтинга-1
Последние комментарии
5 декабря 2019 г. 16:15
Евгений Легоцкой

В этом слоте ваам нужно будет правильно смаппить координату. У QGraphicsView есть методы mapToScene, mapFromScene. Попробуйте использовать их.
ЛП
5 декабря 2019 г. 8:30
Леонид Пивоваров

А без переопределения qgraphicsScene это сделать возможно? Есть же коорината нажатия кнопки мыши slotCustomMenuRequested(QPoint)
5 декабря 2019 г. 8:11
Михаиллл

//qDebug()<<"position:"<<event->pos(); //qDebug()<<"position:"<<event->screenPos(); qDebug()<<"position:"<<event->scenePos();
ЛП
5 декабря 2019 г. 8:09
Леонид Пивоваров

Подскажите пожалуйста, К graphicsView я подключил обработку контекстного меню: сonnect(ui->graphicsView, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(slotCustomMenuRequest…
4 декабря 2019 г. 15:49
Евгений Легоцкой

resources_big - это флаг для сборки c++ приложения. Если Nuitka не предоставляет какой-либо функционал для прикручивания конфигурационных директив типа CONFIG при компиляции, то сомнева…
Сейчас обсуждают на форуме
5 декабря 2019 г. 16:12
Евгений Легоцкой

Это уже кастомная стилизация. Придётся отключать обрамление и самостоятельно реализовывать ресайз окна, его перемещение, стиль и т.д. Вот статья, как отключить обрамление окна - QML …
5 декабря 2019 г. 4:27
qml_puthon_user

Вот код, вдруг, кому поможет. Код основной формы: import QtQuick 2.12import QtQuick.Controls 2.12import QtQuick.Layouts 1.3import "./Components/Panels" as PanelsApplicationWindow{…
5 декабря 2019 г. 2:50
Евгений Легоцкой

Создавайте новые темы, чтобы не было всё в куче.
4 декабря 2019 г. 22:07
qml_puthon_user

Спасибо за помощь! :) Я попытаю надежды в ожидании QtQuick3D от Riverbank'a. :)
V
4 декабря 2019 г. 7:02
Vitali

Со временем распаковки соласен - для слабых ноутов это проблема и именно Nuitka мог бы здесь помочь, если бы заработало. А QtlFW - это уже фреймфорк для создания инсталятора из имеющихся па…
EVILEG
О нас
Услуги
© EVILEG 2015-2019
Рекомендует хостинг TIMEWEB