Seite 1 von 1
[solved] Mac: MenuBar im FullScreen-Modus nervt
Verfasst: 27. Oktober 2008 00:00
von phil collins
Hi.
Ich habe eine Qt-Anwendung für OSX, die im FullScreen-Modus läuft. Leider nervt mich dabei, dass sich ständig die native Menuleiste einblendet, wenn ich mit der Maus den oberen Bildrand berühre. Hat jemand eine Idee, wie ich dieses Verhalten unterdrücken kann?
Verfasst: 31. Oktober 2008 10:28
von phil collins
Ok, nach einem mehr oder weniger ausführlichen Studium der qapplication_mac.cpp bin ich jetzt etwas schlauer: Die QApplication filtert MouseMove-Events raus, deren vertikale Position des Mauszeigers = 0 ist. Anstatt das Carbon-Event in das entsprechende QMouseEvent zu konvertieren ruft QApplication an dieser Stelle ShowMenuBar() auf.
Um das zu umgehen, schreibt man am besten eine eigene QApplication und überläd die virtuelle Funktion filterMacEvent().
Code: Alles auswählen
#include <QApplication>
#include <QMouseEvent>
#include <QWidget>
#include <Carbon/Carbon.h>
class App : public QApplication
{
public:
App(int argc, char** argv) :
QApplication(argc, argv)
{}
bool macEventFilter(EventHandlerCallRef /*caller*/, EventRef event) {
UInt32 ekind = GetEventKind(event);
UInt32 eclass = GetEventClass(event);
if(eclass == kEventClassMouse && ekind == kEventMouseMoved) {
Point p;
GetEventParameter(event, kEventParamMouseLocation, typeQDPoint, NULL, sizeof(p), NULL, &p);
if(p.v == 0 && activeWindow()) {
postEvent(activeWindow(), new QMouseEvent(QEvent::MouseMove, QPoint(p.h, p.v),
Qt::NoButton, Qt::NoButton, Qt::NoModifier));
return true;
}
}
return false;
}
};
int main(int argc, char **argv) {
App app(argc, argv);
QWidget w;
w.showFullScreen();
w.raise();
return app.exec();
}
Das funktioniert, rockt, und meine FullScreen-App ist endlich wieder glücklich!!!
