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
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top