2010-11-14 48 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

相關問題