Михаиллл
Михаиллл13 марта 2020 г. 10:41

Как в qt запустить скрипт php

Добрый день.
У меня есть пара скриптов на php, их можно запускать из компндной строки и они выводят в командную строку текст
Можно-ли в qt эмитировать командную строку, запускать скрипты и получать текст?

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

Вам это нравится? Поделитесь в социальных сетях!

17
Evgenii Legotckoi
  • 17 марта 2020 г. 5:12
  • (ред.)
  • Ответ был помечен как решение.

Добрый день.
Команды можно выполнять через QProcess, посмотрите эту статью

    Михаиллл
    • 17 марта 2020 г. 8:53
    • (ред.)

    Сделал как у Вас, но не работает.
    Получаю такую ошибку

    QProcess: Destroyed while process ("cmd") is still running.
    

    А если просто команда, то получаю ошибку:

    QProcess: Destroyed while process ("php") is still running.
    

    Скажите пожалуйста, что не так?

    #include "parserapi.h"
    
    ParserApi::ParserApi()
    {
        process = new QProcess(this);
        connect(process, &QProcess::readyReadStandardOutput, this, &ParserApi::replyCheckFines);
    }
    
    void ParserApi::checkFines(QString numberCar, QString ctatePhoto)
    {
        process->start("cd C:\\Users\\New Owner\\Desktop\\таксопарк\\парсеры");
        process->start("cmd /C php gopack.php check_fines У891ХС 750 9915647588 0");
    }
    
    void ParserApi::replyCheckFines()
    {
        qDebug()<<process->readAllStandardOutput();
    }
    
      Evgenii Legotckoi
      • 17 марта 2020 г. 8:55

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

        Михаиллл
        • 17 марта 2020 г. 8:57

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

        void ParserApi::checkFines(QString numberCar, QString ctatePhoto)
        {
            //process->start(folderWithScript);
            process->start("cmd /C php gopack.php check_fines У891ХС 750 9915647588 0");
        }
        
          Evgenii Legotckoi
          • 17 марта 2020 г. 9:09

          Выглядит так, что у вас QProcess объект был разрушен раньше, чем скрипт выполнился, выглядит так, что вы не дожидаетесь выполнения php скрипта, но уже успеваете уничтожить объект ParserApi. Нужно логику переписывать. QProcess имеет сигнал о изменении статуса выполнения, от них и нужно отталкиваться.

            Михаиллл
            • 17 марта 2020 г. 10:02

            Там есть еще сигнал &QProcess::finished , но их 2 (перегруженный), как его привязать?
            Такая запись выдает ошибку no matching member function for call to 'connect'

            connect(process, &QProcess::finished, this, &ParserApi::replyCheckFines);
            
              Evgenii Legotckoi
              • 17 марта 2020 г. 10:04

              Используйте QOverload

                Михаиллл
                • 17 марта 2020 г. 10:16

                Странно, у меня не находится #include "QOverload" и поиск не выдает такого класса у qt

                  Evgenii Legotckoi
                  • 17 марта 2020 г. 10:20

                  Он находится в global заголовочном файле, достаточно написать #include <QObject>

                    Михаиллл
                    • 17 марта 2020 г. 10:32

                    По аналогии с Ваши написал так

                    connect(process, QOverload<int, QProcess>::of(&QProcess::finished), this, QOverload<int, QProcess>::of(&ParserApi::replyCheckFines));
                    
                    

                    но получаю ошибки:
                    ошибка: no matching function for call to 'QOverload ::of( )'
                    connect(process, QOverload ::of(&QProcess::finished), this, QOverload ::of(&ParserApi::replyCheckFines));
                    ошибка: no matching function for call to 'QOverload ::of(void (ParserApi::*)())'
                    connect(process, QOverload ::of(&QProcess::finished), this, QOverload ::of(&ParserApi::replyCheckFines));
                    ^
                    ^

                      Evgenii Legotckoi
                      • 17 марта 2020 г. 10:49
                      • (ред.)

                      Во первых, зачем в шаблонном аргументе QProcess ? В статье такого не было.
                      Во вторых какая сигнатура у метода ParserApi::replyCheckFines ?

                        Михаиллл
                        • 17 марта 2020 г. 10:57

                        Взял пример из документации с лямбдой

                        connect(process, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished),
                                [=](int exitCode, QProcess::ExitStatus exitStatus){ replyCheckFines(); });
                        

                        Теперь программа не вылетает, но все еще выдает туже ошибку, а дебаг возращает "".
                        Что же не так?

                          Михаиллл
                          • 17 марта 2020 г. 11:54

                          В линуксе получаются те-же ошибки

                            Михаиллл
                            • 17 марта 2020 г. 12:06

                            Но вот так работает process->start("notepad");

                              Михаиллл
                              • 17 марта 2020 г. 12:57
                              • (ред.)

                              А сейчас и process->start("notepad"); перестало работать, похоже этот класс создает какой-то поток, который не закрывается с закрытием программы. Не работает даже после перезагрузки. Что-же с этим делать?

                                Михаиллл
                                • 18 марта 2020 г. 4:50

                                Не работало, потому что объект класса уничтожался после закрытия конструктора.
                                Когда сделал так, все заработало

                                ParserApi *qqq = new ParserApi();
                                
                                  Evgenii Legotckoi
                                  • 18 марта 2020 г. 4:51

                                  Ну вот, как и говорил выше ссылка на сообщение

                                    Комментарии

                                    Только авторизованные пользователи могут публиковать комментарии.
                                    Пожалуйста, авторизуйтесь или зарегистрируйтесь
                                    e
                                    • ehot
                                    • 1 апреля 2024 г. 0:29

                                    C++ - Тест 003. Условия и циклы

                                    • Результат:78баллов,
                                    • Очки рейтинга2
                                    B

                                    C++ - Тест 002. Константы

                                    • Результат:16баллов,
                                    • Очки рейтинга-10
                                    B

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

                                    • Результат:46баллов,
                                    • Очки рейтинга-6
                                    Последние комментарии
                                    k
                                    kmssr9 февраля 2024 г. 5:43
                                    Qt Linux - Урок 001. Автозапуск Qt приложения под Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                                    АК
                                    Анатолий Кононенко5 февраля 2024 г. 12:50
                                    Qt WinAPI - Урок 007. Работаем с ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                                    EVA
                                    EVA25 декабря 2023 г. 21:30
                                    Boost - статическая линковка в CMake проекте под Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
                                    J
                                    JonnyJo25 декабря 2023 г. 19:38
                                    Boost - статическая линковка в CMake проекте под Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
                                    G
                                    Gvozdik19 декабря 2023 г. 8:01
                                    Qt/C++ - Урок 056. Подключение библиотеки Boost в Qt для компиляторов MinGW и MSVC Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
                                    Сейчас обсуждают на форуме
                                    a
                                    a_vlasov14 апреля 2024 г. 16:41
                                    Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Евгений, добрый день! Такой вопрос. Верно ли следующее утверждение: Любое Android-приложение, написанное на Java/Kotlin чисто теоретически (пусть и с большими трудностями) можно написать и на C+…
                                    Павел Дорофеев
                                    Павел Дорофеев14 апреля 2024 г. 12:35
                                    QTableWidget с 2 заголовками Вот тут есть кастомный QTableView с многорядностью проект поддерживается, обращайтесь
                                    f
                                    fastrex4 апреля 2024 г. 14:47
                                    Вернуть старое поведение QComboBox, не менять индекс при resetModel Добрый день! У нас много проектов в которых используется QComboBox, в версии 5.5.1, когда модель испускает сигнал resetModel, currentIndex не менялся. В версии 5.15 при resetModel происходит try…
                                    P
                                    Pisych27 февраля 2023 г. 15:04
                                    Как получить в массив значения из связанной модели? Спасибо, разобрался:))
                                    AC
                                    Alexandru Codreanu19 января 2024 г. 22:57
                                    QML Обнулить значения SpinBox Доброго времени суток, не могу разобраться с обнулением значение SpinBox находящего в делегате. import QtQuickimport QtQuick.ControlsWindow { width: 640 height: 480 visible: tr…

                                    Следите за нами в социальных сетях