Ответы пользователя по тегу Qt
  • Как запустить system с нюансами?

    gbg
    @gbg Куратор тега C++
    Любые ответы на любые вопросы
    QProcess все сделает, вот небольшой пример:

    PingerWindow.h:
    #ifndef PINGERWINDOW_H
    #define PINGERWINDOW_H
    
    #include <QMainWindow>
    #include <QProcess>
    
    namespace Ui {
    class PingerWindow;
    }
    
    class PingerWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        explicit PingerWindow(QWidget *parent = 0);
        QProcess ping;
        ~PingerWindow();
    
    private:
        Ui::PingerWindow *ui;
    
    public slots:
        void readyRead();
        void changeHost();
        void stop();
        void enaStop();
        void disaStop(int code);
    };
    
    #endif // PINGERWINDOW_H


    PingerWindow.cpp:
    #include "pingerwindow.h"
    #include "ui_pingerwindow.h"
    
    PingerWindow::PingerWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::PingerWindow)
    {
        ui->setupUi(this);
        //Запуск процесса в фоне
        ping.start("ping 127.0.0.1");
        //Привязываем сигналы от кнопок
    
        connect(ui->pingButton,SIGNAL(clicked()),this,SLOT(changeHost()));
        connect(ui->stopButton,SIGNAL(clicked()),this,SLOT(stop()));
        //Привязываем сигналы от процесса
        connect(&ping,SIGNAL(readyRead()),this,SLOT(readyRead()));   //процесс что-то написал в свой stdout
        connect(&ping,SIGNAL(started()),this,SLOT(enaStop()));       //процесс запустился
        connect(&ping,SIGNAL(finished(int)),this,SLOT(disaStop(int))); //процесс звершил работу
    
    }
    
    PingerWindow::~PingerWindow()
    {
        stop();
        delete ui;
    }
    
    void PingerWindow::readyRead()
    {
        //обработка сигнала о приходе новых данных - вывод их в окно
        ui->pingerOut->appendPlainText(ping.readAll().data());
    }
    
    void PingerWindow::changeHost()
    {
        //обработка сигнала о необходимости сменить хост
        stop(); //стоп процесса
        ping.start(QString("ping \"%1\"").arg(ui->hostname->text())); //запуск нового процесса
    }
    
    void PingerWindow::stop()
    {
        //остановка процесса
        if(ping.isOpen())         //если процесс открыт
        {
            ping.terminate();     //прекращаем его
            ping.waitForFinished();   //ждем прекращения
        }
    }
    
    void PingerWindow::enaStop()
    {
        //делаем кнопку остановки доступной, если процесс запустился
        ui->stopButton->setEnabled(true);
    }
    
    void PingerWindow::disaStop(int code)
    {
        //после остановки процесса, выводим код возврата в окно
        ui->pingerOut->appendHtml(QString("<i>Return code is %1</i>").arg(code));
        //делаем кнопку остановки недоступной
        ui->stopButton->setDisabled(true);
    }


    Он же на гитхабе
    Пример запускает программу ping и позволяет управлять ей.
    Ответ написан
  • Как сделать передачу команды из кода C++ в консоль?

    gbg
    @gbg Куратор тега C++
    Любые ответы на любые вопросы
    system("имя_исполняемого_файла опция1 опция2 входной_файл выходной_файл");


    #include <sstream>
    ...
    {
       std::stringstream st;
       int i=9000;
       std::string str_param="value";
       st<<"command "<<i<<" " << str_param;
       system(st.str().c_str());
    }
    Ответ написан