QT进程在SLOT

时间:2017-02-20 12:14:35

标签: qt

我编写了一个QT代码,它在按钮点击时启动一个新进程,该进程必须执行shell脚本并根据脚本结果动态地在文本浏览器上附加Std输出/错误。代码在自定义Slot中失败。这就是我的 window.h

class Window : public QWidget
{
    Q_OBJECT
public:
    explicit Window(QWidget *parent = 0);
    QPushButton *goButton;
    QTextBrowser *statusWindow;
    QProcess *process;

private slots:
    void go_Button_Clicked();
    void updateOutput();
};

这就是我的 window.cpp

的方式
Window::Window(QWidget *parent) : QWidget(parent)
{
 // Text Browser 
    statusWindow = new QTextBrowser(this);
 // Create the Go button, make "this" the parent
    goButton = new QPushButton(this);
    connect(goButton, SIGNAL (clicked()), this, SLOT (go_Button_Clicked()));
}
void Window::go_Button_Clicked()
{
    // Step1 - Create a new process
    QProcess *process = new QProcess(this);
    // Step2 - Connect the Signals and slot
    qDebug() << connect(process, SIGNAL(readyReadStandardOutput()), this, SLOT(updateOutput()));
    // Step3 - Start the Script process
    process->start("/home/root/script.sh");
    qDebug() << "Process in main";

}
void Window::updateOutput()
{
    qDebug() << "Process in update Output";
    //statusWindow->append(process->readAllStandardOutput());
}

因此,每当我在更新输出中取消注释行时,只要按下按钮,GUI就会崩溃。使用qdebug我设法发现GUI崩溃线的bcoz&#34; statusWindow-&gt; append(process-&gt; readAllStandardOutput());&#34; 。

如果该行被注释,调试消息继续在控制台上打印,但是使用未注释的行我得到调试消息一次然后GUI崩溃。这是调试输出。

true 
true 
Process in main 
Process in update Output 
Process killed by signal

这里有什么想法,我熟悉QT中的调试

2 个答案:

答案 0 :(得分:4)

替换:

QProcess *process = new QProcess(this);

通过

process = new QProcess(this);

您正在使用未初始化的成员变量流程,因为在Window::go_Button_Clicked()中您正在创建局部变量。

修改

实际上,代码非常容易出错。当用户多次按下按钮时会发生什么。然后在插槽中,您可以读取错误进程的输出。 一种解决方法可能是:您根本不将QProcess定义为成员,而是像现在一样将其作为局部变量。然后在插槽中,您可以将发送方转换为QProcess *,除非它失败,否则使用此实例。它将永远是正确的。之后,不要忘记删除发件人。为此使用deleteLater()。

答案 1 :(得分:2)

void Window::go_Button_Clicked() slote中隐藏QProcess *process.h文件中声明的新变量

QProcess *process = new QProcess(this);

替换此行
process = new QProcess(this);

但是当你第二次点击时会出现内存泄漏,并且无法从第一个进程获得更多数据。所以你不得不以某种方式改变你的设计。