English | Русский | Italiano | Español | Shqip

Si necesitas hacer una llamada a un comando AppleScript desde dentro de Qt, este trozo de código te puede servir como inicio

  1. #include <QApplication>
  2. #include <QProcess>
  3. #include <QDebug>
  4.  
  5. int main(int argc, char **argv)
  6. {
  7.     QApplication a(argc, argv);
  8.  
  9.     QString aScript =
  10.             "tell application \"System Events\"\n"
  11.             "    activate\n"
  12.             "    display dialog \"Hello world\"\n"
  13.             "end tell\n";
  14.  
  15.     QString osascript = "/usr/bin/osascript";
  16.     QStringList processArguments;
  17.     processArguments << "-l" << "AppleScript";
  18.  
  19.     QProcess p;
  20.     p.start(osascript, processArguments);
  21.     p.write(aScript.toUtf8());
  22.     p.closeWriteChannel();
  23.     p.waitForReadyRead(-1);
  24.     QByteArray result = p.readAll();
  25.     QString resultAsString(result); // if appropriate
  26.     qDebug() << "the result of the script is" << resultAsString;
  27.  
  28.     return 0;
  29. }

Este mantiene el script actual en una variable aScript. Luego crea un QProcess para invocar el comando AppleScript usando la herramienta de linea de comandos osascript.

Usamos el argumento -l AppleScript para llamar a osascript, esto es necesario para que no tenga que adivinar que lenguaje de script es usado.

El guión se alimenta entonces a través osascript via stdin.

El programa espera la salida de datos del script para iniciar. Debemos_Leer la salida del script para a continuación utilizar waitForReadyRead.

Si hay bytes disponibles, el programa los lee y los convierte luego a QString (si eso está bien para los datos esperados!).

If there are bytes available, the program reads them and converts them to a QString (if that is ok for the expected data!).

En un programa en el mundo real este debe conectarse a las diferentes signals readyReadXXX() y conectar un slot a el para recolectar los datos.

Si no necesita la salida de el script, solo llama a waitForFinished() justo después de invocar la función closeWriteChannel(). El programa entonces esperara hasta que el script haya terminado, de lo contrario el flujo de control va a ir al final y terminara prematuramente la llamada al comando.

Categories: