Как вставить командную строку в приложения с графическим интерфейсом

Мне нужно сделать приложение QT GUI, которое сможет запускать пакеты и команды командной строки. Например, ping, tcpdump и т. Д.

Я хотел бы представить это так:
Стандартное графическое окно с QTableView, некоторыми флажками и т. Д. … с экземпляром компонента QPlainTextEdit. Этот компонент (QPlainTextEdit) будет действовать как командная строка, что позволит вводить команды и фиксировать их вывод.

Это возможно? Как это должно быть сделано?

0

Решение

Вы можете использовать QProcess для ваших целей.

QProcess cmd;
cmd.start("cmd");

Подробнее здесь ..

http://www.qtcentre.org/threads/12757-QProcess-cmd

1

Другие решения

Основная идея заключается в использовании QProcess для запуска команд. Смотрите код ниже для демонстрации.

Синхронный подход

QProcess process;

// If "command" is not in your path,
// use the corresponding relative or absolute path

process.start("command", QStringList()
<< QString("-arg1")
<< QString("arg2")
<< QString("-arg3")
<< QString("arg4"));

// Wait for it to start
if(!process.waitForStarted())
return 0;

bool retval = false;
QByteArray buffer;
while ((retval = process.waitForFinished()));
buffer.append(process.readAll());

if (!retval) {
yourPlainTextEdit.appendPlainText(process.errorString());
} else {
yourPlainTextEdit.appendPlainText(buffer);
}

Асинхронный подход

MyClass::MyClass(QQProcess *process, QObject *parent)
: QObject(parent)
, m_process(process)
{
connect(m_process, SIGNAL(readyRead()), SLOT(handleReadyRead()));
connect(m_process, SIGNAL(error(QProcess::ProcessError)), SLOT(handleError(QProcess::ProcessError)));
connect(&m_timer, SIGNAL(timeout()), SLOT(handleTimeout()));

m_timer.start(5000);
}

MyClass::~MyClass()
{
}

void MyClass::handleReadyRead()
{
m_readData.append(m_process->readAll());

if (!m_timer.isActive())
m_timer.start(5000);
}

void MyClass::handleTimeout()
{
if (m_readData.isEmpty()) {
yourPlainTextEdit.appendPlainText("No data was currently available for reading from gnuplot");
} else {
yourPlainTextEdit.appendPlainText("Process successfully run");
}

}

void GnuPlotReader::handleError(QProcess::ProcessError processError)
{
if (processError == QProcess::ReadError) {
appendPlainTextEdit.appendPlainText("An I/O error occurred while reading the data, error: %1").arg(m_process->errorString()));
yourPlainTextEdit.appendPlainText(m_readData);
}
}

Отказ от ответственности: Это полностью непроверенный код, поэтому он может иметь проблемы с компилятором и временем выполнения, но это должно дать хорошее представление об этом без лишних слов.

1

По вопросам рекламы [email protected]