2017-01-14 55 views
0

QT Creator 4.2.0에서 간단한 앱을 만들었습니다. 즉, QT 위젯 응용 프로그램은 모든 기본값을 사용했습니다. 버튼 하나가 추가되었습니다. 웹에서 찾은 여러 게시물을 모방하려고했지만 파이썬 스크립트를 올바르게 시작할 수 없습니다. 이 메시지가 계속 나타납니다. "QProcess : 프로세스 ("python.exe ")가 실행 중일 때 폐기 됨." Python.exe가 Path 변수에 추가됩니다.QT Creator 4.2.0에서 생성 된 QT GUI 앱에서 파이썬 스크립트를 시작하고 종료하는 방법

버튼을 누르면 파이썬 스크립트가 실행되고 얼마 동안 기다리지 만 (GUI는 잠그지 않음) 파이썬 스크립트가 종료됩니다.

죄송합니다. 저는 C++/QT에 매우 익숙합니다. 나는 계속 :

#!/usr/bin/env python 

import time 

while True: 
    time.sleep(1) 
    print time.time() 

편집 ...

#include "mainwindow.h" 
#include "ui_mainwindow.h" 
#include <QProcess> 
#include <QDir> 
#include <QCoreApplication> 
#include <QDebug> 

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
} 

MainWindow::~MainWindow() 
{ 
    delete ui; 
} 

void MainWindow::on_pushButton_clicked() 
{ 

    //define file paths.. make sure the paths work 
    QDir dir1("C:/SFI/FastScan/Calibration/"); 
    QFile file1("C:/SFI/FastScan/Calibration/pytest.py"); 
    QString script1 = "C:/SFI/FastScan/Calibration/pytest.py"; 
    QFile file2(script1); 

    qDebug() << dir1.exists() << file1.exists() << file2.exists(); 
    // these all result in true, true true 

    // latest method I tried 
    QString command("python.exe"); 
    QStringList args; 
    args << script1; 
    QProcess *myProcess = new QProcess(this); 
    myProcess->start(command,args); 

} 

파이썬 스크립트는 아래 파이썬 2.7입니다 ...

내 QT 코드는 다음과 같습니다 존을 주셔서 감사합니다 그것으로, 내 QT 코드의 마지막 5 줄을이 두 줄로 바꿈으로써 파이썬 스크립트를 시작할 수 있습니다.

QProcess *myProcess = new QProcess(); 
myProcess->startDetached("python.exe C:/SFI/FastScan/Calibration/pytest.py"); 

myProcess.terminate()를 사용하려했지만 스크립트를 종료 할 수 없습니다. 도움이 될 것입니다! 감사!

답변

1

QProcess에서 start를 호출하면 스크립트가 실행되지만 완료 될 때까지 기다리지 않으므로 질문에있는 on_pushButton_clicked() 함수가 시작된 후에 종료되고 스크립트를 종료 할 방법이 없습니다.

startDetached는 호출 프로세스와 독립적으로 프로세스를 실행하는 정적 함수이므로 myProcess 객체가 시작 프로세스의 핸들을 유지하지 않으므로 종료 프로세스가 없습니다. 응용 프로그램 호출 시작은 더 나은 접근 방법입니다. 이 작업을 수행하는

한 가지 방법은 시작한 후이

myProcess->start(command, args); 

//check that the process actually starts 
if (!myProcess->waitForStarted()) { 
    qDebug("Could not start process"); 
    return; 
} 


QTime time; 
time.start(); 
//wait 4 seconds 
while (time.elapsed() < 4000) { 
    //keep the GUI working 
    QApplication::processEvents(); 
} 

myProcess->kill(); 
// wait for the process to actually stop 
myProcess->waitForFinished(); 

delete myProcess; 

같은 것, 과정을 죽이는 전에 4 초 루프 기다립니다. processEvents 함수는 기다리는 동안 GUI를 활성 상태로 유지합니다.

kill을 호출 한 후 waitForFinished를 호출하여 프로세스가 실제로 끝날 때까지 기다려야합니다. 그렇지 않으면 프로세스가 실제로 종료되기 전에 QProcess 객체가 파괴 될 때 보았던 오류가 발생합니다.

위의 방법의 문제점은 on_pushButton_clicked() 함수에서 GUI가 계속 작동한다는 것입니다. 따라서 GUI에서 "exit"함수를 호출하는 동안 루프에서 응용 프로그램은 여전히 ​​실행중인 스크립트와 함께 종료됩니다. 따라서 GUI에서 진행하고자하는 모든 작업이 진행률 표시 줄이나 다른 디스플레이 위젯을 업데이트하는 것이라면이 접근 방식은 정상입니다. 이 경우 processEvents에 QEventLoop :: ExcludeUserInputEvents를 전달할 수 있습니다.

사용자가 GUI에서 다른 작업을 수행 할 수 있다면 QProcess를 클래스 구성원으로 만들고 별도의 슬롯을 만들어 스크립트를 종료하십시오. 그런 다음 QTimer를 사용하여 지정된 시간 간격 후에이 슬롯을 호출 할 수 있습니다.

+0

응답 해 주셔서 감사합니다. 아쉽게도 제공된 코드를 추가해도 문제가 해결되지 않았습니다. 파이썬 스크립트는 여전히 실행되지 않습니다. 흥미롭게도 필자는 'python.exe'를 'notepad'로 대체했습니다.exe '를 실행하고 메모장에 내 스크립트를 시작하고 4 초 후에 닫습니다. python.exe에 특별한 문제가있는 것 같습니다. – hokiebird

+0

파이썬 스크립트가 시작될 때 무엇을 기대합니까? 파이썬은 콘솔 응용 프로그램이므로 시각적 출력없이 백그라운드에서 실행되기를 기대합니다. python.exe가 실행 중인지 확인하기 위해 작업 관리자를 확인 했습니까? –