2009-06-27 5 views
13

Ich habe ein QMainWindow. Es hat diese Parameter:Fenster aktivieren

this->setWindowFlags(Qt::Tool); 
this->setFocusPolicy(Qt::StrongFocus); 
this->setAttribute(Qt::WA_QuitOnClose,true); 

Nach Showevent meinem Fenster Calles gezeigt ist, aber nicht aktiviert. Ich habe versucht, Show-Funktion zu überlasten:

...  
QMainWindow::showEvent(event); 
this->activateWindow(); 
... 

Aber es hilft mir nicht.

EDIT: Wenn ich kommentierte Linie

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

Antwort

13

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.

1

Welches Betriebssystem? Welches Qt4?

Unter Linux sind Sie verloren, der Fenstermanager kann ignorieren, was Sie ihm sagen. Halte es in Betracht.

+0

Zusätzliche Informationen zum Posten. – Ockonal

0

Findet dasselbe statt, wenn Sie es nur zu einem normalen QWidget anstelle eines QMainWindow machen?

Vielleicht könnten Sie auch besser versuchen, den Effekt zu erreichen, den Sie brauchen Qt :: Tool für andere Mittel, wenn das möglich ist?

3

Try QApplication :: SetActiveWindow()

4

Der ursprüngliche Apfel Human Interface Guidelines (*) sagte zu verwenden, die Toolbox Fenster sind "immer an der Spitze, aber nie aktiviert". Es rät auch davon ab, Textfelder auf ihnen zu verwenden, gerade weil es keine Aktivierungszustandsrückmeldung gibt.

Überprüfen Sie, wie sich andere "toolbox heavy" -Apps verhalten. Ich erinnere mich schwach daran, dass zumindest GIMP und InkScape in diesem Aspekt sehr unterschiedlich aussehen.

Wie elcuco gesagt, kann der Window Manager tun, was er will mit Qt Flags. Auch wäre es unter KDE, Gnome, Fluxbox, was auch immer anders.

(*): großes Dokument! etwas veraltet; aber Toolfenster wurden bereits verwendet und als

0

In Bezug auf Qt :: Werkzeug WindowFlags Qt zu zitieren Dokumentation

Zeigt an, dass das Widget ein Werkzeug Fenster ist. Ein Werkzeugfenster ist oft ein kleines Fenster mit einem kleineren als normalen Titel Stab und Dekoration, typischerweise für Sammlungen von Werkzeugknöpfen verwendet. Dort ist ein Elternteil, das Werkzeugfenster wird immer oben drauf gehalten.Wenn kein übergeordnetes Element ist, können Sie auch Qt :: WindowStaysOnTopHint verwenden. Wenn das Fenstersystem unterstützt, kann ein Werkzeug Fenster mit einem etwas helleren Rahmen mit einem dekoriert werden. Es kann auch sein mit Qt :: FramelessWindowHint kombiniert

Es scheint, die Flaggen ist ein Problem, und mit Qt :: WindowStaysOnTopHint sollte Ihr Problem lösen.

0

Rufen Sie einfach show() nach setWindowFlags().