【问题标题】:How do I create a simple Qt console application in C++?如何在 C++ 中创建一个简单的 Qt 控制台应用程序?
【发布时间】:2011-05-09 23:40:17
【问题描述】:

我试图创建一个简单的控制台应用程序来试用 Qt 的 XML 解析器。我在VS2008开始了一个项目,得到了这个模板:

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

    return a.exec();
}

由于我不需要事件处理,我想知道如果我忽略创建 QCoreApplication 并运行事件循环是否会遇到麻烦。文档说明在大多数情况下建议使用它。

但是,出于好奇,我想知道如何在事件循环上执行一些通用任务,然后终止应用程序。我无法通过 Google 搜索相关示例。

【问题讨论】:

  • 问题太模糊了。如果您遇到特定问题,请发布代码并发布任何错误。如果您正在寻找操作方法,谷歌是您最好的朋友。
  • 如果要运行事件循环,只需要调用exec()即可;听起来你不想那样做。也就是说,如果你最终想要运行一个事件循环,你可以通过调用 qApp->quit() 使事件循环退出(其中 qApp 是一个全局变量,Qt 设置为指向你的 QApplication 对象)跨度>
  • jeremy 所说的:不要调用 EXEC()。你不需要事件循环。
  • 对不起,如果这太模糊了,但我不知道如何扩展它。问题是我被文档引导相信,这个模板虽然通常不是强制性的,但实际上是做事的正确方法。当时的一个问题是——这是真的吗,或者我可以跳过它,并且得到了令人满意的回答。另一个问题本质上是:我如何让事情在事件循环上运行然后退出。编辑反映,也许这会有所作为。

标签: c++ qt console


【解决方案1】:

如果您希望事件循环运行,这是一种构建应用程序的简单方法。

// main.cpp
#include <QtCore>

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

public slots:
    void run()
    {
        // Do processing here

        emit 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();
}

【讨论】:

  • @baysmith 在 qt5 中,QObject::connect(task, &amp;Task::finished, &amp;QCoreApplication::quit); 似乎也可以工作。
  • QCoreApplication::quit 是一个插槽:QTimer::singleShot(0, &amp;a, SLOT(quit()));
  • 为什么要包含main.moc
  • 必须包含main.moc的原因在这里描述:stackoverflow.com/questions/34928933/…
【解决方案2】:

别忘了添加

CONFIG += console 

在 qmake .pro 文件中标记。

剩下的只是使用一些 Qt 类。 我使用它的一种方法是跨平台生成进程。

【讨论】:

    【解决方案3】:

    您根本不需要QCoreApplication,只需像包含其他对象一样包含您的 Qt 对象,例如:

    #include <QtCore>
    
    int main()
    {
        QVector<int> a; // Qt object
    
        for (int i=0; i<10; i++)
        {
            a.append(i);
        }
    
        /* manipulate a here */
    
        return 0;
    }
    

    【讨论】:

    • 来自文档:“一些 Qt 类,例如 QString,可以在没有 QCoreApplication 对象的情况下使用。但是,一般来说,我们建议您在 main() 中创建 QCoreApplication 或 QApplication 对象尽早发挥作用。”。如果我想小心点,或者计划在未来使用事件循环怎么办?我假设我应该创建一些 Q_OBJECT 类型的类并在其中做我的工作 - 它应该是什么样子?
    • 它应该是什么样子会受到你想要它做什么的影响。如果你最终想要做一些使用事件循环的事情,那么使用事件循环。由于您还没有确定您要解决的问题,因此任何答案的普遍性都会令人发狂。这就像问我们如果你要写一本书,你的书会是什么样子。但是,你没有告诉我们你想写什么样的书。
    • 为了进行这个类比,在最一般的情况下,一本书有封面和中间的页面。我认为baysmith成功地展示了这些封面的一般视图,即如何在事件循环结束返回时运行一些东西。
    【解决方案4】:

    我设法用 QT Creator 创建了一个简单的控制台“hello world”

    在 Windows 7 上使用 creator 2.4.1 和 QT 4.8.0

    两种方法

    纯 C++

    执行以下操作

    1. 文件-新建文件项目
    2. 在项目下选择:其他项目
    3. 选择“普通 C++ 项目”
    4. 输入项目名称 5.Targets选择桌面'打勾'
    5. 项目管理直接点击下一步
    6. 您可以像使用普通 c++ 一样使用 c++ 命令

    QT 控制台

    1. 文件-新建文件项目
    2. 在项目下选择:其他项目
    3. 选择 QT 控制台应用程序
    4. 目标选择桌面“打勾”
    5. 项目管理直接点击下一步
    6. 添加以下行(包括您需要的所有 C++)
    7. 添加“#include 'iostream'”
    8. 添加“使用命名空间标准;”
    9. 在 QCoreApplication a(int argc, cghar *argv[]) 之后 10 添加变量,和你的程序代码..

    示例:QT 控制台“hello world”

    文件 - 新文件项目'项目名称'

    其他项目 - QT 控制台应用程序

    目标选择“桌面”

    项目管理 - 下一步

    代码:

        #include <QtCore/QCoreApplication>
        #include <iostream>
        using namespace std;
        int main(int argc, char *argv[])
        {
         QCoreApplication a(argc, argv);
         cout<<" hello world";
         return a.exec();
         }
    

    ctrl -R 运行

    用于以上 MSVC 2010 (QT SDK) 和 minGW(QT SDK) 的编译器

    希望这对某人有所帮助

    由于我最近才开始使用 QT,并且还搜索了 Www 的信息和示例以开始使用仍在搜索中的简单示例...

    【讨论】:

      【解决方案5】:

      即使没有 connect(),您也可以在应用程序的 quit() 槽中触发事件。 这样,事件循环至少会转一圈,并且应该在你的 main() 逻辑中处理事件:

      #include <QCoreApplication>
      #include <QTimer>
      
      int main(int argc, char *argv[])
      {
          QCoreApplication app( argc, argv );
      
          // do your thing, once
      
          QTimer::singleShot( 0, &app, &QCoreApplication::quit );
          return app.exec();
      }
      

      不要忘记将CONFIG += console 放在您的.pro 文件中,或在您的.qbs Project.CppApplication 中设置consoleApplication: true

      【讨论】:

        【解决方案6】:

        您可以调用 QCoreApplication::exit(0) 以代码 0 退出

        【讨论】:

          【解决方案7】:

          遇到了同样的问题。在 Youtube 上找到了一些视频。 所以这里有一个更简单的建议。这就是您需要的所有代码:

          #include <QDebug>
          
          int main(int argc, char *argv[])  
          {
             qDebug() <<"Hello World"<< endl;
             return 0;
          }
          

          以上代码来自 Qt5 教程:构建一个简单的控制台应用程序

          多米尼克·蒂博

          http://www.youtube.com/watch?v=1_aF6o6t-J4

          【讨论】:

          • 这不使用 Qt 事件循环。它是一个裸露的 Unix main()。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-04-10
          • 2017-03-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多