首页 > 解决方案 > 为什么启动 QProcess 会冻结 QWidget 子类中的 GUI,但不会冻结 QLineEdit 子类中的 GUI?

问题描述

我有一个简单的可执行文件 ( english.exe),可以将 Windows 的输入语言更改为英语。当用户与 GUI 的各种组件交互时,我想运行这个可执行文件。

focusInEvent如果我在of中运行可执行文件QLineEdit,我会得到预期的行为:程序运行,并且没有滞后。

void MyLineEdit::focusInEvent(QFocusEvent *e)
{
    QLineEdit::focusInEvent(e);

    QProcess * switchInput = new QProcess(this);
    switchInput->start( "c:/english.exe");
}

我想在激活特定小部件时运行类似的代码,请参阅此答案。(事实上​​,我想使用focusInEventa QWebEngineView,但尽管有这个已解决的错误报告,但从未调用过该事件;我使用的是 Qt 5.12.6。)但是使用以下代码,GUI 挂起。

bool MyWidget::event(QEvent *event)
{
    bool result = QWidget::event(event);
    if( event->type() == QEvent::WindowActivate )
    {
        // qDebug() << "QEvent::WindowActivate";
        QProcess * switchInput = new QProcess(this);
        switchInput->start( "c:/english.exe" );
    }
    return result;
}

使用该qDebug()代码,我只收到一条“QEvent::WindowActivate”消息。

这两个调用有什么区别?有替代解决方案吗?


编辑:无论我找到什么解决方案都可能不是普遍感兴趣的。我正在运行的程序是一个命令行AutoHotKey脚本(带有内容PostMessage, 0x50, 0, 0x0409,, A)(没有输出或用户交互)。为了比较,我尝试运行ipconfig.exe(随机获取命令行程序)并且问题消失了。所以一定有一些关于 AutoHotKey 脚本的东西,或者关于 AutoHotKey 本身的东西。

标签: qtqprocess

解决方案


推荐阅读