2013-06-27 4 views
2

Как я могу из моего кода определить, запущено ли мое приложение из Qt Creator (либо с помощью «F5», либо «Ctrl + R»)?Qt Определить, запущено ли приложение из Qt Creator?

Причина, почему я хочу знать это, потому что я хочу, чтобы создать свой собственный обработчик отладки сообщений (с использованием qInstallMessageHandler()) только, когда приложение запускается из исполняемого файла непосредственно. Поскольку Qt допускает только один обработчик сообщений, я не хочу создавать свои собственные при запуске из Qt Creator, иначе я не могу видеть отладочные сообщения в собственной консоли отладки Qt Creators.

+0

отладки сообщений обработчик не имеет никакого отношения к запуску приложения в режиме debug vs release. Короткий ответ заключается в том, что вы не должны беспокоиться об этом. Просто используйте qDebug для печати информации на консоли.Если вы хотите, чтобы все вышло в std :: cout или std :: cerr, тогда вы должны перегрузить обработчик сообщений с помощью qInstallMessageHandler. В окнах есть небольшие различия между выходом консольного приложения и выходом приложения GUI, но вы можете легко справиться с этим. – Huy

+0

Я не говорю о debug vs release. Я имею в виду, что, когда пользователь запускает мое приложение за пределами QtCreator, я хочу, чтобы сообщения, которые обычно отображаются в консоли отладки QtCreator, отображались в текстовом поле в моем gui вместо моего собственного приложения (так как у пользователя не будет открытого QtCreator). –

+0

qInstallMessageHandler и напишите в текстовое поле – Huy

ответ

3

Я не думаю, что есть простой способ обнаружить это. Однако вы можете добавить аргумент командной строки в параметры запуска в QtCreator и проверить это во время выполнения.

+0

Кажется, это лучшее решение. Я бы подумал, что существует более стандартный способ обнаружения этого. Но это самое близкое, что я могу получить. –

1

Вы можете попробовать IsDebuggerPresent или использовать только QDebug и проверять сообщения отладки с помощью debugview вне QT Creator.

+0

Спасибо, но IsDebuggerPresent не возвращает true при запуске приложения из QtCreator (ctrl + r) без отладки (F5). Я думал, что будет некоторая команда Qt, чтобы обнаружить это, но кажется, что нет простого способа. –

0

Чтобы получить дополнительную информацию, вы должны выполнить google 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, который передается ему. Вы можете включить это (например, код). Здесь, конечно, я предполагаю, что вы не используете версию «debug» вне среды IDE. Из окон вы, вероятно, захотите переключиться на _DEBUG - [здесь] (http://msdn.microsoft.com/en-us/library/b0084kay%28v=vs.90%29.aspx) – Huy

+0

Проблема в том, что Я могу запустить release (т.е. DEBUG не установлен) при запуске приложения из QtCreator. –

2

У меня есть два возможных решения:

  1. проверки имена родительского процесса (или родительский элемент родителя)

    есть несколько способов сделать это: под Posix (mingw, linux и т. Д.) У вас есть getppid(). В Windows вы можете проверить имя: Psapi или другие функции обработки процессов. Я делал это для других целей в прошлом, и он работает надежно, пока имена процессов не меняются. Кроме того, вы можете проверить имена окон. К сожалению, ни одно из этих решений не является «Qt-Native».

  2. поставить аргумент командной строки только при запуске из Qt Creator

    Если вы используете библиотеку для сканирования commanline аргументы это, вероятно, самое простое решение. Обычно я использую опции программы Boost (Google там). Вы можете создать аргумент командной строки, такой как «--console-log», который указывает, чтобы вывести вывод журнала на консоль. Чтобы установить этот параметр из Qt Creator, зарегистрирован here. Это, пожалуй, самое «решение Qt-Native». Если вы используете функции 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 

Это все