LINUX.ORG.RU

pyscript из под Qt-GUI

 ,


0

1

Есть GUI-программка на Qt (C++). Нужно из под нее стартануть python-скрипт, достаточно большой и трудоемкий (расчеты, к-е трудно переписывать, используется scypy). Так как опята нет, интересует как организовать:

1. процесс? если процесс, то что лучше использовать fork() и exec*() или QProgress.

2. поток? и такой-же выбор.

При этом хотелось бы, чтобы был какой-то индикатор степени выполнения. Поэтому порекомендуйте как его сделать - python скрипт печатать проценты в stdout или err от 1 до 100, или в файл их писать ... как в GUI их читать совсем не знаю ).

P.S. если можно и книжку сразу порекомендуйте

через QProcess делай и вывод скрипта может анализировать на предмет прогресса.

MikeDM ★★★★★
()

P.S. если можно и книжку сразу порекомендуйте

У Qt хорошая документация. Почитай там про QProcess, этого должно хватить.

solovey ★★
()
Ответ на: комментарий от MikeDM

Помогите решить проблему. Пока скрипт не отработает ничего не читается. Например, в упроценном коде ниже первая строчка, отданная py-скриптом, будет распечатана только когда отработает весь скрипт целиком.

$ cat main.cc 
#include <QtGui>


class MyProc: public QProcess {
Q_OBJECT
public slots:
void script_start()
{
    qDebug() << "test.py start ...";
    start("./test.py");
}
void listen_script(){
    //qDebug() <<  readAllStandardOutput() ;
    qDebug() <<  readLine() ;
}
};

int main(int argc, char *argv[]){
    QApplication app(argc,argv);
    QPushButton but("start xcalc");
    MyProc proc;
    but.setGeometry(200,200,400,200);
    but.show();
    QObject::connect(&but,SIGNAL(clicked()),&proc,SLOT(script_start()));
    QObject::connect(&proc,SIGNAL(readyReadStandardOutput()),&proc,SLOT(listen_script()));
    return app.exec();
}
#include "main.moc"


$ cat test.py 
#!/usr/bin/python
from time import sleep
for i in range(10):
    print i
    sleep(5)

eiler13
() автор топика
Ответ на: комментарий от eiler13
#!/usr/bin/python

import sys
from time import sleep
for i in range(10):
    print i
    sys.stdout.flush()
    sleep(1)
anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.