[gelöst] Speicherauslastung steigt bei benutzung von PieMenü

Alles rund um die Programmierung mit Qt
Antworten
24dan
Beiträge: 274
Registriert: 26. Juni 2006 14:15
Wohnort: Hamburg

[gelöst] Speicherauslastung steigt bei benutzung von PieMenü

Beitrag von 24dan »

Hallo ich habe mir in meine Anwendung ein "KuckucksEi" gebaut....
so zumindestens scheint es mir wenn ich das Problem nicht behoben bekomme.

Ich habe ein PieMenü eingebaut und bei jedem Aufruf des Menüs steigt die Speicherauslastung (Im Taskmanager gut zu sehen) für mein Programm um ca. 1MB.

Hier mal die Methode zum Aufruf:

h

Code: Alles auswählen

protected:
    void pieMenu();
    void mousePressEvent(QMouseEvent *e);


public slots:
    //! PieMenu
    void noAction();
    void starteAuswahl();
    
private:
    konfiguration *style;

    //! Auswertung gelaufen
    bool b_auswertung_fertig;
    //! PieMenu
    QtPieMenu *p;
    QtPieMenu *menuNavi;
cpp mit eigenem rechtsklick mouse Event

Code: Alles auswählen

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

void ausgabetext::pieMenu()
{
    p = new QtPieMenu("Root menu", this, "Root menu",15,140);
    style = new konfiguration();
    p->setStyleSheet(style->styleMenu());

    p->insertItem(QIcon(QPixmap(":/iconSet1/images/iconset1/text_waehlen.png")),
                  tr(" Sortierung"),
                  this,
                  SLOT(starteAuswahl()));

    p->insertItem(QIcon(QPixmap(":/iconAll/images/iconAll/auswertung.png")),
                  tr(" Auswertung"),
                  this,
                  SIGNAL(auswerten()));
    if(ui->textEdit->toPlainText().contains("1:"))p->setItemEnabled(false,1);
    else p->setItemEnabled(true,1);

    menuNavi = new QtPieMenu(QIcon(QPixmap(":/iconSet1/images/iconset1/navigation.png")),
                         tr(" Navi"),p,"Navigation",15,180);
    menuNavi->insertItem(QIcon(QPixmap(":/iconSet1/images/iconset1/text_eingeben.png")),
                         tr(" Eingabe"),this,SLOT(noAction()));
    menuNavi->insertItem(QIcon(QPixmap(":/iconSet1/images/iconset1/gruppenbildung.png")),
                         tr(" Gruppen"),this,SLOT(noAction()));
    menuNavi->insertItem(QIcon(QPixmap(":/iconSet1/images/iconset1/ausgabe_text.png")),
                         tr(" Texte"),this,SLOT(noAction()));
    menuNavi->insertItem(QIcon(QPixmap(":/iconSet1/images/iconset1/ausgabe_zahlen.png")),
                         tr(" Zahlen"),this,SLOT(noAction()));
    menuNavi->insertItem(QIcon(QPixmap(":/iconSet1/images/iconset1/status.png")),
                         tr(" Status"),this,SLOT(noAction()));
    menuNavi->insertItem(QIcon(QPixmap(":/iconSet1/images/iconset1/konfiguration.png")),
                         tr(" Konfiguration"),this,SLOT(noAction()));
    menuNavi->insertItem(QIcon(QPixmap(":/iconSet1/images/iconset1/information.png")),
                         tr(" Information"),this,SLOT(noAction()));
    p->insertItem(menuNavi);

    menuNavi->setItemEnabled(this->b_auswertung_fertig,2); // Texte
    menuNavi->setItemEnabled(this->b_auswertung_fertig,3); // Zahlen
    menuNavi->setItemEnabled(false,2); // Text

    connect(menuNavi,SIGNAL(activated(int)),this,SIGNAL(sendenNavi(int)));
}

void ausgabetext::noAction(){}

void ausgabetext::statusAuswertung(bool status){ this->b_auswertung_fertig = status;}

//! Oeffnet das Fenster fuer die Sortierung
void ausgabetext::starteAuswahl(){ popup->exec(); }
Mann schlecht... was kann das sein?
Wie kann ich den fehler weiter eingrenzen? :cry:
Zuletzt geändert von 24dan am 23. Oktober 2010 21:30, insgesamt 1-mal geändert.
"Der erste Trunk aus dem Becher der Naturwissenschaften macht atheistisch, aber auf dem Grund des Bechers wartet Gott."
(W. Heisenberg)
24dan
Beiträge: 274
Registriert: 26. Juni 2006 14:15
Wohnort: Hamburg

Beitrag von 24dan »

Also bin einen Schritt weiter:

Habe jetzt erstmal die Funktion zum erstellen des PieMenu im MouseEvent auskommentiert und rufe nur PieMenu auf.

Funktion hier einmal genutzt und dann ned mähr:

Code: Alles auswählen

ausgabetext::ausgabetext(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::ausgabetext)
{
    ui->setupUi(this);
    farbwechsel();
    textAuswahl();
    pieMenu();
    if(!this->b_auswertung_fertig) this->b_auswertung_fertig = false;
}

void ausgabetext::mousePressEvent(QMouseEvent *e)
{
    if ( e->button() & Qt::RightButton ) {
//            pieMenu();
            p->popup(e->globalPos());
            return;
    }
    QWidget::mousePressEvent( e );
}
Wie kann ich das Ding denn blos wirklich löschen also die Speicherauslastungserhöhung ausschliessen und das Ding neue Zeichnen
wenn ich dem Benutzer mehr oder weniger Menüauswahl geben möchte?

??? Evtl. mit ....

Code: Alles auswählen

void ausgabetext::mousePressEvent(QMouseEvent *e)
{
    if ( e->button() & Qt::RightButton ) {

// erstmal zerstören !
            p->deleteLater();

// dann ganz neu erschaffen?
            pieMenu();

// dann offrufen ?
            p->popup(e->globalPos());
            return;
    }
    QWidget::mousePressEvent( e );
}

:oops:
"Der erste Trunk aus dem Becher der Naturwissenschaften macht atheistisch, aber auf dem Grund des Bechers wartet Gott."
(W. Heisenberg)
padreigh
Beiträge: 340
Registriert: 13. Mai 2010 10:06

Beitrag von padreigh »

Wenn du vorher alle Möglichen Aktionen hast bietet dir void setItemEnabled ( bool enabled, int index ) die Möglichkeit zZ nicht nutzbare Funktionen auszugrauen. Dafür muss nichts zerstört/erschaffen werden, sondern nur über alle Funktionen iteriert und unpassende disabled werden ... ansonsten bietet sich void QtPieMenu::removeItemAt ( int index ) und void clear () an um einzelne/alle zu löschen und dann kannst du es neu füllen. Das findet man in 2 Minuten beim Blick in die API...

Da das PieMenue keine slots hast wirst du wohl nicht umhin kommen dir ein paar eingen Slots zu bauen die du mit passenden signalen vernetzt die dann entsprechende Items des Menues ausgrauen wenn dessen Vorbedingen nicht mehr erfüllt sind ... so würde ich es wohl versuchen.
Patrick (QtCreator 1.3.1, Qt 4.6.3)
---
template = subdirs
24dan
Beiträge: 274
Registriert: 26. Juni 2006 14:15
Wohnort: Hamburg

Beitrag von 24dan »

Ähhh.....

ja das macht total Sinn. Ich nutze ja jetzt schon beide beim erstellen.
Dann sollte ich eigentlich konsequenter trennen und nach dem "vollkommenem" Ausbau des PieMenüs die aktuellen Elemente einfach ausgrauen.
Passt und klingt gut. Danke.
"Der erste Trunk aus dem Becher der Naturwissenschaften macht atheistisch, aber auf dem Grund des Bechers wartet Gott."
(W. Heisenberg)
24dan
Beiträge: 274
Registriert: 26. Juni 2006 14:15
Wohnort: Hamburg

Beitrag von 24dan »

Getestet und für gut befunden....

Also für alle die den Anschluss verloren haben:
Ich habe jetzt folgendes zum Beheben meines Problems gemacht...

1. PieMenu einmal umfassend mit allen nötigen Einträgen erstellt
2. Dann je rechts Klick Mouse Event einmal die Funktionen ausgegraut die ich aktuelle nicht haben möchte.
"Der erste Trunk aus dem Becher der Naturwissenschaften macht atheistisch, aber auf dem Grund des Bechers wartet Gott."
(W. Heisenberg)
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

Code: Alles auswählen

   
  style = new konfiguration();
Das Memoryleak "style" solltest du auch noch beheben (auch wenn es durch den verbesserten Programmablauf nur noch einmal erzeugt wird).

hth..
Antworten