2010-11-14 46 views
53

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

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

    return a.exec(); 
} 

因为我不需要事件处理,我不知道我是否会惹上麻烦,如果我忽略创建一个QCoreApplication和运行事件循环。该文件声明,它在大多数情况下被推荐。

但是,为了好奇,我想知道如何在事件循环中执行一些通用任务,然后终止应用程序。我无法谷歌相关的例子。

+0

问题太含糊。如果您遇到特定问题,请发布代码并发布任何错误。如果你正在寻找一个方法,谷歌是你最好的朋友。 – 2010-11-14 23:51:15

+0

如果你想运行一个事件循环,你只需要调用exec();听起来你不想那么做。也就是说,如果你最终希望运行一个事件循环,你可以通过调用qApp-> quit()(其中qApp是一个全局变量,Qt设置为指向你的QApplication对象)来导致事件循环退出。 – 2010-11-14 23:58:39

+0

杰里米说:不要打电话给EXEC()。你不需要事件循环。 – ianmac45 2010-11-15 01:14:44

回答

80

这里有一个简单的方法,如果你想一个事件循环运行,你可以构建一个应用程序。

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

@baysmith在qt5中,这个'QObject :: connect(task,&Task :: finished,&QCoreApplication :: quit)'似乎也可以工作。 – 2013-06-01 09:16:02

+0

'QCoreApplication :: quit'是一个插槽:'QTimer :: singleShot(0,&a,SLOT(quit()));' – Answeror 2013-06-21 02:03:13

+0

为什么要包含'main.moc'? – Yola 2017-07-28 10:57:49

5

你不需要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; 
} 
+4

来自文档:“一些Qt类,比如QString,可以在没有QCoreApplication对象的情况下使用,但是,一般来说,我们建议尽早在main()函数中创建一个QCoreApplication或QApplication对象。 。如果我想要小心,或者可能计划在未来使用事件循环呢?我假设我应该创建一些Q_OBJECT类型的类并在其中完成我的工作 - 它应该是什么样子? – neuviemeporte 2010-11-15 00:13:13

+2

它应该看起来像会受到你想要它做的事情的影响。如果您最终想要使用事件循环,请使用事件循环。既然你还没有确定你想要解决的问题,那么任何答案都会在他们的普遍性中令人发狂。就像问我们你的书会是什么样子,如果你要写一本书。但是,你不会告诉我们你想写什么样的书。 – wrosecrans 2010-11-15 06:50:44

+0

为了进行这种比喻,在最常见的情况下,一本书有一个封面和介于两者之间的页面。我认为baysmith成功地展示了这些封面的一般视图,那就是如何在事件循环结束时返回该事件。 – neuviemeporte 2010-11-15 10:05:12

16

不要忘记添加

CONFIG += console 

标志在qmake .pro文件中。

其余的只是使用一些Qt类。 我使用它的一种方式是生成跨平台的流程。

1

你可以调用QCoreApplication ::出口(0)与代码退出0

4

我成功地创建一个简单的控制台的 “Hello World” 在Windows上Qt Creator的

使用的创造者2.4.1和4.8.0 QT 7

两种方法可以做到这一点

平原C++

执行以下

  1. 文件 - 新文件的项目
  2. 下的项目中进行选择:其他项目
  3. 选择 “纯C++项目”
  4. 输入项目名称 5。目标选择桌面 '打勾'
  5. 项目同治只需点击下一步
  6. 您可以使用C++命令为标准C++

QT控制台

  1. 文件 - 新文件的项目
  2. 项目选择:其他项目
  3. s选QT控制台应用程序
  4. 目标选择桌面“打勾”
  5. 项目同治只需点击下一步
  6. 添加以下代码行(所有C++包括你需要的)
  7. 增“的#include‘iostream的’”
  8. 添加“using namespace std; “
  9. QCoreApplication后(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,并且还搜索了关于信息和示例的简介, g ...

-2

有同样的问题。在Youtube上发现了一些视频。 所以这里有一个更简单的建议。这是你需要的所有代码:

#include <QDebug> 

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

上面的代码来自 QT5教程:构建一个简单的控制台应用程序通过

多米尼克Thiebaut的

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

+1

这不使用Qt事件循环。它是一个纯粹的Unix main()。 – 2016-03-07 21:58:11

相关问题