Подтвердить что ты не робот

Выход консоли в приложении Qt GUI?

У меня есть приложение Qt GUI, работающее в Windows, которое позволяет передавать параметры командной строки, и в некоторых случаях я хочу вывести сообщение на консоль, а затем выйти, например:

int main(int argc, char *argv[])
{
  QApplication a(argc, argv);

  if (someCommandLineParam)
  {
    std::cout << "Hello, world!";
    return 0;
  }

  MainWindow w;
  w.show();

  return a.exec();
}

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

4b9b3361

Ответ 1

Windows действительно не поддерживает двухрежимные приложения.

Чтобы увидеть вывод консоли, вам нужно создать консольное приложение

CONFIG += console

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

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

Или вы могли бы поместить все функции в DLL, а затем создать две версии файла .exe, которые имеют очень простые основные функции, которые вызывают в DLL. Один для GUI и один для консоли.

Ответ 2

Нет способа вывода сообщения на консоль при использовании QT += gui.

fprintf(stderr, ...) также не может печатать выходные данные.

Используйте QMessageBox вместо этого, чтобы показать сообщение.

Ответ 3

Добавить

#ifdef _WIN32
if (AttachConsole(ATTACH_PARENT_PROCESS)) {
    freopen("CONOUT$", "w", stdout);
    freopen("CONOUT$", "w", stderr);
}
#endif

вверху main(). Это позволит выводить на консоль только в том случае, если программа запущена в консоли и не будет открывать консольное окно в других ситуациях. Если вы хотите создать консольное окно для отображения сообщений при запуске приложения вне консоли, вы можете изменить условие:

if (AttachConsole(ATTACH_PARENT_PROCESS) || AllocConsole())

Ответ 4

О, вы можете вывести сообщение при использовании QT += gui и CONFIG += console.

Вам нужно printf("foo bar"), но cout << "foo bar" не работает

Ответ 5

void Console()
{
    AllocConsole();
    FILE *pFileCon = NULL;
    pFileCon = freopen("CONOUT$", "w", stdout);

    COORD coordInfo;
    coordInfo.X = 130;
    coordInfo.Y = 9000;

    SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), coordInfo);
    SetConsoleMode(GetStdHandle(STD_OUTPUT_HANDLE),ENABLE_QUICK_EDIT_MODE| ENABLE_EXTENDED_FLAGS);
}

int main(int argc, char *argv[])
{
    Console();
    std::cout<<"[email protected]@";
    qDebug()<<"start!";

Вы не можете использовать std:: cout, как говорили другие, мой способ идеально подходит даже для некоторого кода, который не может включать "qdebug"!

Ответ 6

Я использовал этот заголовок ниже для моих проектов. Надеюсь, что это поможет.

#ifndef __DEBUG__H
#define __DEBUG__H

#include <QtGui>    

static void myMessageOutput(bool debug, QtMsgType type, const QString & msg) {

    if (!debug) return;

    QDateTime dateTime = QDateTime::currentDateTime();
    QString dateString = dateTime.toString("yyyy.MM.dd hh:mm:ss:zzz");

    switch (type) {

        case QtDebugMsg:
            fprintf(stderr, "Debug: %s\n", msg.toAscii().data());
            break;
        case QtWarningMsg:
            fprintf(stderr, "Warning: %s\n", msg.toAscii().data());
            break;
        case QtCriticalMsg:
            fprintf(stderr, "Critical: %s\n", msg.toAscii().data());
            break;
        case QtFatalMsg:
            fprintf(stderr, "Fatal: %s\n", msg.toAscii().data());
            abort();
    }
}

#endif

PS: вы можете добавить dateString для вывода, если хотите в будущем.

Ответ 7

Что-то, что вы можете исследовать, по крайней мере для окон, - это функция AllocConsole() в windows api. Он вызывает GetStdHandle несколько раз, чтобы перенаправить stdout, stderr и т.д. (Быстрый тест показывает, что это не полностью делает то, что мы хотим, чтобы он делал. Вы получаете окно консоли, открытое вместе со своим другим материалом Qt, но вы не можете вывод на него. Предположительно, поскольку открыто окно консоли, есть способ получить к нему доступ, получить к нему дескриптор или получить доступ и обработать его каким-то образом. Здесь документация MSDN для тех, кто заинтересован в этом:

AllocConsole(): http://msdn.microsoft.com/en-us/library/windows/desktop/ms681944%28v=vs.85%29.aspx

GetStdHandle (...): http://msdn.microsoft.com/en-us/library/windows/desktop/ms683231%28v=vs.85%29.aspx

(я бы добавил это как комментарий, но правила не позволяют мне это делать...)

Ответ 8

Прежде всего, зачем вам выводить на консоль в сборке режима выпуска? Никто не подумает смотреть там, когда есть gui...

Во-вторых, qDebug - это фантазия:)

В-третьих, вы можете попробовать добавить console к .pro CONFIG, это может сработать.

Ответ 9

В вашем .pro add

CONFIG          += console

Ответ 10

Возможно, это был контроль над другими ответами, или, возможно, это требование, чтобы пользователь действительно нуждался в выводе консоли, но очевидным ответом для меня является создание вторичного окна, которое может быть показано или скрыто (с помощью флажка или кнопка), которая отображает все сообщения, добавляя строки текста в виджет текстового окна и используя это как консоль?

Преимущества такого решения заключаются в следующем:

  • Простое решение (при условии, что все это отображает простой журнал).
  • Возможность подключить виджет "консоль" к главному окну приложения. (В Qt, так или иначе).
  • Возможность создания множества консолей (если более 1 потока и т.д.).
  • Довольно легко перейти от локального консольного вывода к отправке журнала по сети клиенту.

Надеюсь, что это дает вам пищу для размышлений, хотя я никоим образом не могу квалифицировать постулат о том, как вы должны это делать, я могу себе представить, что кто-то из нас может сделать что-то очень мало с поиском/чтением!

Ответ 11

Убедитесь, что Qt5Core.dll находится в одном каталоге с исполняемым программным приложением.

У меня была аналогичная проблема в Qt5 с консольным приложением: если я запускаю приложение из Qt Creator, выходной текст будет виден, если я открываю cmd.exe и запускаю там одно и то же приложение, выход не отображается. Очень странно!

Я решил это, скопировав Qt5Core.dll в каталог с исполняемым приложением.

Вот мое крошечное консольное приложение:

#include <QCoreApplication>
#include <QDebug>

int main(int argc, char *argv[])
{
    int x=343;
    QString str("Hello World");
    qDebug()<< str << x<<"lalalaa";

    QTextStream out(stdout);
    out << "aldfjals alsdfajs...";
}

Ответ 12

Я также играл с этим, обнаружив, что перенаправляющий результат работал, но я никогда не видел вывод в консольное окно, которое присутствует для каждого приложения Windows. Это мое решение до сих пор, пока я не найду замену Qt для ShowWindow и GetConsoleWindow.

Запустите это из командной строки без параметров - получите окно. Запустите из командной строки с параметрами (например, cmd aaa bbb ccc) - вы получите текст в окне командной строки - так же, как вы ожидали бы от любого консольного приложения Windows.

Пожалуйста, извините пример хромой - он представляет собой около 30 минут возиться.

#include "mainwindow.h"
#include <QTextStream>
#include <QCoreApplication>
#include <QApplication>
#include <QWidget>
#include <windows.h>

QT_USE_NAMESPACE

int main(int argc, char *argv[])
{
    if (argc > 1)   {
        // User has specified command-line arguments
        QCoreApplication a(argc, argv);
        QTextStream  out(stdout);
        int     i;

        ShowWindow (GetConsoleWindow(),SW_NORMAL);
        for (i=1; i<argc; i++)
             out << i << ':' << argv [i] << endl;
        out << endl << "Hello, World" << endl;
        out << "Application Directory Path:" << a.applicationDirPath() << endl;
        out << "Application File Path:" << a.applicationFilePath() << endl;
        MessageBox (0,(LPCWSTR)"Continue?",(LPCWSTR)"Silly Question",MB_YESNO);
        return 0;
    } else  {
        QApplication a(argc, argv);
        MainWindow w;

        w.setWindowTitle("Simple example");
        w.show();
        return a.exec();
    }
}

Ответ 13

После довольно продолжительной борьбы с точно такой же проблемой я обнаружил, что просто

CONFIG   += console

действительно делает трюк. Он не будет работать, пока вы явно не сообщите QtCreator о выполнении qmake в проекте (щелкните правой кнопкой мыши по проекту) И измените что-то внутри исходного файла, а затем перестройте. В противном случае компиляция будет пропущена, и вы все равно не увидите вывод в командной строке. Теперь моя программа работает как в режиме графического интерфейса, так и в режиме cmd.

Ответ 14

Легко

Шаг1: Создайте новый проект. Перейти Файл- > Новый файл или проект → Другой проект → Пустой проект

Шаг 2: Используйте приведенный ниже код.

В файле .pro

QT +=widgets
CONFIG += console
TARGET = minimal
SOURCES += \ main.cpp

Шаг 3: Создайте файл main.cpp и скопируйте приведенный ниже код.

#include <QApplication>
#include <QtCore>

using namespace  std;

QTextStream in(stdin);
QTextStream out(stdout);

int main(int argc, char *argv[]){
QApplication app(argc,argv);
qDebug() << "Please enter some text over here: " << endl;
out.flush();
QString input;
input = in.readLine();
out << "The input is " << input  << endl;
return app.exec();
}

Я создал необходимые объекты в коде для вашего понимания.

Просто запустить его

Если вы хотите, чтобы ваша программа получала несколько входов с некоторыми условиями. Затем пропустите приведенный ниже код в Main.cpp

#include <QApplication>
#include <QtCore>

using namespace  std;

QTextStream in(stdin);
QTextStream out(stdout);

int main(int argc, char *argv[]){
    QApplication app(argc,argv);
    qDebug() << "Please enter some text over here: " << endl;
    out.flush();
    QString input;
    do{
        input = in.readLine();
        if(input.size()==6){
            out << "The input is " << input  << endl;   
        }
        else
        {
            qDebug("Not the exact input man");
        }
    }while(!input.size()==0);

    qDebug(" WE ARE AT THE END");

    // endif
    return app.exec();
} // end main

Надеюсь, он вас воспитывает.

Добрый день,

Ответ 15

Прежде всего, вы можете попробовать сбросить буфер

std::cout << "Hello, world!"<<std::endl;

Для большего количества записей на основе Qt вы можете попробовать использовать qDebug.