如何解决MacOS:如何启动gui QProcess并将其放在最前面?
我正在尝试使用QProcess运行gui应用程序,但默认情况下它不处于活动状态:
qint64 pid = 0;
QProcess::startDetached(executable,args,wd,&pid); //The app is in background
我尝试了activateWithOptions
,但没有帮助:
qint64 pid = 0;
QProcess::startDetached(executable,&pid);
NSRunningApplication *app = [NSRunningApplication runningApplicationWithProcessIdentifier:static_cast<pid_t>(pid)];
[app activateWithOptions: NSApplicationActivateIgnoringOtherApps]; //The app is still in background
但是,如果我添加一个小的延迟,activateWithOptions
会按预期工作:
qint64 pid = 0;
QProcess::startDetached(executable,&pid);
QThread::msleep(2000);
NSRunningApplication *app = [NSRunningApplication runningApplicationWithProcessIdentifier:static_cast<pid_t>(pid)];
[app activateWithOptions: NSApplicationActivateIgnoringOtherApps]; //The app is in foreground!
但是QThread::msleep(2000)
看起来很脏,不会通过代码审查:)
所以,我的问题是:如何启动gui程序,并使其在没有黑客的情况下出现在前面?
PS:我知道QProcess::startDetached("open","-a " + executable);
可以工作,但是它不允许指定工作目录,因此不适合我
UPD::好像我需要等到应用程序finished launching,然后才能激活它。
解决方法
我的解决方案:
NSRunningApplication *waitForAppHandle(pid_t pid) const
{
forever {
NSRunningApplication *app = [NSRunningApplication runningApplicationWithProcessIdentifier: pid];
if (app)
return app;
}
QThread::yieldCurrentThread();
}
}
bool waitForLaunched(NSRunningApplication *app) const
{
forever {
if ([app isFinishedLaunching]) {
return;
}
QThread::yieldCurrentThread();
}
}
void activate(pid_t pid)
{
NSRunningApplication *app = waitForAppHandle();
waitForLaunched(app);
[app activateWithOptions : NSApplicationActivateIgnoringOtherApps];
}
//...
QProcess p;
//...
activate(p.processId());
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。