Октавный график из приложения Qt C++

У меня есть приложение QT C++, которое запускает программу Octave с использованием QProcess. Я могу общаться с ним, читая стандартный вывод/ошибку и записывая его в стандартный ввод, используя метод записи (например: octave->write("5 + 5\n");).

Как я уже сказал, я получаю ответ от октавы (из приведенного выше примера я получаю «ans = 10»).

Однако, когда команда, которую я записываю в стандартный ввод Octave, имеет «график» (например, простой график ([1 2 3 4 5]);), фактическая графика никогда не отображается. Я знаю, что в Octave работает gnuplot, он у меня установлен, и gnuplot_x11 тоже. Я даже изменил бинарный путь gnuplot в своем процессе Octave, выполнив команду gnuplot_binary("/usr/bin/gnuplot"); из МОЕЙ ЗАЯВКИ. Я знаю, что он работает хорошо, потому что если я получаю новое значение, я получаю его правильно. Но я не знаю, почему Octave не показывает графику.

Здесь я начинаю октаву:

QStringList arguments;
arguments << "--persist";
octave->setProcessChannelMode(QProcess::MergedChannels);
octave->start("/usr/bin/octave", arguments);

Здесь я пишу команды для октавного процесса:

if (octave->state() == QProcess::Running) {
    QString command = widget.txtInput->toPlainText();
    if (command.isEmpty()) {
        return;
    }
    command += "\n";
    octave->write(command.toAscii());
}

При этом я печатаю октавный ответ на текстовое редактирование:

widget.txtOutput->append(octave->readAll() + "\n");

И, наконец, я использую это, когда начинается процесс октавы:

QString gnuplot_path(tr("\"/usr/bin/gnuplot\""));
QString gnuplot_cmd(tr("gnuplot_binary(%1)\n").arg(gnuplot_path));
octave->write(gnuplot_cmd.toAscii());

Я буду признателен за любую помощь, которую вы могли бы мне оказать.

Заранее спасибо.


person Holland Salazar    schedule 11.04.2011    source источник


Ответы (2)


Octave, как и Matlab, можно запускать в пакетном режиме для выполнения вычислений без графического интерфейса. Я предполагаю, что Octave определяет, что он не запущен из интерактивного сеанса, и поэтому автоматически переходит в пакетный режим. Вы ожидаете, что Octave будет подавлять графический вывод (например, вывод gnuplot) в пакетном режиме.

Попробуйте перевести Octave в интерактивный режим с помощью параметра командной строки --interactive: http://www.gnu.org/software/octave/doc/interpreter/Command-Line-Options.html

person ypnos    schedule 11.04.2011
comment
Большое спасибо за ваш ответ ... это сработало! И теперь я понимаю октаву немного больше... - person Holland Salazar; 12.04.2011

Я знаю, что вы, вероятно, уже решили свою проблему, но это может быть полезно для других... Вы можете попробовать добавить команду для сохранения графика во временной папке в запросе октавы. Затем отобразите график в своем приложении.

person greg    schedule 09.05.2011
comment
На самом деле хорошая идея, если вы хотите лучше контролировать отображение данных. - person ypnos; 05.10.2011