2009-04-17 10 views
26

Ho giocato con Qt Creator 4.5 su Linux. La mia applicazione si basa bene su Linux, ma se costruisco in Windows, l'app apre sempre una finestra di console all'avvio.Perché la mia app Qt 4.5 apre una finestra della console sotto Windows?

Posso smettere di farlo?

Sto costruendo utilizzando l'impostazione MinGW predefinita, forse quella relativa. Se necessario, posso creare con Visual Studio, ma mi piacerebbe capire cosa sta succedendo prima ...

Modifica: Ho appena creato una semplice applicazione di GUI di test con Qt Creator in Windows e non esibire questo comportamento. O questo comportamento si è verificato a causa del modo in cui il progetto è stato creato sotto Linux, o c'è qualcosa che fa la mia app che fa apparire la finestra della console. Pubblicherò i dettagli quando lo diagnostico nel caso in cui aiuti qualcun altro.

risposta

17

La risposta breve è che includendo il test QT fa apparire la console. Rimozione lo fa andare via.

Per ulteriori informazioni, se il file .pro aggiunge testlib a QT, ad es.

QT += sql \ 
    webkit \ 
    network \ 
    testlib 

allora il passo ultimo anello viene effettuato con una linea come questa

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 

Abbiamo ritrovati a utilizzare il sottosistema di console! Presumo che usando le forze testlib questo avvenga in modo che l'output del test abbia qualcosa da fare.

Se ora modificare il file .pro e rimuovere il riferimento al TESTLIB e ricostruire, otteniamo un passo link come questo

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 

Yay! il sottosistema è Windows, non c'è più la finestra della console.

+1

Ciao, non ho 'testlib' nel mio .pro, e ho lo stesso problema –

+1

Questo flag ha funzionato in Qt 5.7' QT.testlib.CONFIG - = console' Ma questo 'CONFIG - = console' non funziona. – CroCo

7

È necessario assicurarsi che l'opzione -mwindows sia disponibile.

Edit:

In alternativa, si può andare in makefile e aggiungere questo ai vostri bandiere linker:

-Wl,-subsystem,windows 
+0

È qualcosa che posso impostare in Qt Creator? –

+0

sì, leggi anche la mia modifica –

+0

Sarebbe utile mostrare le bandiere effettive. – CroCo

3

Suona come le impostazioni del linker sono impostate per una console app. Potresti provare a impostare il linker per usare l'opzione/subsystem: windows. L'opzione per le applicazioni della console è/subsystem: console. Se si crea il progetto in Visual Studio, creare un progetto Win32. Non creare un'app Console Win32. L'opzione sotto Visual Studio per l'impostazione del sottosistema si trova in Impostazioni progetto-> Linker-> Sistema-> Sottosistema. Seleziona Windows (/ sottosistema: windows).

Ho dato un'occhiata a come fare questo con MinGW/gcc. I documenti online per gcc mostrano le diverse opzioni per le destinazioni di Windows. Come altri hanno affermato, l'opzione che stai cercando è -mwindows. L'opzione -mwindows crea un'applicazione con finestre. Sembra che la tua attuale impostazione sia -mconsole. L'opzione -mconsole produce un'app console. Questa è un'opzione di linker. Non ho familiarità con Qt Creator, ma suppongo che abbia un modo simile per visualizzare le impostazioni del progetto come Visual Studio.

+0

Queste opzioni sono per il linker Microsoft. – zooropa

+0

Sì, mi piacerebbe capire perché questo si verifica utilizzando Mingw però. –

0

Per impostazione predefinita, il linker presuppone che si desideri un'applicazione console.

La correzione consiste nell'aggiungere "-mwindows" all'elenco degli argomenti del compilatore e questo aggiungerà anche invisibilmente le librerie richieste (-lkernel32, -lgdi32, ecc.). Probabilmente dovrai passare da main() a WinMain() come punto di ingresso.

RE: il tuo Edit: il sistema di generazione Qt utilizza i file "spec" per aggiungere variabili, puoi trovarle in $ QTDIR/qt/mkspecs. Quando crei una nuova app Windows in QCreator, imposta la specifica predefinita su "win32-g ++", che imposta automaticamente le variabili corrette (app per Windows, flag di linker, ecc.).

Quando hai fatto il progetto sotto Linux, ha usato un'altra specifica e questo ha causato il tuo problema. Puoi vedere le specifiche attuali nel file "tuoproject.pro.user".

+0

Non si chiama il punto di ingresso WinMain in una app Qt –

+0

OK, non sono così familiare con Qt. Un WinMain è richiesto per le applicazioni GUI in Windows, quindi il framework implementa probabilmente WinMain() e chiama il main() dietro le quinte. Il resto del post è, tuttavia. –

4

Assicurarsi che il file .pro non aggiunga console alla variabile CONFIG. Puoi farlo aggiungendo

CONFIG -= console 

da qualche parte alla fine del tuo file .pro.Se CONFIG contiene console, viene visualizzata una finestra ogni volta che si avvia il programma e questo viene anche utilizzato quando si stampa l'output di debug. Pertanto, l'aggiunta di console può essere utile durante il debug di un programma. Altrimenti dovresti usare strumenti come DebugView per mostrare l'output delle chiamate qDebug().

+0

non funziona .... – CroCo

0

Qt/2009,05/qt/mkspecs/win32-g ++
modifica file qmake.conf
modificano linea
QMAKE_LFLAGS_CONSOLE = -Wl, -subsyetem, console
a
QMAKE_LFLAGS_CONSOLE = -Wl, -subsyetem, finestre

e modificare il ???. file di pro (ad esempio aggiungere una nuova riga o spazio)
e la compilazione di
`s lavorando ok

2

Io uso cmake invece di qmake. Ho usato set (CMAKE_CXX_FLAGS "-mwindows") sembra come se QMAKE_CXXFLAGS + = - mwindows nel tuo file .pro farebbe lo stesso.

+1

Funziona con una toolchain gcc, ma che ne è dell'utilizzo del compilatore MSVC? (dice "opzione sconosciuta -mindows"). –

7

Penso che questa non è una soluzione per questa risposta specifica (inoltre è 4 anni più tardi), ma penso che molte persone che atterrano in questa discussione sarà alla ricerca di questa impostazione:

Progetti> Crea ed Esegui> Esegui Impostazioni> Esegui>[x] Esegui nel terminale

Deseleziona ed esegui la GUI da QtCreator senza una finestra di Terminale aggiuntiva. L'output del terminale verrà quindi incorporato nell'IDE.

+0

Grazie, questo è ciò che ha risolto per me. –

+0

Sono contento che abbia aiutato qualcuno :) – fbeeper

+0

proprio quello di cui avevo bisogno. Grazie. –

1

Vai a: Projects --> Run e deselezionare Run in terminal casella

1

Per chi giunge qui tramite i motori di ricerca come me, ho trovato la vera soluzione here. Verificato da me stesso

In breve, è necessario aggiungere "WIN32" alle istruzioni add_executable().

add_executable(
    GuiApplication 

    WIN32 

    src/main.cpp 
)