2016-07-06 16 views
0

Es gibt eine Funktion in Windows: Wenn das aktuelle Fenster nicht aktiviert ist, sieht das Hauptmenü dieses Fensters deaktiviert aus (aber in Wirklichkeit ist es nur ausgegraut, so dass Sie auf ein Element in diesem Menü klicken können). Es ist in Ordnung, wenn Sie zu einem anderen Programm wechseln, aber es sieht falsch aus, wenn Sie in das untergeordnete Fenster wechseln.Wie kann ich das graue Fenster des Hauptfensters nach Aktivierung des untergeordneten Fensters nicht mehr anzeigen?

Es ist einfach, diesen Effekt auch bei Standard-Editor zu reproduzieren:

  • Setzen Sie einen beliebigen Text in es,
  • Press Ctrl + F,
  • Jetzt können Sie diese Hauptmenü sehen sieht deaktiviert aus, aber Sie können auf ein beliebiges Element klicken.

Main menu looks disabled

Die Frage ist folgende: Wie dieser Effekt nur für mein Programm zu blockieren? In meinem Programm (C++ und Qt) habe ich alle Elemente im Hauptmenü, wenn Benutzer in untergeordnete Fenster wechselt. Gibt es eine Möglichkeit, damit aufzuhören?

Ich gebe hier keinen Code ein, weil dieser in den meisten Programmen reproduzierbar ist. Aber ich hoffe, dass es möglich ist, Flags/Eigenschaften meines QMenu oder QMenuBar zu ändern, um dieses Verhalten zu korrigieren. Ist es möglich?

+1

Was tatsächlich geschieht, ist, dass, wenn ein Fenster hat nicht den Eingabefokus, sein Menü ist grau dargestellt, als wäre es deaktiviert. Es gibt keine Möglichkeit, das Menü aufzurufen, ohne den Eingabefokus auf das Fenster zu setzen. Wenn Sie auf einen Menüpunkt klicken, wird der Eingabefokus auf das Fenster gesetzt (der Fokus wird aus dem Popup-Dialog entfernt), weshalb die Menüpunkte wieder als aktiviert markiert werden. Wenn Sie auf einen Menüeintrag klicken und zweimal Esc drücken, um das Menü zu schließen, werden Sie feststellen, dass das Fenster mit dem Menü fokussiert bleibt. Alles, was Sie getan haben, ist, den Fokus durch Klicken zu ändern! –

+1

Es gibt nicht viel, was Sie über die Funktionsweise der integrierten Menüunterstützung tun können. Es ist nicht unangemessen, sie funktionieren nicht, wenn Sie die Tastatur verwenden, um Menüeinträge auszuwählen. Wenn Sie die Alt-Taste drücken, werden die Cues nicht angezeigt und Alt + F wählt nicht File. Modale Dialoge sind im Allgemeinen eher ein Usability-Kopfschmerz. –

+0

@HansPassant Ja, danke, ich stimme absolut zu, dass es seltsam ist, das Menü als aktiv zu zeigen, wenn die Alt-Taste nicht funktioniert (d. H. Wenn dieses Menü nicht aktiv ist). Aber es war was der Kunde braucht. Manchmal müssen wir solche Dinge tun. – Ilya

Antwort

0

Wir können eine Palette der QMenuBar korrigieren, um eine Textfarbe im inaktiven Zustand durch Textfarbe im aktiven Zustand zu ersetzen.

Der Code:

QPalette pal = pMenuBar->palette(); 
QColor col = pal.color(QPalette::Active, QPalette::ButtonText); 
pal.setColor(QPalette::Inactive, QPalette::ButtonText, col); 
pMenuBar->setPalette(pal); 

Nachdem Benutzer nicht Vergrauung aus der Elemente in einem Hauptmenü sehen, weil die Textfarben der aktiven und inaktiven Elemente werden die gleichen sein.

(Theoretisch ist es möglich, dass die Hintergrundfarbe der aktiven und inaktiven Zuständen des gleichen Elements unterschiedlich sind. So ist es reasanoble sein könnte, die gleiche Ersatz für den Hintergrund zu machen)

+0

Ich wollte fragen, wie das wohl funktionieren könnte, wenn Sie keinen palettierten Farbmodus verwenden (was Sie sicher nicht sind). Aber dann habe ich die Dokumentation für QPalette nachgeschlagen und herausgefunden, dass das ein Qt-spezifischer Unsinn ist. "Alle Widgets in Qt enthalten eine Palette und verwenden ihre Palette, um sich selbst zu zeichnen."Richtig, weil nichts in Qt eigentlich eine native Kontrolle ist, weshalb die Bibliothek kaputt ist und die Anwendungen, die sie erzeugt, beschissen sind, und warum Sie bei der Verwendung von Qt um Ratschläge für Windows-Programmierung bitten, ist ein bisschen wie ein Crapshoot Von Ihren Screenshots haben Sie Win32 verwendet .. –

+0

Denken Sie auch daran, dass Kunden * typischerweise * denken, dass sie Dinge wollen, aber es ist Ihre Aufgabe als angestellter Experte, ihnen zu erklären, warum das, was sie denken, keinen Sinn ergibt Der Zweck von Hans und meinen Kommentaren war es, Ihnen genug zu erklären, damit Sie es ihnen erklären können. Manchmal werden Programmierer verwirrt und denken, dass es ihre einzige Aufgabe ist, genau das zu tun, was der Klient will. Aber wir sind keine ausgebildeten Affen. Wir werden angeheuert, um zu denken und zu entwerfen, weil wir wissen, was wir tun.Wenn Sie etwas an einen Kunden versenden, der verwirrend oder unbrauchbar ist, haben Sie jedes Recht, Ihnen die Schuld zu geben. –

+0

@CodyGray Vielen Dank! – Ilya