2010-01-26 5 views
41

У меня есть приложение Qt, и когда я запускаю это приложение, за ним открывается консоль. В разработке хорошо, потому что я вижу отладочные выходы на консоли, но когда я хочу предоставить этот исполняемый файл клиенту, не должно быть консольного окна. Как скрыть это?Скрыть консоль приложения Windows

(Я использую Visual Studio 2008)

+0

Лучший способ сделать проект QT и использовать QVTKWidget , – Orochi

ответ

42

Похоже, что неправильная конфигурация вашего компоновщика. Щелкните правой кнопкой мыши настройки проекта, свойств, компоновщика, системы, подсистемы. Убедитесь, что выбрана «Windows», а не «Консоль».

И, измените main() на WinMain().

+1

, когда я выбираю Windows вместо консоли, я получил ошибку связи – ufukgun

+1

есть ли разница между main() и WinMain()? – ufukgun

+4

Вы также можете установить точку входа проекта в стандартное 'main()' в свойствах -> Linker -> Advanced -> Entry point –

3

Я хотел бы предложить, чтобы проверить наличие следующей строки в файл .pro:

CONFIG += console 

Если вы можете найти его, удалите его! Он должен исправить вашу проблему!

Надеюсь, это поможет!

+0

но visual studio не используется .PRO файл. он просто экспортирует/импортирует этот файл. – ufukgun

+0

Фактический проект Visual Studio создается с использованием параметров конфигурации в файле проекта QMake, поэтому это вполне может быть причиной. – Veeti

+0

Erm, в свойствах VCProj, может быть, перейдя в Links Edition, System и, наконец, подсистему ... Попробуйте поместить значение «Windows (/ SUBSYSTEM: WINDOWS)» ... Я не уверен, что вы можете так сделать tho ... –

4

Может быть лучшим вариантом будет не просто удалить (как это было предложено Энди M), но редактировать * .pro файл, добавив что-то вроде

CONFIG(debug, debug|release) { 
    CONFIG *= console 
} 
else { 
    CONFIG -= console 
} 

В отладки вы можете увидеть окно консоли, но не в релизе. Мне это нравится. =)

9

я использовать этот метод, и он работал

HWND hwnd = GetConsoleWindow(); 
ShowWindow(hwnd, 0); 
+4

Если вы запустите программу из командной строки, командная строка исчезнет. 'FreeConsole' не имеет этой проблемы. – nwp

7

Следующая решение;)

Env: WixXP x64, МСВС 2008, Qt v4.5.3

  1. Set Проекты Настройки/Конфигурация свойства/Linker/System/SubSystem = Windows (/ SUBSYSTEM: WINDOWS)

    Но для x64 есть ссылка г ошибка: LNK2019: неразрешенный внешний символ _WinMain ссылки в функции _WinMainCRTStartup» Чтобы избежать этого

  2. Замените следующий код:

    int main(int argc, char *argv[]) 
    { 
        QApplication app(argc, argv); 
        // your code* 
    } 
    

    по

    int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, char*, int nShowCmd) 
    { 
        int argc = 0; 
        QApplication app(argc, 0); 
    } 
    

Он отлично работает для обеих платформ Win32 и x64.

+0

Этот метод запретит программе получать параметры из командной строки. Очень, очень плохая идея. -1.Если вы хотите сделать это правильно, отметьте строку, которую вы получите fin, третий параметр WinMain. И да, существует множество программ Windows, которые интерпретируют параметры командной строки. Например, контекстное меню «Печать» в проводнике Windows запускает программу с параметрами командной строки. – datenwolf

+0

datenwolf, они все еще там, используя макросы __argv и __argc (по крайней мере, в MSVC) или функцию GetCommandLine/CommandLineToArgv winapi. – Cray

82

В проекте сборки опции компоновщика набор

/SUBSYSTEM:windows 
/ENTRY:mainCRTStartup 

Или использовать следующие #pragma в исходном файле с int main(...)

#pragma comment(linker, "/SUBSYSTEM:windows /ENTRY:mainCRTStartup") 
+2

Имо лучший и точный ответ, касающийся как части подсистемы, так и части входа. Маленький unicode-подсказка: если вы компилируете с помощью unicode и wmain в отличие от основного, комментарий должен быть «/ ENTRY: wmainCRTStartup». – Cray

+0

@Cray: WCHAR не является Unicode. Если вы используете настоящий Юникод с соответствующими библиотеками, такими как ICU, нормальный mainCRTStrartup работает отлично. – datenwolf

+0

Конечно, я говорил о опции компилятора (т. Е. Компилировать с помощью unicode). Они на самом деле называют это «Use Unicode Character Set». – Cray

14

Вы можете избавиться от консоли по телефону:

FreeConsole(); 
+0

Вы уже видели его, так что уже слишком поздно. – Liviu

0

Для этого е вы редактирование .vcxproj напрямую, вы хотите добавить SubSystem со значением Windows к вашим LinkItemDefinitionGroup следующим образом:

<ItemDefinitionGroup> 
    <Link> 
    <SubSystem>Windows</SubSystem> 
    </Link> 
</ItemDefinitionGroup> 
+0

@ anonymous-downvoter Любопытно, почему это получило downvote? Что-нибудь, что я могу улучшить? – Dogmatixed

0

Перейти к: Projects --> Run и снимите флажок Run in terminal

3

Если вы используете Properties- > Linker-> System-> SubSystem | Windows

И получите ошибку компоновщика.

Вы можете посмотреть на Linker-> дополнительно-> Точка входа

и установите значение имени вашего «основного» Funktion.

Это ваша точка входа становится основной, если ваша основная функция является «основной».

-2

Это работает для меня:

CONFIG(debug, debug|release) { 
    CONFIG *= console 
} 
else { 
    CONFIG -= console 
} 

мне нужно запустить ехе контролировать файл с помощью QFileSystemWatcher так что я использовал это:

CONFIG -= console 
Смежные вопросы