2011-06-04 177 views
0

当我试图发射readAllStandardOutput()到一个QString即时获取意外的程序崩溃,即使我将QByteStream转换为QString,任何想法,为什么?继承人德源Qt readAllStandardOutput()导致意外的程序结束

mainwindow.h

#ifndef MAINWINDOW_H 
#define MAINWINDOW_H 

#include <QMainWindow> 
#include <QProcess> 
#include <QString> 


#include "exeprocess.h" 

/*main window ---------------------------------------*/ 

namespace Ui { 
    class MainWindow; 
} 

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    explicit MainWindow(QWidget *parent = 0); 
    ~MainWindow(); 
    QProcess *proc; 

signals: 
    void outLog(QString outLogVar); //plug this into the QTextEdit box 

public slots: 
    void logReady(); // plug the QProcess into this 


private: 
    Ui::MainWindow *ui; 
}; 




#endif // MAINWINDOW_H 

mainwindow.cpp

#include <QByteArray> 

#include "mainwindow.h" 
#include "ui_mainwindow.h" 

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
    QProcess *proc = new QProcess; //initialize proc 
    QStringList arguments; 
    arguments << "-h"; 

    connect(proc, SIGNAL(readyReadStandardOutput()), this, SLOT(logReady())); 

    proc->start("/Applications/Graphics/3Delight-9.0.87/bin/renderdl", arguments); 

} 

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

void MainWindow::logReady(){ 
    QString str = proc->readAllStandardOutput(); 
    emit outLog(str); 
} 

谢谢!

回答

5

这条线的问题是:

QProcess *proc = new QProcess; //initialize proc 

你通过重复使用该名称的阴影成员变量。当调用logReady时,你调用readAllStandardOutput()的'proc'是一个不同的(空)指针,所以一切都崩溃了。修复很简单:用上述行代替

proc = new QProcess; 
+0

这是一个梦想,但我不知道为什么,你是什么意思的影子?谢谢PAG,j – 2011-06-05 00:09:14

+0

@jonathan当你声明本地的'proc'变量时,它只是隐藏了类成员变量的decalration,所以方法中'proc'的所有用法引用本地的,不是成员变量。如果你至少有最小的C++知识,你应该看到错误,知道它被指出。 – 2011-06-05 00:15:28

+1

通过使用'new QProcess(this)'使主窗口成为进程的父进程也是一个好主意,这样当主窗口get被销毁时它会被自动删除。 – 2011-06-05 00:16:49