Seite 1 von 1

[gelöst] QtPieMenu (Kontextmenu) crashed

Verfasst: 12. Juni 2010 14:08
von 24dan
Hi habe zwei Widget in denen ich je ein PieMenu erstelle und mit RechtsKlick aufrufe. Beide Widget werden im Hauptprogramm im StackedWidget verwaltet.

Problem:
Im zweiten Widget stürzt meine Anwendung ab wenn ich nach Öffnen des PieMenu´s mit einem Klick ausserhalb des PieMenu dieses nur Schliessen möchte.

Hier mal die Quelltextausschnitte:

Widget1 *.h

Code: Alles auswählen

#include "src/menu/qtpiemenu.h"

class texteingabe : public QWidget {
    Q_OBJECT
	
protected:
    void pieMenu();
    void mousePressEvent(QMouseEvent *e);

public slots:
    void dummy();
	
private:
    //! PieMenu
    QtPieMenu *p;
    QtPieMenu *menuNavi;
Widget1 *.cpp

Code: Alles auswählen

#include "src/menu/qtpiemenu.h"
#include "src/menu/qtpieitem.h"

void texteingabe::pieMenu()
{
    p = new QtPieMenu("Root menu", this, "Root menu",15,130);
    p->insertItem(QIcon(QPixmap(":/iconAll/images/iconAll/auswertung.png")),
                  tr("Auswerten"),
                  this,
                  SLOT(dummy()));

    menuNavi = new QtPieMenu(QIcon(QPixmap(":/iconSet1/images/iconset1/navigation.png")),
                         tr(" Navi"),p,"Navigation",25,180);
    menuNavi->insertItem(QIcon(QPixmap(":/iconSet1/images/iconset1/text_eingeben.png")),
                         tr(" Eingabe"),this,SLOT(dummy()));
    p->insertItem(menuNavi);
}

void texteingabe::dummy(){}

void texteingabe::mousePressEvent(QMouseEvent *e)
{
    if ( e->button() & Qt::RightButton ) {
            pieMenu();
            p->popup(e->globalPos());
            return;
    }
    this->mousePressEvent( e );
}
Widget2 *.h

Code: Alles auswählen

#include "src/menu/qtpiemenu.h"

class konfiguration : public QWidget {
    Q_OBJECT
	
protected:
    void pieMenu();
    void mousePressEvent(QMouseEvent *e);

public slots:
    void dummy2();
	
private:
    //! PieMenu
    QtPieMenu *p;
    QtPieMenu *menuNavi;
Widget2 *.cpp

Code: Alles auswählen

#include "src/menu/qtpiemenu.h"
#include "src/menu/qtpieitem.h"

void konfiguration::pieMenu()
{
    p = new QtPieMenu("Root menu", this, "Root menu",15,130);
   p->insertItem(QIcon(QPixmap(":/iconSet1/images/iconset1/ausgabe_konfig.png")),
                  tr(" Auswertung"),
                  this,
                  SLOT(dummy2()));

    menuNavi = new QtPieMenu(QIcon(QPixmap(":/iconSet1/images/iconset1/navigation.png")),
                         tr(" Navi"),p,"Navigation",25,180);
    menuNavi->insertItem(QIcon(QPixmap(":/iconSet1/images/iconset1/text_eingeben.png")),
                         tr(" Eingabe"),this,SLOT(dummy2()));
    p->insertItem(menuNavi);
}

void konfiguration::dummy2(){}

void konfiguration::mousePressEvent(QMouseEvent *e)
{
    if ( e->button() & Qt::RightButton ) {
            pieMenu();
            p->popup(e->globalPos());
            return;
    }
    this->mousePressEvent( e );
}

:cry:

Verfasst: 12. Juni 2010 14:16
von 24dan
Okay ick nix verstehen....

Ich habe offensichtlich kein Problem mit QtPieMenu sondern mit meinem mit abgefangenen Qt::LeftButton MousePressedEvent.

folgende Ergänzung im obrigen Quelltext von Widget2 löste mein Problem:

Code: Alles auswählen

void konfiguration::mousePressEvent(QMouseEvent *e)
{
    if ( e->button() & Qt::RightButton ) {
            pieMenu();
            p->popup(e->globalPos());
            return;
    }
    if(e->button() & Qt::LeftButton)
        return;
    this->mousePressEvent( e );
}
:P

Verfasst: 12. Juni 2010 16:49
von solarix
folgende Ergänzung im obrigen Quelltext von Widget2 löste mein Problem:
Falsch: wenn die mittlere Maustaste gedrückt wird crashed dein Programm schon wieder..

Verfasst: 12. Juni 2010 23:41
von 24dan
Ha erwischt ... danke
so sollte es besser sein.

Code: Alles auswählen

void texteingabe::mousePressEvent(QMouseEvent *e)
{
    if ( e->button() & Qt::RightButton ) {
            pieMenu();
            p->popup(e->globalPos());
            return;
    }
    if ( e->button() & Qt::LeftButton ) return;
    if ( e->button() & Qt::MidButton ) return;
    this->mousePressEvent( e );
}

Verfasst: 13. Juni 2010 07:55
von franzf
Es gibt immer noch 3 weitere Buttons die du abfragen musst, um den Crash zu verhindern.
Bist du dir im Klaren darüber, was den Crash auslöst? Nichtterminierende Rekursion :P
Sobald ein Button ankommt, den du nicht selber abfängst, läufst du in die letzte Zeile, welche mit dem selben event (und damit Button) deine selbe texteingabe::mousePressEvent() aufruft. Und das macht irgendwann BUMM (Stackoverflow).

Du willst nämlich entweder nach deinem if ein allgemeines else, in dem ein return steht, oder eben gleich die Implementierung der Basisklasse aufrufen, was eigentlich normalerweise gemacht wird.

Code: Alles auswählen

void texteingabe::mousePressEvent(QMouseEvent *e)
{
    if ( e->button() & Qt::RightButton ) {
            pieMenu();
            p->popup(e->globalPos());
            return;
    }
    QWidget::mousePressEvent( e );
}
Wenn du nämlich deine "Lösung" auf etwas wie keyPressEVent() anwendest wird dein Code so lang, dass er nicht mehr in deinen Editor passt :P
Schau dir auch unbedingt mal QWidget::contextMenuPolicy an. Am einfachsten implementierst du QWidget::contextMenuEvent.

Verfasst: 13. Juni 2010 11:39
von 24dan
Oh je... was soll das bloss werden.
Ja ich bin froh, dass ich das nicht hauptberuflich mache.....
Manchmal bin ich mir wirklich nicht bewusst was ich da eigentlich mache.....

Was ist der Unterschied zwischen QWidget::mouse... und this->mouse...? :oops:

Klar ist das this sich auf genau diese Funktion dieser Klasse bezieht.
QWidget gibt das Event auch weiter an die anderen Klassen????

Verfasst: 13. Juni 2010 14:51
von franzf
24dan hat geschrieben:Was ist der Unterschied zwischen QWidget::mouse... und this->mouse...? :oops:
:: ist der Scope-Operator (google/Buch nachschlagen/...).
QWidget::mousePressEvent(e); ruft die Implementierung des mousePressEvent aus QWidget auf -> keine Rekursion (außer QWidget::mousePressEvent() baut selber eine :P). this->mousePressEvent(e); hingegen ruft die Implementierung deiner Klasse auf -> Rekursion.