我编写了一个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中的调试
答案 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);
但是当你第二次点击时会出现内存泄漏,并且无法从第一个进程获得更多数据。所以你不得不以某种方式改变你的设计。