2013-06-27 66 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 

这是所有

相关问题