Seite 1 von 1
QWidget dynamisch erzeugen und wieder enfernen
Verfasst: 24. März 2010 08:55
von Qloroplast
Der Ansatz:
Code: Alles auswählen
Verbinder::Verbinder(QWidget *parent,statuslog *StatusLog) : QMainWindow(parent)
{
QWidget *wdg=new QWidget(parent);
lw = new vater(wdg,StatusLog);
rw = new Intro(wdg,StatusLog);
gui_main = new QWidget(wdg);
}
Die aufrufende Funktion
Code: Alles auswählen
void Verbinder::machGuiWidget(QString Inhalt,int Fensteranzahl)
{
gui_item = new QWidget;
for (int i=0;i<Fensteranzahl;i++)
{
mach_Dockwindows(gui_item,Inhalt,Fensteranzahl);
}
}
Die loeschende Funktion
Code: Alles auswählen
void Verbinder::reset_to_main(QWidget *parent)
{
parent->deleteLater();
}
Verfasst: 24. März 2010 09:10
von upsala
Ein einfaches delete oder wdg->deleteLater löscht das Widget. Event. vorhanden Child-Widgets werden automatisch mitgelöscht. (Da der parent bei der Erstellung mitübergeben wurde)
Verfasst: 24. März 2010 09:24
von Qloroplast
Also nur das ich das richtig verstehe:
Ich erstelle ein Widget "wdg".
Darin erzeuge ich lauter child Widgets und wenn ich nun ein
ausfuehre dann loescht er alle UnterWidgets und zeigt diese nicht mehr an ?
ein child Widget ist ja zb QWidget moo(wdg);
wenn ich nun wdg delete dann wird moo auch aus der Anzeige in der Gui entfernt ?
Verfasst: 24. März 2010 09:31
von franzf
Qloroplast hat geschrieben:ein child Widget ist ja zb QWidget moo(wdg);
wenn ich nun wdg delete dann wird moo auch aus der Anzeige in der Gui entfernt ?
Genau. Ein zerstörtes Objekt funktioniert nichtmehr (ist wie mit allen Objekten, nicht nur GUI-bezogen) und kann seiner Aufgabe nichtmehr nachkommen
Im übrigen sind ChildWidgets auch automatisch jene, die über ein Layout in einem Widget liegen.
Code: Alles auswählen
{
QWidget parent;
QHBoxLayout* layout = new QHBoxLayout;
parent.setLayout(layout);
layout.addWidget(new QLabel("Hallo Label"));
}
// Bei Verlassen des Scopes wir parent zerstört, mit ihm auch das layout und das label
Verfasst: 24. März 2010 10:41
von Qloroplast
das bisher habe ich verstanden aber in meinem wdg werden immer noch die Child Widgets angezeigt. Wenn ich das deleteLater ausloese. Irgentwas verstehe ich immer noch nicht.
auch nicht nachdem ich das Widget mit deleteLater loesche
Verfasst: 24. März 2010 10:46
von franzf
Qloroplast hat geschrieben:das bisher habe ich verstanden aber in meinem wdg werden immer noch die Child Widgets angezeigt. Wenn ich das deleteLater ausloese. Irgentwas verstehe ich immer noch nicht.
auch nicht nachdem ich das Widget mit deleteLater loesche
dann brauchen wir mehr code?
Verfasst: 24. März 2010 10:55
von Qloroplast
nachdem die untere Funktion aufgerufen ist sehe ich den Inhalt von Gui_main immer noch und wenn ich die Dockwidgets weg druecke dann sehe ich die urspruengliche Gui wieder. Dh logisch gesehen loesche ich das falsche oder der Inhalt wird nicht mit geloescht -> was heissen wuerde das ich etwas mit dem Parent System falsch mache
Code: Alles auswählen
void Verbinder::reset_to_main()
{
qWarning("ab hier sollte das Gui geloescht werden");
gui_main->hide();
rw->hide();
lw->show();
//------------------------------------------------------------------------------
this->gui_item->deleteLater();
}
Code: Alles auswählen
void Verbinder::machGuiWidget()
{
QString Inhalt=auswahl->currentText ();
qWarning()<<Inhalt;
// ---------------------
rw->hide();
lw->hide();
gui_main->show();
// ---------------------
int Fensteranzahl = hole_info();
gui_item = new QWidget(this->gui_main);
for (int i=0;i<Fensteranzahl;i++)
{
gui_item->setObjectName(QString::fromUtf8("DOcker %D",i));
mach_Dockwindows(gui_item,Inhalt,Fensteranzahl);
}
}
Diesen Code habe ich mit QT Creator automatisch generiert
Code: Alles auswählen
void Verbinder::mach_Dockwindows(QWidget *parent,QString foo,int nummer)
{
DOcker = new QDockWidget(parent);
DOcker->setObjectName(QString::fromUtf8("DOcker"));
DOcker->setEnabled(true);
// DOcker->setTitleBarWidget(parent);
//sizePolicy.setHeightForWidth(DOcker->sizePolicy().hasHeightForWidth());
//DOcker->setSizePolicy(sizePolicy);
DOcker->setMinimumSize(QSize(790, 79));
DOcker->setMaximumSize(QSize(10000, 407));
DOcker->setMouseTracking(true);
DOcker->setLayoutDirection(Qt::LeftToRight);
DOcker->setFloating(false);
DOcker->setFeatures(QDockWidget::AllDockWidgetFeatures);
QWidget*dockWidgetContents_3 = new QWidget(DOcker);
dockWidgetContents_3->setObjectName(QString::fromUtf8("dockWidgetContents_3"));
QWidget*verticalLayoutWidget = new QWidget(dockWidgetContents_3);
verticalLayoutWidget->setObjectName(QString::fromUtf8("verticalLayoutWidget"));
verticalLayoutWidget->setGeometry(QRect(50, 0, 511, 371));
QVBoxLayout*verticalLayout = new QVBoxLayout(verticalLayoutWidget);
verticalLayout->setSpacing(6);
verticalLayout->setMargin(11);
verticalLayout->setObjectName(QString::fromUtf8("verticalLayout"));
verticalLayout->setContentsMargins(0, 0, 0, 0);
QHBoxLayout*horizontalLayout = new QHBoxLayout(DOcker);
horizontalLayout->setSpacing(6);
horizontalLayout->setObjectName(QString::fromUtf8("horizontalLayout"));
QRadioButton* radioButton = new QRadioButton(verticalLayoutWidget);
radioButton->setObjectName(QString::fromUtf8("radioButton"));
horizontalLayout->addWidget(radioButton);
QLineEdit*lineEdit = new QLineEdit(verticalLayoutWidget);
lineEdit->setObjectName(QString::fromUtf8("lineEdit"));
horizontalLayout->addWidget(lineEdit);
QRadioButton*radioButton_2 = new QRadioButton(verticalLayoutWidget);
radioButton_2->setObjectName(QString::fromUtf8("radioButton_2"));
horizontalLayout->addWidget(radioButton_2);
QRadioButton*radioButton_3 = new QRadioButton(verticalLayoutWidget);
radioButton_3->setObjectName(QString::fromUtf8("radioButton_3"));
horizontalLayout->addWidget(radioButton_3);
verticalLayout->addLayout(horizontalLayout);
QGroupBox*groupBox = new QGroupBox(verticalLayoutWidget);
groupBox->setObjectName(QString::fromUtf8("groupBox"));
verticalLayout->addWidget(groupBox);
DOcker->setWidget(dockWidgetContents_3);
this->addDockWidget(static_cast<Qt::DockWidgetArea>(1), DOcker);
}
Verfasst: 24. März 2010 13:44
von franzf
Qloroplast hat geschrieben:Diesen Code habe ich mit QT Creator automatisch generiert
Ähm... So geht das aber nicht! Der generierte Code aus dem ui (nehm ich an) sollte auch so verwendet werden wie in der Doku beschrieben. Und eben NICHT per Copy/Paste irgendwo eingetragen.
Schau dir mal an wie man den Designer verwendet.
Desweiteren kannst du ja mal versuchen ob ein removeDockWidget vor dem deleteLater() hilft.
Ich hab mich jetzt nicht durch den Code gequält, sry. Der Designer setzt so viele Properties, dass man das eigentliche - nämlich die ganzen parent/child-Beziehungen nicht rauslesen kann, ohne unnötig Zeit zu vergeuden.
Und was setObjectName macht soltlest du dir auchmal anschauen.
Code: Alles auswählen
gui_item = new QWidget(this->gui_main);
for (int i=0;i<Fensteranzahl;i++)
{
gui_item->setObjectName(QString::fromUtf8("DOcker %D",i));
mach_Dockwindows(gui_item,Inhalt,Fensteranzahl);
}
setzt in jeder Schleife einen neuen Namen für ein Object das bereits vorher existiert. Das ist absolut unnötig.
Dagegen das
ist das Gegenteil. So hat dein MainWindow lauter DockWidgets mit dem selben ObjectName - ebenso sinnlos

Verfasst: 24. März 2010 17:13
von Qloroplast
ok danke dir vielmals. Ich denke auch das es am generierten Code liegt. Ich werde morgen noch mal eine Application machen und das testen bis ich das Prinzip verstanden habe. Ich wollte eignentlich nur testen ob die QDockWidgets erzeugt werden und habe sie zur Anzeige eingebunden und das sie nun den Fehler produzieren ....javascript:emoticon(':lol:')