-
Suggestion
-
Resolution: Done
-
Not Evaluated
-
None
-
5.0.0
-
None
Feature
Right now Qt has no API to bring the current application to the foreground.
Use case
When debugging with Qt Creator, the app being debugged (the debuggee) usually has focus. But as soon as we hit a breakpoint, the app stops, and Qt Creator should become active/move to the foreground.
Related
The documentation seems to indicate that QWidget::activateWindow() does exactly this. However, at least on kwin it doesnt work as expected (also together with raise()).
The other option is to use Qt::WindowStaysOnTopHint , but that prevents the user to change the order later on.
Possible implementation
Right now we're using following snippet:
void AppMainWindow::raiseWindow()
{
setWindowState(windowState() & ~Qt::WindowMinimized);
activateWindow();
raise();
// force window to the top
#ifdef Q_OS_WIN
WId winId = winId();
DWORD foregroundPId = GetWindowThreadProcessId(GetForegroundWindow(), NULL);
DWORD myPId = GetWindowThreadProcessId(winId, NULL);
if (foregroundPId != myPId) {
AttachThreadInput(foregroundPId, myPId, true);
BringWindowToTop(winId);
AttachThreadInput(foregroundPId, myPId, false);
}
#elif defined(Q_WS_X11)
XEvent xev;
xev.xclient.type = ClientMessage;
xev.xclient.message_type = XInternAtom(QX11Info::display(), "_NET_ACTIVE_WINDOW", 1);
xev.xclient.display = QX11Info::display();
xev.xclient.window = winId();
xev.xclient.format = 32;
xev.xclient.data.l[0] = 2; // from pager/user
xev.xclient.data.l[1] = QX11Info::appTime();
xev.xclient.data.l[2] = 0; // currently active window
xev.xclient.data.l[3] = 0; // unused
xev.xclient.data.l[4] = 0; // unused
XSendEvent(QX11Info::display(), QX11Info::appRootWindow(x11Info().screen()), False,
SubstructureRedirectMask | SubstructureNotifyMask, &xev);
#endif
}
- relates to
-
QTBUG-37435 Windows: SetForegroundWindow() does not activate application
-
- Closed
-