Der Windows-Manager beschließt
Bevor ich beginne: Wie elcuco und Javier wies darauf hin, konzentrieren sich Politik und andere Aspekte des Windows-Layout (zB die Titelleiste) gehört zu einer an die jeweiligen Fenster wesentliche erweitern Manager und Qt möglicherweise eingeschränkte Kontrolle. Sehen Sie sich dazu einfach eine Benutzeroberfläche mit der Richtlinie "focus follows mouse" an. In diesen Fällen ignoriert der Windows-Manager möglicherweise die Fokusanforderung von Qt. Aus diesem Grund ruft die Qt-Dokumentation viele der entsprechenden Flags "Hinweise" auf. Folglich könnten einige der vorgeschlagenen Lösungen für Sie funktionieren oder auch nicht.
QApplication :: SetActiveWindow()
Dies ist nicht auszuhalten, e.tadeu's Lösung QApplication::setActiveWindow()
Arbeiten für mich zu verwenden, für Windows und Ubuntu mit Gnome. Ich habe es mit dem folgenden Code getestet. Entschuldigung, dass Python PyQt benutzt (ich benutze Fragen wie diese, um etwas über PyQt zu lernen). Es sollte ziemlich einfach für Sie sein, es zu lesen und in C++ zu übersetzen.
import sys
from PyQt4 import QtGui
from PyQt4 import QtCore
class MainWindow(QtGui.QMainWindow):
def __init__(self, parent=None):
QtGui.QMainWindow.__init__(self)
# main window
self.setGeometry(300, 300, 250, 150)
self.setWindowTitle('Test')
# text editor
self.textEdit = QtGui.QTextEdit()
self.setCentralWidget(self.textEdit)
def closeEvent(self, event):
QtGui.QApplication.instance().quit()
#main
app = QtGui.QApplication(sys.argv)
testWindow = MainWindow()
testWindow.setWindowFlags(QtCore.Qt.Tool)
testWindow.show()
app.setActiveWindow(testWindow)
app.exec_()
Beachten Sie, dass Sie einigen Umgang mit dem close-Ereignisse der testWindow
hinzuzufügen, da die App nicht automatisch verlassen, wenn Sie ein Qt::Tool
Fenster zu schließen.
Die grabKeyboard() Hack
Wenn dies nicht für Sie arbeiten, den folgenden Hack könnte. Ich nehme an, dass Sie in Ihrer Anwendung ein Fenster haben, das aktiv ist. Sie können dann grabKeyboard()
verwenden, um die Eingabe umzuleiten. Das Qt::Tool
Fenster erhält nicht den Fokus, sondern empfängt die Eingabe. Der folgende Hauptcode demonstriert es (der andere Code bleibt unverändert).
#main
app = QtGui.QApplication(sys.argv)
testWindow = MainWindow()
testWindow.setWindowFlags(QtCore.Qt.Tool)
testWindow2 = MainWindow() # second window which is active
testWindow2.show()
testWindow.show()
testWindow.textEdit.grabKeyboard()
app.exec_()
Grundsätzlich während das Fenster testWindow2
die aktive ist, werden alle eingegebenen Text zeigt in testWindow.textEdit
auf. Es ist nicht schön, ich weiß ...
Ihr eigenes Fenster Erstellen
Sie die größte Flexibilität gewinnen (und die meiste Arbeit für sich selbst erstellen), indem Sie Ihr eigenes Fenster-Layout Ausrollen. Die Idee wird im folgenden beschrieben FAQ.
Andere „Solutions“
Sie könnten die jeweiligen Fenstermanager-API-Funktion direkt aufrufen, das gewünschte Ergebnis (eindeutig gegen die eigentliche Grund für Qt in erster Linie verwendet wird) zu erhalten. Sie könnten auch den Qt-Quellcode hacken.Unter Windows beispielsweise verwendet Qt die ShowWindow()
-Funktion mit einem SW_SHOWNOACTIVATE
-Flag, um ein Fenster mit dem Stil WS_EX_TOOLWINDOW
anzuzeigen, wenn Sie das Flag Qt::Tool
setzen. Sie könnten die SW_SHOWNOACTIVATE
mit allem, was Sie wollen, leicht ersetzen. Linux sollte gleich sein. Klar auch nicht zu empfehlen.
Zusätzliche Informationen zum Posten. – Ockonal