Frage
ich habe eine QMainWindow. Es hat diese Parameter:
this->setWindowFlags(Qt::Tool); this->setFocusPolicy(Qt::StrongFocus); this->setAttribute(Qt::WA_QuitOnClose,true);
Nach dem Showevent Calles mein Fenster wird gezeigt, aber nicht aktiviert. Ich habe versucht, Show-Funktion, um eine Überlastung:
...
QMainWindow::showEvent(event);
this->activateWindow();
...
Aber es hilft mir nicht.
EDIT: Wenn ich kommentierte Zeile
this->setWindowFlags(Qt::Tool);
alles hat gut funktioniert, aber ich brauche in Werkzeug-Flagge. Irgendwelche Ideen?
EDIT:
- OS: Linux
- Programmiersprache: C ++
- Qt-Version: 4.5.1
Lösung
Die Windows-Manager beschließen,
Bevor ich beginne: Wie von elcuco und Javier , Fokus Politik und andere Aspekte des Windows-Layouts (zB in der Titelleiste) gehören zu einem erheblichen erstrecken die jeweiligen Windows-Manager, und Qt möglicherweise begrenzte Kontrolle haben. Um dies zu sehen, schaut nur auf einer Benutzeroberfläche, die einen „ Fokus folgt Maus “-Politik. In diesen Fällen können die Windows-Manager von Qt Fokus Anforderung ignorieren. Aus diesen Gründen fordert die Qt-Dokumentation viele der jeweiligen Flags „Hinweise“. Folglich könnten einige der vorgeschlagenen Lösungen oder möglicherweise nicht für Sie arbeiten.
QApplication :: SetActiveWindow ()
Dies ist nicht auszuhalten, e.tadeu die Lösung zu verwenden QApplication::setActiveWindow()
für Windows und Ubuntu mit Gnome für mich funktioniert. Getestet habe ich es mit dem folgenden Code. Entschuldigt, dass es Python PyQt verwenden (ich benutze Fragen wie diese ein wenig über PyQt zu lernen). Es sollte ziemlich einfach sein, dass Sie es zu lesen und es in C ++ ü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 eine gewisse Handhabung der Nähe Ereignis des testWindow
hinzuzufügen, weil 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 gehe davon aus, dass Sie ein Fenster in Ihrer Anwendung haben, die aktiv ist. Sie können dann mit grabKeyboard()
die Eingabe umleiten. Das Qt::Tool
Fenster wird nicht den Fokus, sondern empfängt die Eingabe. Der folgende Hauptcode zeigt 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_()
Im Grunde genommen, während das Fenster testWindow2
die aktive ist, trat der gesamte Text zeigt in testWindow.textEdit
auf. Es ist nicht schön, ich weiß ...
Erstellen Sie Ihr eigenes Fenster
Sie gewinnen die größte Flexibilität (und schaffen für sich selbst die meiste Arbeit), indem Sie Ihre eigenen Fenster-Layout Ausrollen. Die Idee wird im Folgenden beschrieben FAQ .
Andere "Solutions"
Sie können 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 die Qt-Quellcode hacken. Zum Beispiel auf Windows verwendet Qt das ShowWindow()
Funktion mit einem SW_SHOWNOACTIVATE
Flagge, ein Fenster mit Stil zeigen WS_EX_TOOLWINDOW
, wenn Sie den Qt::Tool
-Flag gesetzt. Sie konnten die SW_SHOWNOACTIVATE
mit leicht ersetzen, was Sie wollen. Linux sollte gleich sein. Offensichtlich auch nicht empfohlen.
Andere Tipps
Versuchen QApplication :: SetActiveWindow ()
zu verwenden,Der ursprüngliche Apfel Human Interface Guidelines (*) sagte, dass Toolbox Fenster sind „immer an der Spitze, aber nie aktiviert“. Er berät auch gegen die Verwendung von Textfeldern auf sie, gerade weil der Mangel an aktivierungszustands Feedback.
Überprüfen Sie, wie andere ‚Toolbox schweren‘ Anwendungen verhalten. Ich schwach daran erinnern, dass zumindest GIMP und InkScape in diesem Aspekt sehr unterschiedlich zu sein scheinen.
Wie elcuco sagte, kann der Fenstermanager tun, was es mit Qt-Flaggen will . Auch wäre es sicher anders sein unter KDE, Gnome, Fluxbox, was auch immer.
(*): großes Dokument! etwas veraltet; aber Toolfenster wurden bereits verwendet und betrachtet
Welches Betriebssystem? Welche Qt4?
Unter Linux Sie sind zum Scheitern verurteilt, kann der Fenstermanager ignorieren, was Sie ihm sagen. Halten Sie es unter Berücksichtigung.
Ist das Gleiche passiert, wenn Sie es gerade eine regelmäßige QWidget machen statt einer QMainWindow?
Auch vielleicht könnten Sie besser, was Effekt, den Sie Qt :: Werkzeug müssen versuchen, zu erreichen durch andere Mittel, wenn das möglich ist?
In Bezug auf Qt :: Werkzeug WindowFlags Qt-Dokumentation zu zitieren
Gibt an, dass das Widget ist ein Werkzeug Fenster. Ein Werkzeugfenster ist oft eine kleine Fenster mit einer kleiner als üblich Titel Bar und Dekoration, für gewöhnlich verwendet Sammlungen von Schaltflächen. Es dort ein Elternteil ist, wird die Werkzeugfenster immer oben drauf gehalten werden. wenn es nicht ein Elternteil ist, können Sie prüfen, unter Verwendung von Qt :: WindowStaysOnTopHint auch. Wenn das Fenstersystem unterstützt es, ein Werkzeug, Fenster können mit einem dekoriert werden etwas leichter Rahmen. Es kann auch sein, kombiniert mit Qt :: FramelessWindowHint
Es scheint den Flags ist ein Problem, und mit Qt :: WindowStaysOnTopHint sollte Ihr Problem lösen.
Just show()
nach setWindowFlags()
nennen.