- 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 - это директория? , если это относительный путь, то надо так писать
Большое спасибо за данную статью
вы решили мою проблему с кодировкой символов)