启动QtAssistant

时间:2018-09-25 13:37:09

标签: qt assistant

我正在使用QProcess::start与我的自定义帮助项目文件一起启动Qt Assistant。直到我将项目(无帮助项目文件)加载到程序中,它才能正常工作。程序使用自定义库从特定数据生成图像。即使所有进程结束并且我看到生成的图像,也没有其他任何事情发生,当我尝试启动Qt Assistant时,我的程序在尝试启动进程时挂在QProcess:start函数上。代码是:

show()函数(公开):

if (!run())
    return false;
QByteArray ba("setSource ");
ba.append("qthelp://insyn_help/doc/");

proc->write(ba + page.toLocal8Bit() + '\n');
return true;

run()函数(私有):

if (!proc)
    proc = new QProcess();
if (proc->state() == QProcess::Running)
    return true;
QString app = QString(QT_BIN_DIR) + QDir::separator() + QString("assistant");
QString path = QString(PREFIX) + QString(HELP_INSTALL_PATH) + QString("/help_project.qhc");
QStringList args;
args << QLatin1String("-collectionFile")
     << QLatin1String(path.toLatin1())
     << QLatin1String("-enableRemoteControl");

QFileInfo help_project(path);
if (help_project.exists()) {
    proc->start(app,args);
    if (!proc->waitForStarted()) {
        m_exitCode = 1;
        emit closed();
        return false;
    }
}

此代码是AssistantLauncher类的一部分,该类已使用qmlRegisterType注册,并作为应用程序窗口的成员添加到main.qml中。我的程序不会在任何地方触摸它(调用方法show()除外)。它是单独的对象(除非它是appWindow的一部分)。问题是,为什么仅在我的程序完成某些工作后才能启动该过程?以及为什么QProcess::start甚至没有超时。

UPD:我将proc->start(app,args);移到了子进程,该进程是通过使用fork()获得的,而现在我的程序挂在pid_t child = fork().上,因此问题在于无法创建新进程。

1 个答案:

答案 0 :(得分:0)

答案是不要使用fork(),因为在大型项目中这很危险。有关更多信息,请访问http://www.evanjones.ca/fork-is-dangerous.htmlposix_spawn也挂起了我的项目。现在,我决定在开始时fork()进行新流程,并通过管道向其发送命令。