Qt-PopUp Menü erstellen



  • Hallo, ich arbeite mich gerade in QT rein und hab deswegen ein wenig umher programmiert und versuche derzeit ein Menü zu öffnen, wenn ich auf die rechte Mausetaste drücke(bzw. irgendeine Maustaste loslasse, mir gehtserstmal nur um das Menü).

    Dazu hier mein Code:
    Aus dem Widget-Konstruktor:

    this->setContextMenuPolicy(Qt::CustomContextMenu);
        connect(this, SIGNAL(customContextMenuRequested(const QPoint&)),
            this, SLOT(ShowContextMenu(const QPoint&)));
    

    Der Slot:

    void MyWidget::ShowContextMenu(const QPoint& pos) // this is a slot
    {
        // for most widgets
        QPoint globalPos = parent->mapToGlobal(pos);
        // for QAbstractScrollArea and derived classes you would use:
        // QPoint globalPos = myWidget->viewport()->mapToGlobal(pos);
    
        QMenu myMenu;
        myMenu.addAction("Menu Item 1");
        // ...
    
        QAction* selectedItem = myMenu.exec(globalPos);
        if (selectedItem)
        {
            // something was chosen, do stuff
        }
        else
        {
            // nothing was chosen
        }
    
    }
    

    und das emittieren des Signals:

    void MyWidget::mouseReleaseEvent(QMouseEvent *event)
    {
        emit customContextMenuRequested(QPoint(event->x(),event->y()));
    }
    

    Das Widget ist eingebettet in ein MainWindow, falls das relevant ist.

    Das Programm wird kompiliert, jedoch erscheint nach einem Mausklick kein Menü(Rest des Programms funktioniert normal).



  • Hast du mal ein Breakpoint auf dein mouseReleaseEvent gesetzt um zu schauen ob der überhaupt reinspringt?

    void MyWidget::mouseReleaseEvent(QMouseEvent *event)
    {
        emit customContextMenuRequested(QPoint(event->x(),event->y()));
    }
    

    Du könntest doch auch hier schon deinen SLOT aufrufen bzw. den Event-Handler weglassen, durch das customContextPolicy sollte das Programm trotzdem auf ein Rechtsklick reagieren.

    Edit: Hmm probier doch bitte mal dein QMenu vorher im Konstruktor schon zu bauen, verwende dafür Zeiger. Jetzt wo ich nochmal so drüber sehe fällt mir gerade ein das ich mal ein ähnliches Problem hatte. Der Code passt aber du siehst den Kontextmenü nicht bzw. du siehst es, wird aber schnell wieder geschlossen ( weil dein QMenu ein Stack-Objekt ist und beim verlassen des Scopes wieder abgebaut wird - bessert mich bitte wenn ich was falsches erzähle )



  • Hi, danke für deine Hilfe. Ich habe mal einen Breakpoint gesetzt und er springt tatsächlich weder in die Mausfunktion noch in die Menüausführung(hängt ja zusammen, also kein Wunder).
    Dann ist wohl die Maus nicht richtig installiert, ich schau mal.



  • Also, ich habe gelesen, dass es wohl Probleme mit CustomContextMenus gibt, da der Eventhandler da n bisschen rumspinnt.
    Habe jetzt das ganze in der MainWindow Klasse implementiert, also jene dessen child MyWidget ist. Dann öffnet er das Menü im gesamten Fensterbereich ohne das ich ein Mausklickevent oder so hinzufügen muss.
    Vorher hatte ich aber einen seltsamen vt Table bug, wobei ich nicht verstanden habe woher der plötzlich kam.
    Naja, danke 🙂



  • Namenloser342 schrieb:

    Also, ich habe gelesen, dass es wohl Probleme mit CustomContextMenus gibt, da der Eventhandler da n bisschen rumspinnt.

    Hä?!? Totaler Quatsch, sorry... Wenn schon solch abenteuerliche Mutmaßung, dann bitte mit Zitaten (also: links). Ich hatte noch nie Probleme mit dieser Art der Kontextmenü-Erstellung.

    Ich bin mir zu 100% sicher, dass du irgendwo in deinem Code Murks machst (Flags falsch setzt, sonstige Code-Fehler). Deshalb -> SPeck dein Projekt ab, so dass sich ein Beispielprogramm ohne Overhead ergibt, das sich kompilieren lässt und dein Problem zeigt.
    Dass es jetzt mit dem Workaround klappt ist schön für dich. Wenn aber das ContextMenu auf das MyWidget bezogen ist, sollte es auch dort behandelt werden.

    BTW.: Das SIGNAL musst du NATÜRLICH nicht selber emitten, das macht Qt für dich, sobald du rechte Maustaste klickst.

    Vorher hatte ich aber einen seltsamen vt Table bug, wobei ich nicht verstanden habe woher der plötzlich kam.
    Naja, danke 🙂

    So eine Aussage bringt GAR NICHTS, wenn du den genauen Wortlaut der Fehlermeldung verschweigst. Generell passiert dies, wenn virtuelle Funktionen deklariert aber nicht implementiert wurden, z.B. virtueller Destruktor, in Zusammenhang mit Qt passiert das gerne, wenn Q_OBJECT-Makro einer KLasse hinzugefügt wird, dann aber diese nicht durch den moc geht, und entsprechend die Dateien mitkompiliert und gelinkt werden.



  • "
    So eine Aussage bringt GAR NICHTS, wenn du den genauen Wortlaut der Fehlermeldung verschweigst. Generell passiert dies, wenn virtuelle Funktionen deklariert aber nicht implementiert wurden, z.B. virtueller Destruktor, in Zusammenhang mit Qt passiert das gerne, wenn Q_OBJECT-Makro einer KLasse hinzugefügt wird, dann aber diese nicht durch den moc geht, und entsprechend die Dateien mitkompiliert und gelinkt werden."

    natürlich bringt die Zeile gar nichts, aber das liegt daran das es mir nicht um den Grund von einem Fehler liegt den ich schon gelöst habe bzw. umgangen habe.

    "Hä?!? Totaler Quatsch, sorry... Wenn schon solch abenteuerliche Mutmaßung, dann bitte mit Zitaten (also: links). Ich hatte noch nie Probleme mit dieser Art der Kontextmenü-Erstellung. "

    Ich gebe nur wieder was ich gelesen habe. Ich mutmaße da nicht. Wenn du sagst das stimme nicht, dann glaub ich dir mal, war bestimmt eh ne alte Version über die da geredet wurde.


Anmelden zum Antworten