Qt 循环中加入QCoreApplication::processEvents退出后台运行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt 循环中加入QCoreApplication::processEvents退出后台运行相关的知识,希望对你有一定的参考价值。

在qt的while无限循环中加入了QCoreApplication::processEvents()后界面不会出现无响应的情况,但是每次循环没跳出便关闭程序的话,该程序还是会在后台运行,请问有什么方法能在程序关闭后不在后台运行吗?

你应该使用QApplication::processEvents(),这个是处理GUI程序的。而QCoreApplication::processEvents()是处理控制台程序的,虽然我没看源码,但你关闭窗体时的closeEvent是widget特有的,而控制台不会产生这个事件,所以你用QCoreApplication::processEvents()根据就不会处理顶层窗体的closeEvent,也就是不会退出程序,而窗体自身对closeEvent的处理只是hide隐藏窗体而已,也就造成你的后台运行现象。追问

按照你说的改了之后还是会后台运行,我想会不会是我在程序里面加了循环的原因

参考技术A 大佬,这个问题解决了吗。我现在也有这个问题 参考技术B 应该不会啊,是不是你关闭程序的地方有问题?你是这么关的?追问

我是一个界面,直接按右上角的叉或者按退出就关了

追答

setAttribute(Qt::WA_DeleteOnClose);给你的界面加上这个方法试试

追问

不行,关闭直接出错了

本回答被提问者采纳

QT QcoreApplication postEvent() 行为

【中文标题】QT QcoreApplication postEvent() 行为【英文标题】:QT QcoreApplication postEvent() behaviour 【发布时间】:2018-01-10 16:36:28 【问题描述】:

我已经编写了这个简单的 QT 主窗口,只有当我将 QString 参数传递给 QKeyEvent 时,它才会打印密钥,我希望即使没有 QString 参数也能打印密钥?

下面代码中的第 1 部分似乎不起作用(我没有在 QLineEdit 字段中打印密钥;而第 2 部分有效并且打印了“1”!这是正常行为吗?当事件发生时会发生什么情况?贴在代码的第一部分?

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)


    ui->setupUi(this);
    this->ui->lineEdit->setFocus();

    Qt::Key key = Qt::Key_1;
    // 1
    QKeyEvent *event = new QKeyEvent (QEvent::KeyPress, key ,Qt::NoModifier); 
    QCoreApplication::postEvent(QWidget::focusWidget(), event); // Does not work! No key is set in the widget
    //
    //2 
    QKeyEvent *event2 = new QKeyEvent(QEvent::KeyPress, key, Qt::NoModifier, QKeySequence(key).toString());
    QCoreApplication::postEvent(QWidget::focusWidget(), event2); // this one works! 


【问题讨论】:

我观察到与键和sendEvent 类似的行为。例如,Key_Backspace 有效,但 Key_A 无效。另请参阅How to use QCoreApplication::postEvent to inject synthetic input events。 【参考方案1】:

并非所有按键事件都有文本表示(删除、光标移动、快捷方式……)。对于那些拥有它的人,QKeyEvent 类将其存储在其文本中。您必须提供该文本,否则它是“无文本”事件。

QLineEdit 只会添加文本,而不是从事件类型中推断出来(可以看到here)

【讨论】:

谢谢@king_nak,我很困惑,因为在一些SO线程中人们报告说它对他们有用!我对“它有效”的看法是生成了文本..但现在我有了完整的图片..postEvent 适用于这两种情况。

以上是关于Qt 循环中加入QCoreApplication::processEvents退出后台运行的主要内容,如果未能解决你的问题,请参考以下文章

QT中的线程与事件循环理解

pylab.show() "QCoreApplication::exec: 事件循环已经在运行"

Qt QApplication::processEvents();//不停地处理事件,让程序保持响应

我的精神分裂症控制台/gui Qt5 程序应该使用 QApplication 还是 QCoreApplication?

Qt之QEvent(所有事件的翻译)

QT源码查看001-QApplication和QCoreApplication