Дмитрий28 июня 2017 г. 12: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

#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" для смены каталога не возможно, т.к. каждая команда выполняется в отдельной сессии и любой переход будет обнулён.

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.
p

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" ?  Пробовал разное экранирование, но что то ничего найти не могу.

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

"arp -a | find /i \"c8-cb-b8-63-41-60\""

Нет.

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

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

"arp -a | find ./i \"c8-cb-b8-63-41-60\""
_

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

_

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

Комментарии

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

Позвольте мне порекомендовать вам отличный хостинг, на котором расположен EVILEG.

В течение многих лет Timeweb доказывает свою стабильность.

Для проектов на Django рекомендую VDS хостинг

Посмотреть Хостинг
СК

Qt - Тест 001. Сигналы и слоты

  • Результат:47баллов,
  • Очки рейтинга-6
ВА

C++ - Тест 001. Первая программа и типы данных

  • Результат:13баллов,
  • Очки рейтинга-10
М
  • Макс
  • 18 сентября 2022 г. 7:04

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:70баллов,
  • Очки рейтинга1
Последние комментарии
F

Инженерное решение кубического уравнения с помощью тригонометрической формулы Виета

красивое домашнее порно анал https://sexs-foto.com/ порно молодых русских бесплатно без регистрации порно знакомства онлайн порно блондинка с большой попой …

Qt/C++ - Урок 035. Скачивание файла по HTTP с помощью QNetworkAccessManager

Попробуйте просто вызвать метод getData в конструкторе класса

Qt/C++ - Урок 035. Скачивание файла по HTTP с помощью QNetworkAccessManager

Здравствуйте! Подскажите, пожалуйста, как сделать так, чтобы программа срабатыала без нажатия кнопки? Ну чисто при загрузке формы... Я так понимаю, надо что-то поменять в этой строчке con…
Р5

Qt/C++ - Урок 051. QMediaPlayer - Аудио плеер на Qt

Здравствуйте. Подскажите пожалуйста, как решить проблему multimedia модуль не распознается

Qt/C++ - Урок 009. QTimer или Как работать с таймером в Qt?

Да, именно так. Но в коде без this написано - это ошибка в статье.
Сейчас обсуждают на форуме
АБ

Sorting the added QML elements in the ListModel

I am writing an alarm clock in QML, I am required to sort the alarms in ascending order (depending on the date or time (if there are several alarms on the same day). I've done the sorting …

Вопрос по Qt Creator

Добрый день. Не знаю, подобную проблему я не решал.

Задать другой класс div-у

Добрый день. Попробуйте использовать Selenium. Это библиотека есть в виде Python модуля и она позволяет загружать страницу и манипулировать html элементами. Как я понимаю, в ней можно…
АЧ

Списки на QML

Вопрос решен с применением базы данных. Кому интересно, можете поюзать проект:) Отдельное спасибо Евгению за помощь)))Вход под админом Логин:1, пароль:1Вход под диспетчером Логин:22, пароль:2Вх…

Хочу переместить QMenuBar

Просто взять и заменить в пару строчек не получится. Qt предусматривает крайне ограниченный функционал по работе с обрамлением окон, к которому относится заголовок окна. Вообще это фу…
О нас
Услуги
© EVILEG 2015-2022
Рекомендует хостинг TIMEWEB