如何杀死并重新运行qt中的主进程?
Posted
技术标签:
【中文标题】如何杀死并重新运行qt中的主进程?【英文标题】:How to kill and rerun the main process in qt? 【发布时间】:2019-10-24 11:40:51 【问题描述】:我有一个可以运行其他 exe 文件的应用程序。一些按钮并连接到可执行文件。当我单击按钮时,开始运行另一个程序......这很好,但仍然打开主窗口并且程序仍在运行。我想实现当另一个程序正在运行时主窗口停止运行(或消失),当我从另一个应用程序退出时,运行(或出现并运行)主进程。 我试过这个:
void MainWindow::RunSys(QString sh)
this->close();
QProcess ps;
if(ps.execute(sh)<0)
QMessageBox messageBox;
messageBox.critical(nullptr,"Error",sh + "Error!");
this->show();
//I call the function this way:
QString sh = settings->value("Run").toString();
connect(pButton, &QToolButton::clicked, [=] RunSys(sh); );
它在 Linux 上运行。打开可执行程序,但主程序直到在 Windows 上运行。我能做什么?
【问题讨论】:
感谢您的编辑。 “仍在运行”,您的意思是主窗口没有隐藏(仍然可见)吗? 是的,我在主窗口上有一个时钟,它仍然显示当前时间,我可以点击按钮(没有冻结)。 老实说,我无法重现您的错误,它适用于我...您如何调用该函数?确切的命令是什么?如果你能写一个最小的可复现的例子,也许我们会发现问题所在。 我以这种方式将此函数连接到按钮:` QString *sh = new QString (settings->value("Run").toString()); connect(pButton, &QToolButton::clicked, [=] RunSys(*sh); ); ` 您可以编辑您的问题以添加这些附加信息。我不明白你为什么使用QString*
而不是QString
。
【参考方案1】:
我无法重现该错误,我们需要您提供一个完整、最小且可重现的示例来说明该错误。
如果对你有帮助,我已经根据你的编写了以下示例代码:
标题
class MainWindow : public QMainWindow
Q_OBJECT
protected:
QPushButton * pb;
public:
MainWindow();
void runShellCmd(const QString & cmd);
;
实施
MainWindow::MainWindow()
// Build the main window
resize(600, 400);
pb = new QPushButton("run cmd", this);
this->setCentralWidget(pb);
// Create the command
QString cmd("ping 127.0.0.1 -n 6");
// Connect the signal
connect(pb, &QPushButton::clicked, [=]()runShellCmd(cmd););
void MainWindow::runShellCmd(const QString & cmd)
QProcess ps;
this->close();
int exit_code = ps.execute(cmd);
switch(exit_code)
// Do what you want with exit code
default:;
this->show();
主要功能
int main(int argc, char ** argv)
QApplication app(argc, argv);
MainWindow w;
w.show();
return app.exec();
而且效果很好。
编辑:
我明白出了什么问题。您的 calc.exe 示例向我低声说出了这个问题:)
实际上,QProcess::execute()
会阻塞,直到命令调用返回。在这种情况下,它会在启动后立即返回,而不是在窗口关闭时返回。所以你得到了预期的行为。
恐怕这样做会困难得多。因为calc.exe是一个外部程序,除非你能从外部程序中读取某种关闭信号,否则你将无法检测到它何时关闭。
【讨论】:
如果我使用你的完整代码,它可以工作。但是在我的程序中是同样的问题:(当我点击一个按钮时主窗口消失了,但是另一个程序和主窗口同时出现。主窗口没有被阻塞和运行(运行时钟,我可以点击按钮随心所欲)(例如一个按钮是执行计算,我单击它主窗口消失,几分钟后出现计算器和主窗口)。 所以我觉得程序不会在“this->show();”之前停止它并没有等待其他程序执行this->show()命令。 哦,如果我将您的 cmd 更改为“calc”,问题将是相同的 :( 啊 :( 它让我发疯 :(( 任何其他想法?:(( @Kaguro 其实这很正常,因为QProcess::execute()
一直等到运行命令返回。当您运行 calc.exe 时,它会在启动后返回,而不是在关闭后返回。所以你得到了预期的结果。您可以进行测试,如果您在 cmd 控制台中运行 calc.exe,您会看到控制台在启动后立即返回,因此您即使 calc.exe 没有关闭,也可以使用控制台。以上是关于如何杀死并重新运行qt中的主进程?的主要内容,如果未能解决你的问题,请参考以下文章