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