如何在C ++中创建一个简单的Qt控制台应用程序?


77

我试图创建一个简单的控制台应用程序来尝试Qt的XML解析器。我在VS2008中启动了一个项目,并获得了以下模板:

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

    return a.exec();
}

由于我不需要事件处理,因此我想知道是否忽略创建QCoreApplication并运行事件循环是否会遇到麻烦。文档指出,在大多数情况下建议这样做。

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


问题太模糊了。如果您遇到特定问题,请发布代码并发布任何错误。如果您正在寻找操作方法,google是您最好的朋友。
John Dibling 2010年

如果要运行事件循环,只需调用exec()即可;听起来您不想这样做。这就是说,如果你最终想要运行一个事件循环,可以通过调用qApp-导致事件循环退出>退出()(其中qApp是一个全局变量,Qt的集合,使其指向您QApplication对象)
杰里米Friesner

杰里米说的是:请勿致电EXEC()。您不需要事件循环。
ianmac45

2
抱歉,这太含糊了,但是我不知道如何扩展它。问题是文档使我相信,这个模板虽然通常不是必须的,但实际上是正确的处理方式。然后一个问题是-这是真的,还是我可以跳过它,并且得到令人满意的回答。本质上,另一个问题是:如何使内容在事件循环上运行然后退出。编辑以反映出来,也许会有所不同。
neuviemeporte

Answers:


107

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

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

4
@baysmith在qt5中QObject::connect(task, &Task::finished, &QCoreApplication::quit);似乎也起作用。
ErikSjölund'13年

QCoreApplication::quit是一个广告位:QTimer::singleShot(0, &a, SLOT(quit()));
答案

3
你为什么要包括main.moc
Yola

main.moc此处描述了必须包含的原因:stackoverflow.com/questions/34928933/…–
tantuni

18

别忘了添加

CONFIG += console 

qmake .pro文件中的标志。

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


4

您根本不需要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;
}

6
从文档中:“某些Qt类(例如QString)可以在没有QCoreApplication对象的情况下使用。但是,通常,我们建议您尽早在main()函数中创建QCoreApplication或QApplication对象。” 如果我要小心,或者计划将来使用事件循环,该怎么办?我假设我应该创建一些Q_OBJECT类型类并在其中进行工作-它应该是什么样?
neuviemeporte 2010年

2
它的外观将受到您想要执行的操作的影响。如果您最终想要做一些使用事件循环的操作,请使用事件循环。由于您尚未确定要解决的问题,因此所有答案在总体上都会令人发疯。就像问我们如果要写一本书,你的书是什么样。但是,您不会告诉我们您想写哪种书。
wrosecrans 2010年

为了进行类比,在最一般的情况下,一本书的封面和封面之间都有页。我认为贝史密斯(Baysmith)成功地展示了此类封面的总体观点,那就是如何在事件循环结束时返回内容。
neuviemeporte

3

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

在Windows 7上使用过Creator 2.4.1和QT 4.8.0

两种方法

纯C ++

请执行下列操作

  1. 文件-新文件项目
  2. 在项目下选择:其他项目
  3. 选择“普通C ++项目”
  4. 输入项目名称5.Targets选择Desktop'tick it'
  5. 项目管理只需单击下一步
  6. 您可以像普通的c ++一样使用c ++命令

要么

QT控制台

  1. 文件-新文件项目
  2. 在项目下选择:其他项目
  3. 选择QT控制台应用程序
  4. 目标选择桌面“打勾”
  5. 项目管理只需单击下一步
  6. 添加以下行(您需要的所有C ++都包括在内)
  7. 添加“ #include'iostream'”
  8. 添加“使用命名空间std;”
  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上搜索了信息和示例,以从仍在搜索的简单示例开始...


1

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


0

即使没有connect(),也可以将事件触发到应用程序的quit()插槽中。这样,事件循环至少旋转一圈,并应在main()-logic中处理事件:

#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文件中或consoleApplication: true在.qbs Project.CppApplication中进行设置。


-1

有同样的问题。在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


3
这不使用Qt事件循环。它是一个裸露的Unix main()。
劳尔·萨利纳斯-蒙塔古多
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.