为什么我的Qt 4.5应用程序在Windows下打开一个控制台窗口?

Pau*_*xon 31 windows console qt mingw qt-creator

我一直在Linux下玩Qt Creator 4.5.我的应用程序在Linux下构建得很好,但是如果我在Windows中构建,应用程序总是在启动时打开一个控制台窗口.

我可以阻止这样做吗?

我正在使用默认的MinGW设置构建,也许这是相关的.如果需要,我可以使用Visual Studio构建,但我想先了解发生了什么......

编辑:我刚刚在Windows下使用Qt Creator创建了一个简单的测试GUI应用程序,它没有表现出这种行为.由于在linux下创建项目的方式,或者我的应用程序执行了导致控制台窗口出现的内容,因此发生了此行为.我会在诊断时发布详细信息,以防其他人帮助.

Pau*_*xon 17

简短的回答是包括Qt testlib导致控制台出现.删除它会让它消失.

要进一步解释,如果.pro文件将testlib添加到QT,例如

QT += sql \
    webkit \
    network \
    testlib
Run Code Online (Sandbox Code Playgroud)

然后用这样的一行执行最后的链接步骤

g++ -enable-stdcall-fixup 
   -Wl,-enable-auto-import 
   -Wl,-enable-runtime-pseudo-reloc 
   -mthreads 
   -Wl 
   -Wl,-subsystem,console 
   -o debug\MyApp.exe object_script.MyApp.Debug  
   -L"c:\Qt\2009.01\qt\lib"  
   -lglu32 -lgdi32 -luser32 -lQtWebKitd4 -lQtTestd4 
   -lQtSqld4 -lQtGuid4 -lQtNetworkd4 -lQtCored
Run Code Online (Sandbox Code Playgroud)

我们已经使用控制台子系统了!我假设使用testlib强制这种情况发生,以便测试输出有一个地方可以去.

如果我们现在编辑.pro文件并删除对testlib和rebuild的引用,我们会得到一个像这样的链接步骤

g++ -enable-stdcall-fixup 
   -Wl,-enable-auto-import 
   -Wl,-enable-runtime-pseudo-reloc 
   -mthreads 
   -Wl 
   -Wl,-subsystem,windows 
   -o debug\Ammotin.exe object_script.Ammotin.Debug  
   -L"c:\Qt\2009.01\qt\lib" 
   -lglu32 -lgdi32 -luser32 -lmingw32 -lqtmaind -lQtWebKitd4 
   -lQtSqld4  -lQtGuid4 -lQtNetworkd4 -lQtCored4
Run Code Online (Sandbox Code Playgroud)

好极了!子系统是windows,没有更多的控制台窗口.


fbe*_*per 9

我认为这不是这个特定答案的解决方案(除了它是4年后),但我认为很多人登陆这个线程将寻找这个设置:

项目>构建并运行>运行设置>运行> [x]在终端中运行

取消选择它并从QtCreator运行GUI而无需额外的终端窗口.然后,终端输出将嵌入IDE中.


Joh*_*n T 8

您需要确保提供-mwindows开关.

编辑:

或者,您可以进入makefile并将其添加到链接器标志:

-Wl,-subsystem,windows
Run Code Online (Sandbox Code Playgroud)


Lio*_*ion 8

对于那些使用CMake有这个问题的人,我在这里找到了真正的解决方案.由我自己验证.

简而言之,您需要添加WIN32到您的add_executable()语句中:

add_executable(GuiApplication WIN32 src/main.cpp)
Run Code Online (Sandbox Code Playgroud)


blu*_*her 5

确保您的 .pro 文件不会添加console到变量中CONFIG。您可以通过添加来做到这一点

CONFIG -= console
Run Code Online (Sandbox Code Playgroud)

在 .pro 文件末尾的某个位置。每次启动程序时都会弹出if CONFIGcontainsconsole一个窗口,这也用于打印调试输出。因此,添加console在调试程序时很有用。否则,您需要使用DebugView 之类的工具来显示qDebug()调用的输出。