Дмитрий
Дмитрий28. Juni 2017 12:10

Erstellen einer Befehlszeile in Qt Creator mit der QProcess-Klasse

Inhalt

Mit der QProcess-Klasse können Sie Ihre eigene Befehlszeilenkonsole erstellen. Dazu reicht Folgendes: Erstellen wir eine Anwendung mit grafischer Oberfläche und markieren Objekte der Klassen QLineEdit und QTextEdit (lineEdit und textEdit) im Hauptfenster, um eine Abfrage zu schreiben und das Ergebnis der Abfrage anzuzeigen. Fügen wir unserer Klasse ein Objekt vom Typ QProcess hinzu. Es wird benötigt, um Systembefehle auszuführen. Lassen Sie uns zwei Slots erstellen. Der command()-Slot zum Ausführen einer Befehlsanforderung. Wir verbinden diesen Slot mit dem Signal returnPressed() des lineEdit-Objekts. Der Slot wird beim Drücken der "Enter"-Taste aufgerufen, wenn unsere Zeile zur Texteingabe im Fokus ist. Bei der Ausführung wird der Text aus lineEdit gelesen und als Argument an die start()-Funktion eines QProcess-Klassenobjekts übergeben. Um unter Windows zu arbeiten, müssen Sie der Befehlszeile das Präfix " cmd / C " hinzufügen. Der Slot setStdout() nimmt den vom QProcess-Objekt empfangenen Datenstrom und zeigt ihn in textEdit an. Hier muss ein weiteres Merkmal von Windows berücksichtigt werden, nämlich dass die Codierungen in der Befehlszeile und im Betriebssystem selbst unterschiedlich sind. Die Konvertierung kann mit der Methode toUnicode() der Klasse QTextCodec erfolgen. In diesem Fall müssen Sie die Kodierung "IBM 866" einstellen.


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);
}

Programmbetrieb

Die folgende Abbildung zeigt die Ausgabe des dir-Befehls:

Mit diesem Programm können Sie die Betriebssystemverwaltung implementieren, ohne API-Funktionen zu verwenden. Es sollte daran erinnert werden, dass alle Befehle dieses Programms aus dem Assembly-Verzeichnis des Projekts ausgeführt werden. Es ist nicht möglich, das Verzeichnis mit dem Befehl "cd" zu wechseln, weil Jeder Befehl wird in einer separaten Sitzung ausgeführt und jeder Übergang wird annulliert.

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

p
  • 5. August 2017 13:21

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

Evgenii Legotckoi
  • 6. August 2017 05: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. Oktober 2018 09:47

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

Evgenii Legotckoi
  • 27. Oktober 2018 11:03

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

"arp -a | find /i \"c8-cb-b8-63-41-60\""
Юрий
  • 27. Oktober 2018 12:54

Нет.

Юрий
  • 28. Oktober 2018 04:46

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

Evgenii Legotckoi
  • 28. Oktober 2018 05:33

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

"arp -a | find ./i \"c8-cb-b8-63-41-60\""
_
  • 28. März 2019 17:12

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

_
  • 28. März 2019 17:13

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

Kommentare

Nur autorisierte Benutzer können Kommentare posten.
Bitte Anmelden oder Registrieren
Letzte Kommentare
A
ALO1ZE19. Oktober 2024 08:19
Fb3-Dateileser auf Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь Максимов5. Oktober 2024 07:51
Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas55. Juli 2024 11:02
QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssr8. Februar 2024 18:43
Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
Jetzt im Forum diskutieren
J
JacobFib17. Oktober 2024 03:27
добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
JW
Jhon Wick1. Oktober 2024 15:52
Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
КГ
Кирилл Гусарев27. September 2024 09:09
Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
F
Fynjy22. Juli 2024 04:15
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

Folgen Sie uns in sozialen Netzwerken