【问题标题】:Signals and slots in Qt console appQt 控制台应用程序中的信号和槽
【发布时间】:2014-04-05 07:11:27
【问题描述】:

我是新手,但我想编写一个 Qt 控制台应用程序,它使用 Qt 的功能,包括信号和插槽,因此需要一个应用程序事件循环。在这个问题How do I create a simple Qt console application in C++? 之后,我似乎正朝着正确的方向前进,但是为什么在以下代码中发出完成后会执行任何操作:

// main.cpp
#include <QtCore>
#include <QDebug>

class Task : public QObject
{
    Q_OBJECT
public:
    Task(QObject *parent = 0) : QObject(parent) {}

public slots:
    void run()
    {
        // Do processing here
        qDebug() << "Hello World";
        emit finished();
        qDebug() << "I thought I'd finished!";
    }

signals:
    void finished();
};

#include "main.moc"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    // Task parented to the application so that it
    // will be deleted by the application.
    Task *task = new Task(&a);

    // This will cause the application to exit when
    // the task signals finished.
    QObject::connect(task, SIGNAL(finished()), &a, SLOT(quit()));

    // This will run the task from the application event loop.
    QTimer::singleShot(0, task, SLOT(run()));

    return a.exec();
}

【问题讨论】:

  • > 为什么在下面的代码中发出完成后执行任何操作:你能更精确吗?输出到底是什么?
  • 它输出“Hello World”和“我以为我已经完成了”。我期待 Hello World,但认为完成信号与应用程序退出槽的连接会导致应用程序在“我以为我已经完成”之前终止。

标签: c++ qt qtcore qobject qt-signals


【解决方案1】:

尝试继承 QCoreApplication 并通过插入调试打印重新实现 quit() 信号。

如果您使用的是DirectConnection,您将看到在“运行”槽中第二次打印之前立即调用了退出函数。

此外,根据文档,quit() 与 GNU C exit() 略有不同,这毫无价值:

请注意,与同名的 C 库函数不同,此函数确实返回给调用者 -- 停止的是事件处理。

这意味着 quit() 并不意味着应用程序立即退出而不在您的方法执行过程中正常终止。

【讨论】:

  • 好的,所以退出槽被调用,我现在已经阅读了关于事件处理停止的文档,但这来自槽 Qeventloop::quit() 我以为我正在使用 QCoreApplication ::quit() 告诉应用程序退出并返回代码 0。问题变成了如何退出“运行”槽并将控制权返回给应用程序以使其停止。
  • 从运行槽返回而不是打印?此外,你误读了一些东西。它是 QEventLoop::exit(),而不是由 QCoreApplication::quit() 调用的 QEventLoop::quit()。
  • 如果我做对了:要在控制台应用程序中使用 Qt 的功能/事件循环,我需要一个 QCoreApplication 和一个带有“运行”插槽的“工人”类。计时器用于将对“运行”槽的调用置于应用程序的事件循环中。当工作类完成时,它会向应用程序的退出槽发出信号,该槽停止它的事件循环,然后将程序流返回到工作对象,然后从“运行”槽返回,一切都停止。没有更简单的方法吗?
  • 我不确定你的意思。问题是 GNU C 中的 quit() 不等于 exit()。它会停止处理事件,但不会突然中断应用程序,因此会中断 print 语句。至于您的应用程序的修复,我们无法确定。有太多的场景有不同的方法。这是你的电话。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多