QT进程在命中插槽时自动终止

QT进程在命中插槽时自动终止,qt,Qt,我已经编写了一个QT代码,它在单击按钮时启动一个新进程,该进程必须执行一个shell脚本,并根据脚本结果在文本浏览器上动态附加Std输出/错误。代码在自定义插槽中失败。这就是我的窗户 这就是我的window.cpp 知道这里发生了什么吗?我熟悉QT中的调试替换: QProcess *process = new QProcess(this); 借 您正在使用未初始化的成员变量进程,因为在Window::go_Button_中单击的是创建局部变量 编辑 实际上,代码很容易出错。当用户多次按下按钮时

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

这就是我的window.cpp

知道这里发生了什么吗?我熟悉QT中的调试

替换:

QProcess *process = new QProcess(this);

您正在使用未初始化的成员变量进程,因为在Window::go_Button_中单击的是创建局部变量

编辑

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

替换:

QProcess *process = new QProcess(this);

您正在使用未初始化的成员变量进程,因为在Window::go_Button_中单击的是创建局部变量

编辑

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

在您的无效窗口中::go_按钮_单击slote您隐藏在.h文件中声明的带有新变量的QProcess*进程

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

process = new QProcess(this);
但,当您第二次单击时,将出现内存泄漏,并且无法从第一个进程获取更多数据。因此,您可以选择以某种方式更改设计。

在您的无效窗口中::go_Button_单击slote您可以隐藏QProcess*进程,该进程在.h文件中声明了新变量

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

process = new QProcess(this);

但,当您第二次单击时,将出现内存泄漏,并且无法从第一个进程获取更多数据。所以你可以改变你的设计。

@G.M在这里添加代码是一个错误,它与Go按钮一起出现。您可以查看更新的post@G.M这是一个错误,我错过了添加代码在这里,它与去按钮。您可以在他第二次按下按钮时查看更新后的帖子,因为他会导致内存泄漏。@Evgeny改进建议正在进行中:-当他第二次按下按钮时,他会导致内存泄漏。@Evgeny改进建议正在进行中:-
process = new QProcess(this);