abhängige GroupBoxen

Alles rund um die Programmierung mit Qt
Antworten
bandit
Beiträge: 1
Registriert: 15. Juli 2007 11:51
Wohnort: Hannover

abhängige GroupBoxen

Beitrag von bandit »

Hallo,

gegeben sind zwei GroupBoxen in einem BoxLayout. In der ersten Box sind mehrere Radiobuttons, die den Inhalt der zweiten Box alternativ bestimmen sollen.
Bisher gelingt es mittels je eines Signales eine entsprechende Box zu platzieren. Allerdings wird die alte Box nicht gelöscht, so dass beim Hin- und Herklicken ein endloses Band der abhängigen Boxen entsteht.
Kann jemand sagen, wie das geht - oder gibt es sinnvollere Alternativen?

Code: Alles auswählen

//main.cc

#include<QApplication>
#include"window.hh"

int main(int argc, char **argv){
  QApplication a(argc, argv);

  Window win;
  win.show();

  return a.exec();
}

Code: Alles auswählen

//window.hh

#ifndef WINDOW_HH
#define WINDOW_HH

#include<QWidget>
class QGroupBox;
class QVBoxLayout;
class QRadioButton;

class Window: public QWidget
{
  Q_OBJECT
  public:
    Window(QWidget *parent = 0);
  private:
    QGroupBox *auswahlBox();
    QGroupBox *ergebnisBox1();
    QGroupBox *ergebnisBox2();

    QGroupBox *ergebGBox;
    QVBoxLayout *vbox, *vbox1;

    QRadioButton *radio1;
    QRadioButton *radio2;
  public slots:
    void eBox(bool);
    void fBox(bool);
};

#endif

Code: Alles auswählen

#include<QtGui>
#include"window.hh"


Window::Window(QWidget *parent): QWidget(parent)
{
  vbox = new QVBoxLayout;

  vbox->addWidget(auswahlBox());

  setLayout(vbox);
};


QGroupBox *Window::auswahlBox(){
  QGroupBox *auswGBox = new QGroupBox("Auswahl");

  radio1 = new QRadioButton("erster");
  radio2 = new QRadioButton("zweiter");

  vbox1 = new QVBoxLayout;
  vbox1->addWidget(radio1);
  vbox1->addWidget(radio2);
  auswGBox->setLayout(vbox1);

  connect(radio1, SIGNAL(toggled(bool)), this, SLOT(eBox(bool)));
  connect(radio2, SIGNAL(toggled(bool)), this, SLOT(fBox(bool)));

  return auswGBox;
}


QGroupBox *Window::ergebnisBox1()
{
  ergebGBox = new QGroupBox("Ergebnis des ersten Knopfes");
  QLabel *label = new QLabel("Text 1");

  QVBoxLayout *lay = new QVBoxLayout;
  lay->addWidget(label);

  ergebGBox->setLayout(lay);

  return ergebGBox;
}


QGroupBox *Window::ergebnisBox2()
{
  ergebGBox = new QGroupBox("der zweite Knopf");
  QLabel *label = new QLabel("zweiter Text");

  QVBoxLayout *lay = new QVBoxLayout;
  lay->addWidget(label);

  ergebGBox->setLayout(lay);

  return ergebGBox;
}


void Window::eBox(bool a)
{
  if(a){
    vbox->removeWidget(ergebnisBox2());
    vbox->insertWidget(1, ergebnisBox1());
  }
}


void Window::fBox(bool a)
{
  if (a){
    vbox->removeWidget(ergebnisBox1());
    vbox->insertWidget(1, ergebnisBox2());
  }
}
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

Allerdings wird die alte Box nicht gelöscht, so dass beim Hin- und Herklicken ein endloses Band der abhängigen Boxen entsteht.
naja.. ueberleg mal:

Code: Alles auswählen

vbox->removeWidget(ergebnisBox2()); 
Was genau tut "removeWidget" und was genau "ergebnisBox2"?
oder gibt es sinnvollere Alternativen?
definitiv.. z.B. die beiden Anzeigen nur sichtbar/unsichtbar zu schalten:

Code: Alles auswählen

void Window::fBox(bool a)
{
  if (a)
  {
   anzeige1->hide();
   anzeige2->show();
  }
}
anzeige1 und 2 sind dann zwei private Instanzen von QGroupBox* und im Konstruktor (unsichtbar) erzeugt (mit ergebnisBox1/2) und dem Layout hinzugefuegt.
Flachkoepper
Beiträge: 149
Registriert: 11. Januar 2005 12:14
Wohnort: Hannover

Beitrag von Flachkoepper »

Oder eine GroupBox als Container und dadrin ein QStackedWidget zum Anzeigen der verschiedenen Seiten...
ObeliX
Beiträge: 59
Registriert: 14. November 2007 17:47

Beitrag von ObeliX »

genauso wie Flachkoepper würde ich das auch machen ... kommt ohne 'handarbeit' aus und ist Designer-kompatibel :)

MfG Obel
Antworten