如何从我的代码中确定我的应用程序是否从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