Seite 1 von 1

Probleme mit Widgets

Verfasst: 20. November 2007 16:43
von kleineSchildy
Hallo,

ich habe ein paar Probleme :(

Ich erzeuge in einem MainWindow ein Widget vom Typ QWidget. Auf diesem sind RadioButtons vorhanden. Beim Anklicken eines RadioButtons öffnet sich ein weiteres Widget (jetzt mal SubWidgets genannt).

Wenn ich das Widget mit den RadioButtons das erstmal öffne werden die SubWidgets richtig erzeugt. Wenn ich das Widget schließe und erneut öffne, dann öffnen sich beim Anklicken eines RadioButtons jedoch gleich 2 SubWidgets und beim nächsten Öffnen 3 Stück :shock:

ich hänge mal meinen Code mit dran

Code: Alles auswählen

#include <QtGui>

#include "mymainwindow.h"
#include "mychild.h"

MyMainWindow::MyMainWindow (QString sTitle)
{
    setWindowTitle(sTitle);
    
    mdiArea = new QMdiArea;
    setCentralWidget(mdiArea);
    
    signalMapper = new QSignalMapper(this);
    
    createActions();
    createMenus();
}

void MyMainWindow::createMenus()
{
    //Application-Menu
    appMenu = menuBar()->addMenu(tr("File"));
    appMenu->addAction(newSimAct);
    appMenu->addAction(closeSimAct);
    appMenu->addSeparator();
    appMenu->addAction(closeAppAct);
}

void MyMainWindow::createActions()
{
    newSimAct = new QAction (QIcon(":/images/open.png"), tr("New Simulation Session"), this);
    connect(newSimAct, SIGNAL(triggered()), this, SLOT(openChild()));
    
    closeAppAct = new QAction (QIcon(":/images/exit.png"), tr("Exit Application"), this);
    connect(closeAppAct, SIGNAL(triggered()), qApp, SLOT(closeAllWindows()));
     
    closeSimAct = new QAction (QIcon(":/images/close.png"), tr("Exit Simulation Session"), this);
    connect(closeSimAct, SIGNAL(triggered()), this, SLOT(closeSim()));
}

void MyMainWindow::openChild()
{
    if (activeChild()) return;
     
    session = new MyChild("Simulation Modules");
    //GroupBox festlegen
    QGroupBox *gbSource = new QGroupBox(tr("Source"));
    QRadioButton *rbTophat = new QRadioButton(tr("Tophat"));
    QRadioButton *rbProcess = new QRadioButton(tr("Processed Measured"));
    QRadioButton *rbSynthes = new QRadioButton(tr("Synthesized Physical"));
    
    connect(rbTophat, SIGNAL(clicked()), signalMapper, SLOT(map()));
    signalMapper->setMapping(rbTophat, 0);
    connect(rbProcess, SIGNAL(clicked()), signalMapper, SLOT(map()));
    signalMapper->setMapping(rbProcess, 1);
    connect(rbSynthes, SIGNAL(clicked()), signalMapper, SLOT(map()));
    signalMapper->setMapping(rbSynthes, 2); 
    
    connect(signalMapper, SIGNAL(mapped(int)), this, SLOT(openModule(int)));
    connect(session, SIGNAL(), this, SLOT(closeSim()));
    
    QVBoxLayout *blSource = new QVBoxLayout;
    blSource->addWidget(rbTophat);
    blSource->addWidget(rbProcess);
    blSource->addWidget(rbSynthes);
    gbSource->setLayout(blSource);
    
    QGridLayout *grid = new QGridLayout;
    grid->addWidget(gbSource,0,0);
    grid->setSizeConstraint(QLayout::SetMinimumSize);
     
    session->setLayout(grid);
    mdiArea->addSubWindow(session);
    session->show();
}

void MyMainWindow::openModule(int whichModule)
{
    switch(whichModule)
    {
      case 0:
          sourceModul = new MyChild("Tophat");
      break;
      
      case 1:
          sourceModul = new MyChild("Processed Measured");
      break;
      
      case 2:
          sourceModul = new MyChild("Synthesized Physical");
      break;                     
    }
    mdiArea->addSubWindow(sourceModul);
    sourceModul->show();            
}

void MyMainWindow::closeSim()
{
    mdiArea->closeAllSubWindows();     
}

bool MyMainWindow::activeChild()
{
     if(QMdiSubWindow *activeSubWindow = mdiArea->activeSubWindow())
         return true;
     return false;            
}

Was erzeugt diesen seltsamen Effekt?

Anregungen für einen besseren Programmierstil werden auch gern entgegen genommen.

Vielen Dank für eure Hilfe.

Viele Grüße
Jana

Verfasst: 20. November 2007 17:00
von solarix
ohne den Code jetzt genauer angeschaut zu haben, behaupte ich mal folgendes:

Wenn du dein Child zuklickst, wird die Instanz dieses Widgets nicht geloescht, sondern nur auf "hilde" (unsichtbar) gesetzt. Um dieses Verhalten zu aendern, musst du ein Attribut im Konstruktor setzen (irgendwas wie "setAttribute(Qt::WA_destroyOnClose)" oder so...).

In deinem Fall werden also immer mehr Instanzen erzeugt, welche das Signal des Toggles erhalten (auch wenn sie unsichtbar sind) und reagieren darauf..

Koennte es sowas sein?

Verfasst: 20. November 2007 21:13
von Korgen
hört sich für mich nach einem Signal/Slot Problem an. Kann es sein, dass du jedesmal, wenn du auf einen RadioButton klickst die Singals und Slot verbindest? Wenn eine Verbindung 2x hergestellt wird, wird das Signal 2x emittiert und der Slot 2x aufgerufen.

Könnte es sowas in der Art sein?

Grüße