2013-10-29 51 views
1

我想在我的設備中使用NettS實用程序在Ubuntu 10.04 LTS下使用Qt啓動SCPI命令。我的代碼如下所示:無法在QProcess中執行回顯命令

env = "echo TRIG | nc 192.168.1.100 23 -q1"; 
process1.execute(env); 
process1.waitForFinished(1000); 

此命令不會返回任何數據,只是觸發數據採集。 如果使用與「echo TRIG | nc 192.168.1.100 23 -q1」命令相同的終端,一切工作正常。 從Qt,它不起作用。調試輸出是「TRIG | nc 10.0.3.250 23 -q1」...所以沒有「回聲」。我的設備沒有收到TRIG命令。

你能告訴我我做錯了什麼嗎? 非常感謝。

+2

http://stackoverflow.com/questions/10701504/command-working-in-terminal-but-not-via-qprocess –

+0

的重複爲什麼地球上,你會做,當Qt的本地支持通過TCP/IP套接字發送數據?打開連接併發送簡單的消息很容易。 –

回答

1

你不能像QProcess那樣使用pipe命令(|)。

有幾種方法來解決這個: -

您可以撥打的第一個命令,要麼在Qt的或與其他呼叫QProcess中處理之前檢索它的輸出。

或者,創建一個腳本,您可以從QProcess調用並檢索輸出。

最後,假設您使用的是linux/OSX,您可以使用/ bin/bash調用QProcess並將命令傳遞給它。例如: -

env = "/bin/bash \"echo TRIG | nc 192.168.1.100 23 -q1\""; 
process1.execute(env); 

你也許可以找到一個等效爲/ bin/bash的窗戶,也許CMD.EXE

+1

感謝提示。但是,它返回以下內容: /bin/bash:echo TRIG | nc 192.168.1.100 23 -q1:沒有這樣的文件或目錄 這可能是不同的東西(路徑?) – user2655700

+0

'TRIG'是什麼,它是一個腳本或程序?我不認爲它是一個標準的bash調用。 – TheDarkKnight

+0

TRIG只是一個觸發遠程設備數據採集的SCPI命令。 – user2655700

1

下面的代碼顯示了一個相當完整的,異步實現此功能。它演示瞭如何在不啓動外部進程的情況下完成此任務,以及如何在Qt 5中利用C++ 11 lambda表達式。對於Qt 4,main()中的插槽需要存在於自己的QObject衍生類中。

screenshot

#include <QtWidgets> 
#include <QtNetwork> 

class SocketSignaler : public QObject 
{ 
    Q_OBJECT 
    Q_SLOT void stateChanged(QAbstractSocket::SocketState state) { 
     if (state == QAbstractSocket::UnconnectedState) emit unconnected(); 
     else emit busy(); 
     emit hasState(this->state()); 
    } 
public: 
    explicit SocketSignaler(QAbstractSocket * socket) : QObject(socket) { 
     connect(socket, &QAbstractSocket::stateChanged, this, &SocketSignaler::stateChanged); 
     connect(&(const QObject&)QObject(), &QObject::destroyed, this, // defer signal emission 
       [=]{ emit stateChanged(socket->state()); }, Qt::QueuedConnection); 
    } 
    Q_SIGNAL void busy(); 
    Q_SIGNAL void unconnected(); 
    Q_SIGNAL void hasState(const QString &); 
    QString state() const { 
     switch (static_cast<QAbstractSocket*>(parent())->state()) { 
     case QAbstractSocket::UnconnectedState: return "Disconnected"; 
     case QAbstractSocket::HostLookupState: return "Looking up host"; 
     case QAbstractSocket::ConnectingState: return "Connecting"; 
     case QAbstractSocket::ConnectedState: return "Connected"; 
     case QAbstractSocket::ClosingState: return "Closing"; 
     default: return {}; 
     } 
    } 
}; 

class Ui : public QWidget { 
    Q_OBJECT 
    Q_PROPERTY(bool busy WRITE setBusy) 
    QVBoxLayout m_layout{this}; 
    QFormLayout m_form; 
    QLineEdit m_target{"192.168.1.100"}; 
    QLineEdit m_message{"TRIG"}; 
    QLabel m_state; 
    QDialogButtonBox m_box; 
    QPushButton * const m_send = m_box.addButton("Send", QDialogButtonBox::AcceptRole); 
    QPushButton * const m_cancel = m_box.addButton(QDialogButtonBox::Cancel); 
    QMessageBox m_msgBox{this}; 
public: 
    Ui() { 
     m_form.addRow("Target Host", &m_target); 
     m_form.addRow("Command", &m_message); 
     m_layout.addLayout(&m_form); 
     m_layout.addWidget(&m_state); 
     m_layout.addWidget(&m_box); 
     m_msgBox.setIcon(QMessageBox::Critical); 
     connect(m_send, &QPushButton::clicked, this, &Ui::send); 
     connect(m_cancel, &QPushButton::clicked, this, &Ui::cancel); 
    } 
    void setState(const QString & text) { m_state.setText(text); } 
    QString target() const { return m_target.text(); } 
    QString message() const { return m_message.text(); } 
    void showError(const QString & text) { 
     m_msgBox.setText(text); 
     m_msgBox.show(); 
    } 
    void setBusy(bool busy) { 
     m_send->setEnabled(!busy); 
     m_cancel->setEnabled(busy); 
    } 
    Q_SIGNAL void send(); 
    Q_SIGNAL void cancel(); 
}; 

int main(int argc, char *argv[]) 
{ 
    const int targetPort = 23; 
    QApplication app{argc, argv}; 
    Ui ui; 
    ui.show(); 

    QTcpSocket socket; 
    SocketSignaler socketSig{&socket}; 
    QObject::connect(&socketSig, &SocketSignaler::hasState, &ui, &Ui::setState); 

    QStateMachine machine; 
    QState sReady{&machine}; 
    QState sBusy{&machine}; 
    sReady.assignProperty(&ui, "busy", false); 
    sBusy.assignProperty(&ui, "busy", true); 
    sReady.addTransition(&socketSig, &SocketSignaler::busy, &sBusy); 
    sBusy.addTransition(&socketSig, &SocketSignaler::unconnected, &sReady); 

    QObject::connect(&ui, &Ui::send, [&](){ 
     socket.connectToHost(ui.target(), targetPort); 
    }); 
    QObject::connect(&ui, &Ui::cancel, [&](){ socket.abort(); }); 
    QObject::connect(&socket, 
        static_cast<void (QAbstractSocket::*)(QAbstractSocket::SocketError)> 
        (&QAbstractSocket::error), [&]() 
    { 
     ui.showError(socket.errorString()); 
    }); 
    QObject::connect(&socket, &QAbstractSocket::connected, [&](){ 
     auto msg = ui.message().toLatin1(); 
     msg.append('\n'); 
     if (socket.write(msg) >= msg.size()) socket.close(); 
    }); 
    QObject::connect(&socket, &QAbstractSocket::bytesWritten, [&](){ 
     if (!socket.bytesToWrite()) socket.close(); 
    }); 

    machine.setInitialState(&sReady); 
    machine.start(); 
    return app.exec(); 
} 
#include "main.moc"