- 1. widget.h
- 2. widget.cpp
С помощью класса 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
- #ifndef WIDGET_H
- #define WIDGET_H
- #include <QtCore>
- #include <QWidget>
- namespace Ui {
- class Widget;
- }
- class Widget : public QWidget
- {
- Q_OBJECT
- public:
- explicit Widget(QWidget *parent = 0);
- ~Widget();
- public slots:
- void setStdout();
- void command();
- private:
- Ui::Widget *ui;
- QProcess *m_process;
- };
- #endif // WIDGET_H
widget.cpp
- #include "widget.h"
- #include "ui_widget.h"
- Widget::Widget(QWidget *parent) :
- QWidget(parent),
- ui(new Ui::Widget)
- {
- ui->setupUi(this);
- m_process = new QProcess(this);
- connect(m_process, SIGNAL(readyReadStandardOutput()), this, SLOT(setStdout()) );
- connect(ui->lineEdit, SIGNAL(returnPressed()), this, SLOT(command()) );
- }
- Widget::~Widget()
- {
- delete ui;
- }
- void Widget::setStdout()
- {
- if(QSysInfo::productType()=="windows")
- {
- QTextCodec *codec = QTextCodec::codecForName("IBM 866");
- ui->textEdit->append( codec->toUnicode(m_process->readAllStandardOutput() ) );
- }
- else
- ui->textEdit->append( m_process->readAllStandardOutput() );
- }
- void Widget::command()
- {
- QString strCommand;
- if(QSysInfo::productType()=="windows")
- strCommand = "cmd /C ";
- strCommand += ui->lineEdit->text();
- m_process->start(strCommand);
- }
Работа программы
На рисунке ниже представлен результат выполнения команды dir:
С помощью данной программы можно реализовать управление операционной системой без использования API-функций. Следует помнить, что все команды данной программы выполняются из каталога сборки проекта. Воспользоваться командой "cd" для смены каталога не возможно, т.к. каждая команда выполняется в отдельной сессии и любой переход будет обнулён.
Can you please upload the ui_widget.h so this can compile in total?
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.
Добрый вечер. Как решить проблему с двойными кавычками. Например для команды arp -a | find /i "c8-cb-b8-63-41-60" ? Пробовал разное экранирование, но что то ничего найти не могу.
А разве обычный вариант с экранированием вовсе не работает?
Нет.
Возможно проблема в самой команде find? Она почему-то не возвращает ни каких данных
может быть у вас не совсем верно указан путь к директории. Если я правильно понимаю, то /i - это директория? , если это относительный путь, то надо так писать
Большое спасибо за данную статью
вы решили мою проблему с кодировкой символов)