Форум программистов, компьютерный форум, киберфорум
Наши страницы
Profi_GMan
Войти
Регистрация
Восстановить пароль
Рейтинг: 1.00. Голосов: 1.

C++ Qt Класс для выполнения консольных команд cmd/linux shell(замена system())

Запись от Profi_GMan размещена 26.12.2017 в 23:16
Метки c++, cmd, linux shell, qt

Предисловие
Так как чтообы выполнить команду с помощью QProces нужно несколько строчек, я написал класс-функцию для выполнения консольных команд cmd/linux shell с помощью QProcess.

Возможности
  1. Работает и на линукс, и на винде, ибо работает через QProcess
  2. Выводит результаты и ход работы через qDebug()
  3. Возвращяет QPair<int, QString> с возвращаемым значением и выводом команды
  4. Имеет единственную статическую функцию, т.е., для выполнения команд не нужно создавать объект
  5. Наверное, так себе возможность, но всё же: Поскольку класс имеет всего одну статическую функцию, то можно её превратить в обычную функцию, не меняя тела функции

GitHub
Размещено в Без категории
Просмотров 671 Комментарии 14
Всего комментариев 14
Комментарии
  1. Старый комментарий
    Аватар для Avazart
    Как же нет? QProcess должен справляется с этой функцией.

    Да и на яндекс лучше не выкладывать, лучше сразу на github
    Запись от Avazart размещена 26.12.2017 в 23:36 Avazart на форуме
    Обновил(-а) Avazart 26.12.2017 в 23:38
  2. Старый комментарий
    Аватар для Profi_GMan
    Цитата:
    Сообщение от Avazart Просмотреть комментарий
    Как же нет? QProcess должен справляется с этой функцией.

    Да и на яндекс лучше не выкладывать, лучше сразу на github
    Про qproccess слышал, но он же в винде будет запускать с окном командной строки
    А про гитхаб, спс, что-то даже в голову не пришло. Завтра выложу
    Запись от Profi_GMan размещена 26.12.2017 в 23:44 Profi_GMan вне форума
  3. Старый комментарий
    Аватар для Avazart
    Что значит слышал? Это стандартный класс библиотеки Qt.

    Для винды это нормальное поведение.
    Кроме того как я помню, если перенаправлять вывод консоли не будет.
    Запись от Avazart размещена 27.12.2017 в 14:57 Avazart на форуме
  4. Старый комментарий
    Аватар для Profi_GMan
    Цитата:
    Сообщение от Avazart Просмотреть комментарий
    Для винды это нормальное поведение.
    Кроме того как я помню, если перенаправлять вывод консоли не будет.
    Да, нормально, только если запустить скрипт и пользователь окно закроет, то выполнение скрипта будет остановлено, что очень плохо.
    Будет, уже пробовал
    Запись от Profi_GMan размещена 27.12.2017 в 22:00 Profi_GMan вне форума
  5. Старый комментарий
    Аватар для Avazart
    Цитата:
    Будет, уже пробовал
    Значит фигово пробовали ...

    Вот вам пример "пинг гула":

    mainwindow.h
    C++ (Qt)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    
    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
     
    #include <QMainWindow>
    #include <QProcess>
    #include <QTextStream>
     
    namespace Ui {
    class MainWindow;
    }
     
    class MainWindow : public QMainWindow
    {
      Q_OBJECT
     
    public:
      explicit MainWindow(QWidget *parent = 0);
      ~MainWindow();
     
    private slots:
      void on_pushButton_clicked();
     
      void processReadyReadStandardError();
      void processReadyReadStandardOutput();
      void processFinished(int exitCode, QProcess::ExitStatus exitStatus);
     
     
     
    private:
      Ui::MainWindow *ui;
      QProcess* process_;
    };
     
    #endif // MAINWINDOW_H



    mainwindow.cpp
    C++ (Qt)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    
    #include "mainwindow.h"
    #include "ui_mainwindow.h"
     
    MainWindow::MainWindow(QWidget *parent) :
      QMainWindow(parent),
      ui(new Ui::MainWindow),
      process_(nullptr)
    {
      ui->setupUi(this);
    }
     
    MainWindow::~MainWindow()
    {
      delete ui;
    }
     
    void MainWindow::on_pushButton_clicked()
    {
        if(process_)
          return;
     
        process_= new  QProcess();
     
        process_->start("ping google.com");
     
        connect(process_,&QProcess::readyReadStandardOutput,
                this,&MainWindow::processReadyReadStandardOutput);
     
        connect(process_,&QProcess::readyReadStandardError,
                this,&MainWindow::processReadyReadStandardError);
     
        connect(process_,SIGNAL(finished(int,QProcess::ExitStatus)),
                this,SLOT(processFinished(int,QProcess::ExitStatus)));
    }
     
    void MainWindow::processReadyReadStandardOutput()
    {
      QByteArray ba = process_->readAll();
      QTextStream ts(&ba);
      ts.setCodec("IBM-866");
      ui->textEdit->moveCursor(QTextCursor::End);
      ui->textEdit->insertHtml(QString("<span style='color: blue;'>%1</span>")
                               .arg( ts.readAll().replace(QRegExp("\r?\n"),"<br>") )
                               );
     
    }
     
     
     
    void MainWindow::processReadyReadStandardError()
    {
      QByteArray ba = process_->readAll();
      QTextStream ts(&ba);
      ts.setCodec("IBM-866");
      ui->textEdit->moveCursor(QTextCursor::End);
      ui->textEdit->insertHtml(QString("<span style='color: red;'>%1</span>")
                               .arg( ts.readAll().replace(QRegExp("\r?\n"),"<br>") )
                               );
    }
     
    void MainWindow::processFinished(int exitCode, QProcess::ExitStatus exitStatus)
    {
      Q_UNUSED(exitCode)
      Q_UNUSED(exitStatus)
     
      process_->deleteLater();
      process_= nullptr;
    }



    Кроме того есть такая штука http://doc.qt.io/qt-5/qprocess.html#...difier-typedef
    с помощью которой скорее всего можно попробовать выставить виндовые флаги
    например CREATE_NO_WINDOW
    https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx
    Запись от Avazart размещена 28.12.2017 в 14:41 Avazart на форуме
    Обновил(-а) Avazart 28.12.2017 в 14:50
  6. Старый комментарий
    Аватар для Profi_GMan
    Цитата:
    Сообщение от Avazart Просмотреть комментарий
    Значит фигово пробовали ...

    Вот вам пример "пинг гула":

    mainwindow.h
    C++ (Qt)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    
    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
     
    #include <QMainWindow>
    #include <QProcess>
    #include <QTextStream>
     
    namespace Ui {
    class MainWindow;
    }
     
    class MainWindow : public QMainWindow
    {
      Q_OBJECT
     
    public:
      explicit MainWindow(QWidget *parent = 0);
      ~MainWindow();
     
    private slots:
      void on_pushButton_clicked();
     
      void processReadyReadStandardError();
      void processReadyReadStandardOutput();
      void processFinished(int exitCode, QProcess::ExitStatus exitStatus);
     
     
     
    private:
      Ui::MainWindow *ui;
      QProcess* process_;
    };
     
    #endif // MAINWINDOW_H



    mainwindow.cpp
    C++ (Qt)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    
    #include "mainwindow.h"
    #include "ui_mainwindow.h"
     
    MainWindow::MainWindow(QWidget *parent) :
      QMainWindow(parent),
      ui(new Ui::MainWindow),
      process_(nullptr)
    {
      ui->setupUi(this);
    }
     
    MainWindow::~MainWindow()
    {
      delete ui;
    }
     
    void MainWindow::on_pushButton_clicked()
    {
        if(process_)
          return;
     
        process_= new  QProcess();
     
        process_->start("ping google.com");
     
        connect(process_,&QProcess::readyReadStandardOutput,
                this,&MainWindow::processReadyReadStandardOutput);
     
        connect(process_,&QProcess::readyReadStandardError,
                this,&MainWindow::processReadyReadStandardError);
     
        connect(process_,SIGNAL(finished(int,QProcess::ExitStatus)),
                this,SLOT(processFinished(int,QProcess::ExitStatus)));
    }
     
    void MainWindow::processReadyReadStandardOutput()
    {
      QByteArray ba = process_->readAll();
      QTextStream ts(&ba);
      ts.setCodec("IBM-866");
      ui->textEdit->moveCursor(QTextCursor::End);
      ui->textEdit->insertHtml(QString("<span style='color: blue;'>%1</span>")
                               .arg( ts.readAll().replace(QRegExp("\r?\n"),"<br>") )
                               );
     
    }
     
     
     
    void MainWindow::processReadyReadStandardError()
    {
      QByteArray ba = process_->readAll();
      QTextStream ts(&ba);
      ts.setCodec("IBM-866");
      ui->textEdit->moveCursor(QTextCursor::End);
      ui->textEdit->insertHtml(QString("<span style='color: red;'>%1</span>")
                               .arg( ts.readAll().replace(QRegExp("\r?\n"),"<br>") )
                               );
    }
     
    void MainWindow::processFinished(int exitCode, QProcess::ExitStatus exitStatus)
    {
      Q_UNUSED(exitCode)
      Q_UNUSED(exitStatus)
     
      process_->deleteLater();
      process_= nullptr;
    }
    откройте консоль и попробуйте там перенаправить вывод(например написав батник). Или вы меня не поняли. Нужно окно не открывалось, а не что бы текст выводился.
    зы Вообще-то qproccess основан на том win api, что и у меня в классе. Поэтому да, можно не открывать консоль, выставив параметр NO_WINDOW. Какая разница? Тем более, что одной функцией явно удобней пользоваться, чем писать несколько строчек кода
    Запись от Profi_GMan размещена 28.12.2017 в 14:50 Profi_GMan вне форума
  7. Старый комментарий
    Аватар для Avazart
    Цитата:
    Нужно окно не открывалось, а не что бы текст выводился.
    Читайте внимательнее что я писал ранее.
    Вы пробовали мой пример? Разве консоль там открывается?

    Цитата:
    если перенаправлять вывод консоли не будет.
    Цитата:
    Тем более, что одной функцией явно удобней пользоваться, чем писать несколько строчек кода
    Нет не удобнее, ибо эта функция не на все случаи жизни и не кроссплатформенная.
    Запись от Avazart размещена 28.12.2017 в 15:19 Avazart на форуме
    Обновил(-а) Avazart 28.12.2017 в 15:40
  8. Старый комментарий
    Аватар для Avazart
    Цитата:
    откройте консоль и попробуйте там перенаправить вывод(например написав батник).
    test.bat
    Bash
    1
    2
    3
    
    @echo off
    echo "hello!"
    ping google.com
    C++ (Qt)
    1
    2
    3
    4
    5
    
    // ...
        process_= new  QProcess();
        process_->setWorkingDirectory(".");
        process_->start("cmd",QStringList()<<"/c"<<"test.bat");
    // ...
    Все отлично перенаправляется и работает.
    Запись от Avazart размещена 28.12.2017 в 15:37 Avazart на форуме
    Обновил(-а) Avazart 28.12.2017 в 15:44
  9. Старый комментарий
    Аватар для Profi_GMan
    Цитата:
    Сообщение от Avazart Просмотреть комментарий
    Читайте внимательнее что я писал ранее.
    Вы пробовали мой пример? Разве консоль там открывается?




    Нет не удобнее, ибо эта функция не на все случаи жизни и не кроссплатформенная.
    Во первых она кроссплатформенная, я её использую и на винде, и на линукс. Во-вторых, да, я согласен, не на все случаи жизни, но на подавляющее большинство подходит
    И когда вы перенаправляет вывод, он перенаправляется, но ведь "чёрное окошко" всё равно же появляется
    Запись от Profi_GMan размещена 28.12.2017 в 19:13 Profi_GMan вне форума
  10. Старый комментарий
    Аватар для Avazart
    Цитата:
    И когда вы перенаправляет вывод, он перенаправляется, но ведь "чёрное окошко" всё равно же появляется
    Нет - не появляется.

    Цитата:
    Во первых она кроссплатформенная, я её использую и на винде, и на линукс.
    Не знаю не видил кода, с яндекса недостать.
    Запись от Avazart размещена 28.12.2017 в 21:51 Avazart на форуме
    Обновил(-а) Avazart 28.12.2017 в 21:52
  11. Старый комментарий
    Аватар для Avazart
    Видео: консоль не появляется.
    Запись от Avazart размещена 28.12.2017 в 22:04 Avazart на форуме
  12. Старый комментарий
    Аватар для Profi_GMan
    Цитата:
    Сообщение от Avazart Просмотреть комментарий
    Видео: консоль не появляется.
    У меня тоже не появляется. Окей, перепишу класс под использование qprocces. Ибо для большинства случаев, нужно только выполнить команду и тут же получить результат, а для этой цели в qprocces понадобиться строчки 4-5, а с моей функцией получится 1
    Запись от Profi_GMan размещена 30.12.2017 в 20:26 Profi_GMan вне форума
  13. Старый комментарий
    Аватар для Avazart
    5 строчек сводить к 1 (с помощью класса) это смешно.

    Насчет своего велосипеда, я тоже свой писал http://www.cyberforum.ru/blogs/131347/blog4416.html
    Но для проектов для MSVC и C++Builder.
    Запись от Avazart размещена 31.12.2017 в 02:10 Avazart на форуме
    Обновил(-а) Avazart 31.12.2017 в 02:14
  14. Старый комментарий
    Аватар для Profi_GMan
    Цитата:
    Сообщение от Avazart Просмотреть комментарий
    5 строчек сводить к 1 (с помощью класса) это смешно.

    Насчет своего велосипеда, я тоже свой писал http://www.cyberforum.ru/blogs/131347/blog4416.html
    Но для проектов для MSVC и C++Builder.
    Не спорю, что это велосипед. Но мне удобней пользоваться этой функцией.
    Запись от Profi_GMan размещена 31.12.2017 в 22:34 Profi_GMan вне форума
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru