C++ Qt Класс для выполнения консольных команд cmd/linux shell(замена system())
Запись от Profi_GMan размещена 26.12.2017 в 23:16
Метки c++, cmd, linux shell, qt
Предисловие Так как чтообы выполнить команду с помощью QProces нужно несколько строчек, я написал класс-функцию для выполнения консольных команд cmd/linux shell с помощью QProcess. Возможности
GitHub |
Всего комментариев 14
Комментарии
-
Запись от Avazart размещена 26.12.2017 в 23:36
Обновил(-а) Avazart 26.12.2017 в 23:38 -
Запись от Profi_GMan размещена 26.12.2017 в 23:44 -
Запись от Avazart размещена 27.12.2017 в 14:57 -
Запись от Profi_GMan размещена 27.12.2017 в 22:00 -
Цитата:Будет, уже пробовал
Вот вам пример "пинг гула":
mainwindow.hC++ (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.cppC++ (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... er-typedef
с помощью которой скорее всего можно попробовать выставить виндовые флаги
например CREATE_NO_WINDOW
https://msdn.microsoft.com/en-... s.85).aspxЗапись от Avazart размещена 28.12.2017 в 14:41
Обновил(-а) Avazart 28.12.2017 в 14:50 -
Цитата:Значит фигово пробовали ...
Вот вам пример "пинг гула":
mainwindow.hC++ (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.cppC++ (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 -
Цитата:Нужно окно не открывалось, а не что бы текст выводился.
Вы пробовали мой пример? Разве консоль там открывается?
Цитата:если перенаправлять вывод консоли не будет.Цитата:Тем более, что одной функцией явно удобней пользоваться, чем писать несколько строчек кодаЗапись от Avazart размещена 28.12.2017 в 15:19
Обновил(-а) Avazart 28.12.2017 в 15:40 -
Цитата:откройте консоль и попробуйте там перенаправить вывод(например написав батник).
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 28.12.2017 в 15:44 -
Цитата:
И когда вы перенаправляет вывод, он перенаправляется, но ведь "чёрное окошко" всё равно же появляетсяЗапись от Profi_GMan размещена 28.12.2017 в 19:13 -
Запись от Avazart размещена 28.12.2017 в 21:51
Обновил(-а) Avazart 28.12.2017 в 21:52 -
Запись от Avazart размещена 28.12.2017 в 22:04 -
У меня тоже не появляется. Окей, перепишу класс под использование qprocces. Ибо для большинства случаев, нужно только выполнить команду и тут же получить результат, а для этой цели в qprocces понадобиться строчки 4-5, а с моей функцией получится 1
Запись от Profi_GMan размещена 30.12.2017 в 20:26 -
5 строчек сводить к 1 (с помощью класса) это смешно.
Насчет своего велосипеда, я тоже свой писал https://www.cyberforum.ru/blog... g4416.html
Но для проектов для MSVC и C++Builder.Запись от Avazart размещена 31.12.2017 в 02:10
Обновил(-а) Avazart 31.12.2017 в 02:14 -
Цитата:5 строчек сводить к 1 (с помощью класса) это смешно.
Насчет своего велосипеда, я тоже свой писал https://www.cyberforum.ru/blog... g4416.html
Но для проектов для MSVC и C++Builder.Запись от Profi_GMan размещена 31.12.2017 в 22:34