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

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

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

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

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

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

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

    Михаиллл
    • 17 марта 2020 г. 18: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 г. 18:55

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

        Михаиллл
        • 17 марта 2020 г. 18: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 г. 19:09

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

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

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

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

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

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

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

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

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

                    Михаиллл
                    • 17 марта 2020 г. 20: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 г. 20:49
                      • (ред.)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

                                    Комментарии

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

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

                                    • Результат:84баллов,
                                    • Очки рейтинга4
                                    Ua

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

                                    • Результат:42баллов,
                                    • Очки рейтинга-8
                                    ОК

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

                                    • Результат:47баллов,
                                    • Очки рейтинга-6
                                    Последние комментарии
                                    ИМ
                                    Игорь Максимов22 ноября 2024 г. 21:51
                                    Django - Урок 017. Кастомизированная страница авторизации на Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                                    Evgenii Legotckoi
                                    Evgenii Legotckoi31 октября 2024 г. 23:37
                                    Django - Урок 064. Как написать расширение для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                                    A
                                    ALO1ZE19 октября 2024 г. 17:19
                                    Читалка fb3-файлов на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                                    ИМ
                                    Игорь Максимов5 октября 2024 г. 16:51
                                    Django - Урок 064. Как написать расширение для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                                    d
                                    dblas55 июля 2024 г. 20:02
                                    QML - Урок 016. База данных SQLite и работа с ней в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                                    Сейчас обсуждают на форуме
                                    f
                                    firstlunoxod15 февраля 2025 г. 13:46
                                    Рисование на QGraphicsScene при зажатой кнопке мыши Подскажите, пожалуйста! Как данный класс можно дополнить, чтобы созданные объекты можно было перемещать мышкой по сцене?
                                    Дмитрий
                                    Дмитрий3 февраля 2025 г. 16:24
                                    Создание deb-пакета. Как создать ярлык на рабочем столе после установки собственного deb-пакета? Всем привет. Сделал свой deb-пакет с программой. Всё устанавливается и работает. Ставлю по пути /usr/bin/my_application. Как для пользователя при установке пакета сразу создать ярлык на раб…
                                    NW
                                    Nayo Wai30 января 2025 г. 19:22
                                    не запускается компьютер!!! Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
                                    n
                                    nkly3 января 2025 г. 12:52
                                    Нужно запретить перемещение только некоторых итемов, остальные перемещать можно. Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
                                    M
                                    Marsel17 августа 2023 г. 0:26
                                    OAuth2.0 через VK, получение email Спасибо большое за помощь и простите за то что отнял время своей невнимательностью.

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