Qt Creator: application output in a separate window, instead of the output pane?
-
When using Qt Creator, I'd like to be able to have my application's output appear in a separate window form the main Qt Creator window, instead of the "Application Output" pane that is always anchored to the bottom of the main window. This will help me better utilize all of my available screen real estate. Is there any way to do this?
In case there are platform specific solutions, I'm running OS X. However if there's a cross-platform solution that would be great too.
-
Hi,
What about the "Run in Terminal" option in the Project panel under Run ?
-
@SGaist It's a bit inconvenient because it causes a new terminal window to open every time. I'd prefer to have just one window that all of my app's output goes to so I can place it in a specific spot.
I see that, behind the scenes, Qt Creator is calling a bash script that executes some AppleScript to get the terminal window to open. I may try tinkering with it to see if I can get it to behave how I want, but it'd be much more convenient if Qt Creator allowed breaking off the Application Output (and the issues section now that I think about it) into its own floating window so that I can make full use of the vertical real estate of my screen.
-
There is a task for this in Jira: https://bugreports.qt.io/browse/QTCREATORBUG-9488
If you want this feature, please REGISTER THERE AND VOTE FOR IT!
-
@Guy-Gizmo hi
you can use qInstallMessageHandler to do whatever you need with the application output -
Wasn't expecting this thread to get resurrected! I'm glad to see there's a feature I can vote for to have this ability added to Qt Creator.
I've dealt with this in the meantime by enabling "run in terminal" in all of my project's run settings and then setting my terminal in Preferences > Environment > System > Terminal to a custom script that uses whichever terminal window is the closest to the lower right corner of my desktop. (That's where I want my program output to go.) This lets me effectively have it be in a separate window from Qt Creator that I can position wherever I like.
I'm running macOS so my solution only works for that, but in case anyone wants it, here's the script I'm using to do the above in iTerm2:
#! /bin/bash # ugly escaping: for apple script \ and " need to be escaped, whereas %q takes care of all bash escaping declare -a args mydir=`pwd` mydir=$(printf '%q' "$mydir") mydir="${mydir//\\/\\\\}" args[0]="bribriSaveDir=\`pwd\`; cd ${mydir//\"/\\\"}; " # args[0]="cd ${mydir//\"/\\\"};" for a in "$@" ; do x=$(printf '%q ' "$a") x="${x//\\/\\\\}" args[${#args[@]}]="${x//\"/\\\"}" done args+=('; cd ${bribriSaveDir}') mArgs=${args[@]:0} osascript <<EOF tell application "System Events" to set terminalRunning to exists process "iTerm2" if not terminalRunning then tell application "iTerm" activate repeat while the (count of the windows) = 0 delay 0.1 end repeat end tell end if set exec to "$mArgs" tell application "iTerm" set theWindows to {} repeat with i from 1 to the count of the windows if (is hotkey window of window i) = false and (is at shell prompt of current session of window i) = true then copy window i to the end of theWindows end if end repeat if (count of theWindows) = 0 then set newWindow to create window with default profile tell current session of newWindow to write text exec with newline else set currentWin to window 1 set currentDistance to 0 repeat with i from 1 to the count of theWindows set theWindow to item i of theWindows set bb to bounds of theWindow set x to (item 3 of bb) set y to (item 4 of bb) set dist to x * x + y * y if dist > currentDistance then set currentWin to theWindow set currentDistance to dist end if end repeat tell current session of currentWin to write text exec with newline end if end tell EOF
The criteria for which window it selects can be adjusted by changing the interior of the
repeat with i from 1 to the count of theWindows
loop. Whichever windowcurrentWin
gets assigned to will be the one that Qt Creator runs the app in.I also got annoyed with the way that you have to press enter in the terminal window after the program I'm running in Qt Creator exits, since that doesn't really make sense to do if you're reusing the same terminal window over and over again. So I downloaded the source to Qt Creator and made a small modification to the
qtcreator_process_stub
tool it includes (which is the little executable that communicates with Qt Creator and manages running your app in a terminal window) so that it doesn't do that any longer, and it prints the return code of my program since I find it's useful to know precisely when it's terminated and how. Each time I update Qt Creator I just copy my version ofqtcreator_process_stub
into its application bundle to get the behavior I want. So far there hasn't been any changes toqtcreator_process_stub
in several versions so it's been fine to just keep copying in my version of it.Here's a diff of the changes I made to it, at least for the unix / macOS side of things. I imagine it'd be easy to do something similar on Windows:
--- a/src/libs/utils/process_stub_unix.c +++ b/src/libs/utils/process_stub_unix.c @@ -70,8 +70,8 @@ static volatile int chldPid; static void __attribute__((noreturn)) doExit(int code) { tcsetpgrp(0, getpid()); - puts(sleepMsg); - fgets(sleepMsg, 2, stdin); /* Minimal size to make it wait */ + //puts(sleepMsg); + //fgets(sleepMsg, 2, stdin); /* Minimal size to make it wait */ exit(code); } @@ -163,9 +163,11 @@ static void sigchldHandler(int sig) } } sendMsg("exit %d\n", WEXITSTATUS(chldStatus)); + printf("\nExited with status %d\n", chldStatus >> 8); doExit(0); } else { sendMsg("crash %d\n", WTERMSIG(chldStatus)); + printf("\nExited with status %d\n", chldStatus >> 8); doExit(0); } } @@ -180,7 +182,8 @@ int main(int argc, char *argv[]) char **env = 0; struct sockaddr_un sau; struct sigaction act; + printf("\n"); memset(&act, 0, sizeof(act)); if (argc < ArgEnv) {
I figured I'd post all that stuff just in case someone else finds it useful. I definitely appreciate that Qt Creator is open source so I can make little modifications to it like this.
-
Hello from the future. 5 years later and still not a feature, but here's a ugly workaround I have been using to some degree of satisfaction:
- On the main Qt Creator window:
- pull up the bottom panel divider all the way up covering as much of the window as possible
- select
<no document>
- open a new window(s) form the "split" icon, and use that as the main editor window
This way, I have a window just for the output separated from the code editing.
Anyway, not pretty, but gets the job done.
- On the main Qt Creator window: