0

コマンド ライン バッチとコマンドを実行できる QT GUI アプリケーションを作成する必要があります。たとえば、ping、tcpdump など...

QTableView、いくつかのチェックボックスなどを備えた標準のグラフィカルウィンドウ...コンポーネントインスタンスQPlainTextEditを使用して、次のように想像します。このコンポーネント (QPlainTextEdit) はコマンド ラインとして機能し、コマンドを入力してその出力をキャプチャできます。

そのようなことは可能ですか?これはどのように行うべきですか?

4

2 に答える 2

1

目的に合わせて QProcess を使用できます。

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

詳細はこちら..

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

于 2014-01-01T15:03:40.853 に答える
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);
    }
}

免責事項: これは完全にテストされていないコードであるため、コンパイラと実行時の問題がある可能性がありますが、これで十分に理解できるはずです。

于 2014-01-01T16:06:04.950 に答える