2013-06-27 67 views
2

如何從我的代碼中確定我的應用程序是否從Qt Creator啓動(通過「F5」或「Ctrl + R」)?Qt確定應用程序是否從Qt Creator啓動?

之所以我想知道這是因爲我想創建自己的調試消息處理程序(使用qInstallMessageHandler())只有當應用程序直接從可執行文件啓動。由於Qt只允許使用一個消息處理程序,所以從Qt Creator啓動時我不想創建自己的消息處理程序,否則我無法在Qt Creators自己的調試控制檯中看到調試消息。

+0

調試消息處理程序與在調試vs發行模式下運行應用程序無關。簡短的回答是你不應該關心它。只需使用qDebug將信息輸出到控制檯即可。如果你想要所有東西都出來std :: cout或std :: cerr,那麼你應該在這一點上使用qInstallMessageHandler重載消息處理程序。在Windows上,控制檯應用程序的輸出和GUI應用程序的輸出之間有一些細微的差異,但是您可以輕鬆地將其升級爲Google。 – Huy

+0

我不是在談論調試vs發佈。我的意思是,當用戶在QtCreator外運行我的應用程序時,我希望通常在QtCreator的調試控制檯中顯示的消息顯示在我自己的應用程序的gui中的文本框中(因爲用戶不會打開QtCreator)。 –

+0

qInstallMessageHandler並寫入您的文本框 – Huy

回答

3

我不認爲有一個簡單的方法來檢測。 雖然你可以添加一個命令行參數到QtCreator中的運行設置,並在運行時檢查它。

+0

似乎這是迄今爲止最好的解決方案。我原以爲有一個更標準的方法來檢測這個。但這是我能得到的最接近的。 –

1

您可以嘗試IsDebuggerPresent或僅使用QDebug並在QT Creator外部使用debugview檢查調試消息。

+0

謝謝,但IsDebuggerPresent在從QtCreator(ctrl + r)啓動應用程序時沒有返回true,沒有調試(F5)。 我以爲會有一些Qt命令來檢測這個,但似乎沒有簡單的方法.. –

0

你應該谷歌qInstallMessageHandler的更多信息。

但這裏有雲的定義:

#ifndef MAINWINDOW_H 
#define MAINWINDOW_H 

#include <QMainWindow> 
#include <QtGui> 
#include <QtWidgets> 

namespace Ui { 
class MainWindow; 
} 

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    explicit MainWindow(QWidget *parent = 0); 
    ~MainWindow(); 

    static void myMessageHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg) 
    { 
    // If you're running lots of threads you'll need to do some research to 
    // determine if you need to make this synchronized (i.e. locked) 
    if(staticTextEdit) { 
     staticTextEdit->appendPlainText(msg + "\n"); 
    } 
    } 

private slots: 
    void on_pushButton_clicked(); 

private: 
    // There's lots of different ways to do this ... this was the quickest way for me. 
    static QPlainTextEdit* staticTextEdit; 
    Ui::MainWindow *ui; 
}; 

#endif // MAINWINDOW_H 

以下是聲明:

#include "mainwindow.h" 
#include "ui_mainwindow.h" 

QPlainTextEdit* MainWindow::staticTextEdit = NULL; 

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
    staticTextEdit = ui->plainTextEdit; 
    qInstallMessageHandler(MainWindow::myMessageHandler); 
} 

MainWindow::~MainWindow() 
{ 
    delete ui; 
} 

// I'm using QtCreator to help create my slots. =). 
void MainWindow::on_pushButton_clicked() 
{ 
    qDebug() << "CLICKED"; 
} 
+0

謝謝,但我已經知道如何使用消息處理程序。我的問題是**我怎麼知道何時使用我的自定義消息處理程序(我不希望它從QtCreator啓動應用程序時)**。 –

+0

編譯應用程序時,會傳遞一個DEBUG宏。您可以切換(即代碼)。當然,我假設你沒有在IDE之外使用「調試」版本。在Windows中,您可能需要切換_DEBUG - [請點擊此處](http://msdn.microsoft.com/en-us/library/b0084kay%28v=vs.90%29.aspx) – Huy

+0

問題是從QtCreator運行應用程序時,我可以運行版本(即DEBUG未設置)。 –

2

我有兩個可能的解決方案:

  1. 檢查父進程的名稱(或父母親)

    有多種方式可以做到這一點:在Posix(mingw,linux等)下,你有getppid()。在Windows下,您可以檢查名稱是否具有Psapi或其他流程處理功能。過去我爲了其他目的而做了這些工作,只要進程名稱沒有改變,它就可以可靠地工作。或者,您可以檢查窗口名稱。不幸的是,這些解決方案都不是「Qt-Native」。

  2. 提供從Qt Creator的

    開始只有當如果你使用一個庫來掃描commanline爭論這可能是最簡單的解決方案一個命令行參數。我通常使用Boost程序選項(谷歌那裏)。你可以創建一個命令行參數,比如「--console-log」,它指定把日誌輸出放到控制檯。從Qt Creator中設置該選項有記錄here.這可能是最「Qt本機」解決方案。如果你使用Qt函數來解析命令行,它是100%Qt。

0

這是手動解決方案。

定義您.pro文件中的宏....

# To turn on remove the comment marker '#' 
# isEmpty(LAUNCH_FROM_IDE):LAUNCH_FROM_IDE = 1 
    !isEmpty(LAUNCH_FROM_IDE) { 
      DEFINES += APP_LAUNCH_FROM_IDE 
    } 

而在你的頭可根據需要使用/源...

#ifdef APP_LAUNCH_FROM_IDE 
... 
#endif 

這是所有

相關問題