Дмитрий
28 июня 2017 г. 22:10

Создание командной строки на Qt Creator с помощью класса QProcess

Содержание

С помощью класса QProcess можно создать собственную консоль работы с командной строкой. Для этого достаточно следующего: создадим приложение с графическим интерфейсом и разметим на главном окне объекты классов QLineEdit и QTextEdit (lineEdit и textEdit), для написания запроса и отображения результата запроса. Добавим к нашему классу объект типа QProcess. Он необходим для выполнения системных команд. Создадим два слота. Слот command() для выполнения командного запроса. Этот слот мы подключает к сигналу returnPressed() объекта lineEdit. Слот будет вызываться при нажатии клавиши «Enter», когда в фокусе наша строка для ввода текста. При его выполнении происходит считывание текста из lineEdit и его передача в качестве аргумента функции start() объекта класса QProcess. Для работы на ОС Windows необходимо добавить к строке команды префикс "cmd /C ". Слот setStdout() будет принимать поток данных, полученный от объекта класса QProcess и отображать его в textEdit. Здесь необходимо учитывать ещё одну особенность Windows заключается в том, что кодировки в командной строке и самой ОС отличаются. Конвертирование можно провести с помощью метода toUnicode() класса QTextCodec. При этом надо установить кодировку "IBM 866".


widget.h

  1. #ifndef WIDGET_H
  2. #define WIDGET_H
  3. #include <QtCore>
  4. #include <QWidget>
  5. namespace Ui {
  6. class Widget;
  7. }
  8. class Widget : public QWidget
  9. {
  10. Q_OBJECT
  11. public:
  12. explicit Widget(QWidget *parent = 0);
  13. ~Widget();
  14. public slots:
  15. void setStdout();
  16. void command();
  17. private:
  18. Ui::Widget *ui;
  19. QProcess *m_process;
  20. };
  21. #endif // WIDGET_H

widget.cpp

  1. #include "widget.h"
  2. #include "ui_widget.h"
  3. Widget::Widget(QWidget *parent) :
  4. QWidget(parent),
  5. ui(new Ui::Widget)
  6. {
  7. ui->setupUi(this);
  8. m_process = new QProcess(this);
  9. connect(m_process, SIGNAL(readyReadStandardOutput()), this, SLOT(setStdout()) );
  10. connect(ui->lineEdit, SIGNAL(returnPressed()), this, SLOT(command()) );
  11. }
  12. Widget::~Widget()
  13. {
  14. delete ui;
  15. }
  16. void Widget::setStdout()
  17. {
  18. if(QSysInfo::productType()=="windows")
  19. {
  20. QTextCodec *codec = QTextCodec::codecForName("IBM 866");
  21. ui->textEdit->append( codec->toUnicode(m_process->readAllStandardOutput() ) );
  22. }
  23. else
  24. ui->textEdit->append( m_process->readAllStandardOutput() );
  25. }
  26. void Widget::command()
  27. {
  28. QString strCommand;
  29. if(QSysInfo::productType()=="windows")
  30. strCommand = "cmd /C ";
  31. strCommand += ui->lineEdit->text();
  32. m_process->start(strCommand);
  33. }

Работа программы

На рисунке ниже представлен результат выполнения команды dir:

С помощью данной программы можно реализовать управление операционной системой без использования API-функций. Следует помнить, что все команды данной программы выполняются из каталога сборки проекта. Воспользоваться командой "cd" для смены каталога не возможно, т.к. каждая команда выполняется в отдельной сессии и любой переход будет обнулён.

Рекомендуемые статьи по этой тематике

По статье задано0вопрос(ов)

4

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

p
  • 5 августа 2017 г. 23:21

Can you please upload the ui_widget.h so this can compile in total?

Evgenii Legotckoi
  • 6 августа 2017 г. 15:41

ui_widget.h should be created during the first time of build project. ui_****.h files commonly were created from *.ui files. Therefore, just build project in Qt Creator.

Юрий
  • 27 октября 2018 г. 19:47

Добрый вечер. Как решить проблему с двойными кавычками. Например для команды arp -a | find /i "c8-cb-b8-63-41-60" ?  Пробовал разное экранирование, но что то ничего найти не могу.

Evgenii Legotckoi
  • 27 октября 2018 г. 21:03

А разве обычный вариант с экранированием вовсе не работает?

  1. "arp -a | find /i \"c8-cb-b8-63-41-60\""
Юрий
  • 27 октября 2018 г. 22:54

Нет.

Юрий
  • 28 октября 2018 г. 14:46

Возможно проблема в самой команде find? Она почему-то не возвращает ни каких данных

Evgenii Legotckoi
  • 28 октября 2018 г. 15:33

может быть у вас не совсем верно указан путь к директории. Если я правильно понимаю, то /i - это директория? , если это относительный путь, то надо так писать

  1. "arp -a | find ./i \"c8-cb-b8-63-41-60\""
_
  • 29 марта 2019 г. 3:12

Большое спасибо за данную статью

_
  • 29 марта 2019 г. 3:13

вы решили мою проблему с кодировкой символов)

Комментарии

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