如何從我的代碼中確定我的應用程序是否從Qt Creator啓動(通過「F5」或「Ctrl + R」)?Qt確定應用程序是否從Qt Creator啓動?
之所以我想知道這是因爲我想創建自己的調試消息處理程序(使用qInstallMessageHandler())只有當應用程序直接從可執行文件啓動。由於Qt只允許使用一個消息處理程序,所以從Qt Creator啓動時我不想創建自己的消息處理程序,否則我無法在Qt Creators自己的調試控制檯中看到調試消息。
如何從我的代碼中確定我的應用程序是否從Qt Creator啓動(通過「F5」或「Ctrl + R」)?Qt確定應用程序是否從Qt Creator啓動?
之所以我想知道這是因爲我想創建自己的調試消息處理程序(使用qInstallMessageHandler())只有當應用程序直接從可執行文件啓動。由於Qt只允許使用一個消息處理程序,所以從Qt Creator啓動時我不想創建自己的消息處理程序,否則我無法在Qt Creators自己的調試控制檯中看到調試消息。
我不認爲有一個簡單的方法來檢測。 雖然你可以添加一個命令行參數到QtCreator中的運行設置,並在運行時檢查它。
似乎這是迄今爲止最好的解決方案。我原以爲有一個更標準的方法來檢測這個。但這是我能得到的最接近的。 –
您可以嘗試IsDebuggerPresent或僅使用QDebug並在QT Creator外部使用debugview檢查調試消息。
謝謝,但IsDebuggerPresent在從QtCreator(ctrl + r)啓動應用程序時沒有返回true,沒有調試(F5)。 我以爲會有一些Qt命令來檢測這個,但似乎沒有簡單的方法.. –
你應該谷歌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";
}
謝謝,但我已經知道如何使用消息處理程序。我的問題是**我怎麼知道何時使用我的自定義消息處理程序(我不希望它從QtCreator啓動應用程序時)**。 –
編譯應用程序時,會傳遞一個DEBUG宏。您可以切換(即代碼)。當然,我假設你沒有在IDE之外使用「調試」版本。在Windows中,您可能需要切換_DEBUG - [請點擊此處](http://msdn.microsoft.com/en-us/library/b0084kay%28v=vs.90%29.aspx) – Huy
問題是從QtCreator運行應用程序時,我可以運行版本(即DEBUG未設置)。 –
我有兩個可能的解決方案:
檢查父進程的名稱(或父母親)
有多種方式可以做到這一點:在Posix(mingw,linux等)下,你有getppid()。在Windows下,您可以檢查名稱是否具有Psapi或其他流程處理功能。過去我爲了其他目的而做了這些工作,只要進程名稱沒有改變,它就可以可靠地工作。或者,您可以檢查窗口名稱。不幸的是,這些解決方案都不是「Qt-Native」。
提供從Qt Creator的
開始只有當如果你使用一個庫來掃描commanline爭論這可能是最簡單的解決方案一個命令行參數。我通常使用Boost程序選項(谷歌那裏)。你可以創建一個命令行參數,比如「--console-log」,它指定把日誌輸出放到控制檯。從Qt Creator中設置該選項有記錄here.這可能是最「Qt本機」解決方案。如果你使用Qt函數來解析命令行,它是100%Qt。
這是手動解決方案。
定義您.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
這是所有
調試消息處理程序與在調試vs發行模式下運行應用程序無關。簡短的回答是你不應該關心它。只需使用qDebug將信息輸出到控制檯即可。如果你想要所有東西都出來std :: cout或std :: cerr,那麼你應該在這一點上使用qInstallMessageHandler重載消息處理程序。在Windows上,控制檯應用程序的輸出和GUI應用程序的輸出之間有一些細微的差異,但是您可以輕鬆地將其升級爲Google。 – Huy
我不是在談論調試vs發佈。我的意思是,當用戶在QtCreator外運行我的應用程序時,我希望通常在QtCreator的調試控制檯中顯示的消息顯示在我自己的應用程序的gui中的文本框中(因爲用戶不會打開QtCreator)。 –
qInstallMessageHandler並寫入您的文本框 – Huy