#include "Testapp.h"
Testapp::Testapp(QWidget *parent)
:QWidget(parent)
{
mainlayout = new QHBoxLayout(this);
seite_1_Layout = new QVBoxLayout();
seite_2_Layout = new QVBoxLayout();
button_s1 = new QPushButton();
button_s2 = new QPushButton();
button_s1->setText("zu Seite 2");
button_s2->setText("zu Seite 1");
label_s1=new QLabel("Test auf Seite 1");
label_s2=new QLabel("Test auf Seite 2");
seite_1_Layout->addWidget(button_s1);
seite_1_Layout->addWidget(label_s1);
seite_2_Layout->addWidget(button_s2);
seite_2_Layout->addWidget(label_s2);
QObject::connect(button_s1,SIGNAL(clicked()),this,SLOT(b1_clicked()));
QObject::connect(button_s2,SIGNAL(clicked()),this,SLOT(b2_clicked()));
mainlayout->addLayout(seite_1_Layout,0);
}
Testapp::~Testapp()
{
// TODO Auto-generated destructor stub
}
//von Seite 2 auf Seite 1
void Testapp::b2_clicked()
{
QLayoutItem *child;
while ((child = mainlayout->takeAt(0)) != 0) {
delete child;
}
mainlayout->addLayout(seite_1_Layout,0);
}
//von Seite 1 auf Seite 2
void Testapp::b1_clicked()
{
QLayoutItem *child;
while ((child = mainlayout->takeAt(0)) != 0) {
delete child;
}
mainlayout->addLayout(seite_2_Layout,0);
}
leider macht es nicht was ich will zur 2ten Seite geht er noch, überschreibt aber das label_s1, aber geht dann auch nicht wieder zurück auf Seite 1. Das "seite_1_layout" ist wohl schon hinzugefügt. Jedoch gibt es keinerlei Befehle wie hide() und show() wie bei den anderen.
Hat jemand eine Idee wie ich das lösen könnte? Vielen Dank
#include "Testapp.h"
Testapp::Testapp(QWidget *parent):QWidget(parent)
{
QWidget *window = new QWidget;
mainlayout = new QHBoxLayout();
b2_clicked(); // direkt mit Layout 1 starten
}
//von Seite 2 auf Seite 1
void Testapp::b2_clicked()
{
QLayoutItem *child;
while ((child = mainlayout->takeAt(0)) != 0) { // immer angenommen wir erhalten layout2
delete child;
delete label_s2;
delete button_s2;
}
button_s1 = new QPushButton("zu Seite 2");
label_s1 = new QLabel("Test auf Seite 1");
seite_1_Layout = new QVBoxLayout();
seite_1_Layout->addWidget(button_s1);
seite_1_Layout->addWidget(label_s1);
connect(button_s1,SIGNAL(clicked()),this,SLOT(b1_clicked()));
mainlayout->addLayout(seite_1_Layout,0);
}
//von Seite 1 auf Seite 2
void Testapp::b1_clicked()
{
QLayoutItem *child;
while ((child = mainlayout->takeAt(0)) != 0) { // immer angenommen wir erhalten layout2
delete child;
delete label_s1;
delete button_s1;
}
label_s2 = new QLabel("Test auf Seite 2");
button_s2 = new QPushButton("zu Seite 1");
seite_2_Layout = new QVBoxLayout();
seite_2_Layout->addWidget(button_s2);
seite_2_Layout->addWidget(label_s2);
connect(button_s2,SIGNAL(clicked()),this,SLOT(b2_clicked()));
mainlayout->addLayout(seite_2_Layout,0);
}
hi joa elegant sieht anders aus. zumal das eher ein vereinfachter Code ist. Im gesamten ist er viel größer und über mehrere Seiten.
Ich habe noch was anderes gefunden und zwar funktioniert das so ganz okay.
#include "Testapp.h"
Testapp::Testapp(QWidget *parent)
:QWidget(parent)
{
mainlayout = new QStackedLayout(this);
seite_1_Layout = new QVBoxLayout();
seite_2_Layout = new QVBoxLayout();
button_s1 = new QPushButton();
button_s2 = new QPushButton();
button_s1->setText("zu Seite 2");
button_s2->setText("zu Seite 1");
label_s1=new QLabel("Test auf Seite 1");
label_s2=new QLabel("Test auf Seite 2");
seite_1_Layout->addWidget(button_s1);
seite_1_Layout->addWidget(label_s1);
seite_2_Layout->addWidget(button_s2);
seite_2_Layout->addWidget(label_s2);
QObject::connect(button_s1,SIGNAL(clicked()),this,SLOT(b1_clicked()));
QObject::connect(button_s2,SIGNAL(clicked()),this,SLOT(b2_clicked()));
QWidget *widget1 = new QWidget();
QWidget *widget2 = new QWidget();
widget1->setLayout(seite_1_Layout);
widget2->setLayout(seite_2_Layout);
mainlayout->addWidget(widget1);
mainlayout->addWidget(widget2);
mainlayout->setCurrentIndex(0);
}
Testapp::~Testapp()
{
// TODO Auto-generated destructor stub
}
//von Seite 2 auf Seite 1
void Testapp::b2_clicked()
{
mainlayout->setCurrentIndex(0);
}
//von Seite 1 auf Seite 2
void Testapp::b1_clicked()
{
mainlayout->setCurrentIndex(1);
}
Gibt es irgendwas was dagegen spricht? Ist es ratsam mehrere Widgets zu machen (Speicherplatz,Performance,...) ?
SaLu hat geschrieben:Gibt es irgendwas was dagegen spricht? Ist es ratsam mehrere Widgets zu machen (Speicherplatz,Performance,...) ?
Genau dafür gibt es doch QStackedLayout/QStackedWidget. Wegen den paar Widgets solltest du jetzt nicht in ein Speicherloch fallen. Im Gegenteil - dadurch dass du immer alles zusammenhältst und nicht beim Layoutwechsel selber die Delete-Kanone ansetzt, bist du recht gut geschützt gegen Memory-Leaks. Neben dem dass delete + Neu erstellen bei jedem Wechsel einiges an CPU-Zeit verbraucht (gegenüber dem einfachen Wechseln des aktiven Widgets), so dass diese Lösung inperformanter sein sollte.
// edit:
Ich verwende Bespin als Style, und dort werden Layout-Changes im QStackeLayout animiert Crossfade kommt schon cool. Bespin orientiert sich an MacOSX, so dass es durchaus sein kann, dass dort solche Wechsel von Haus aus auch animiert werden. Wäre doch ein nettes Stück Eye-Candy, das du nur durch die Verwendung von QStackedLayout bekommst, welches du mit der eigenen Lösung verschenkst.