VLayout Widget anhand des Index löschen?

Alles rund um die Programmierung mit Qt
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

gast23 hat geschrieben:...
Es geht nicht darum Widget XY zu löschen oder zu kennen sondern allgemein alle Widgets des Containers bzw. ab einem bestimmten Index zu löschen ;)
Dann schreibst du halt selbst eine Methode wie z.B.

Code: Alles auswählen

      
  ......::deleteWidgetFromLayout(int index)
{
  Q_ASSERT(index >= 0 && index < mLayer->count());
  QLayoutItem* cItem = myLayer->takeAt(index);
  if (cItem->widget())
    cItem->widget()->deleteLater();
  delete cItem;
}
padreigh
Beiträge: 340
Registriert: 13. Mai 2010 10:06

Beitrag von padreigh »

Das das Löschen von Items in Layouts so "kompliziert" ist, liegt wohl daran das das Layout nicht das Parent des items ist. Es ordnet die nur hüsch an. Parent der childs ist das Widget das das Layout "besitzt".

Ich musste bisher noch nie Items aus einem Layout löschen. Wenn, dann lösche ich das entsprechende ChildWidget und das entfernt sich dann selbst aus dem Layout. An das child komme ich entweder über Membervariablen, seltenst über Memberlisten oder einfach parentWidget.findChild(ren)<>("objektname") ran ...

Eine Situation in der ich nur einen Teil der Widgets in einem Layout löschen muss kann ich mir so aus dem Stehgreif nicht konstruieren ... wenn dann wohl eher ein komplettes Widgets samt seinen Childs ... und dann reichts das Widget zu closen und alles geht mit übern Jordan.

Edit: Wenn ich reich wäre und meine Kinder eine Kindermädchen hätten [Haare, zerr] würde es mich ziemlich anp***en wenn das Kindermädchen die exxt .. das dürfte nur ich! [Hammer nehm und eckiges Besipiel in Rundes Loch klopp]
Zuletzt geändert von padreigh am 24. Oktober 2010 16:33, insgesamt 2-mal geändert.
Patrick (QtCreator 1.3.1, Qt 4.6.3)
---
template = subdirs
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

[EDIT]
War Mist.. hab mich kurz irritieren lassen ;) Was padreigh geschrieben hast ist natürlich richtig..
gast23
Beiträge: 103
Registriert: 11. August 2010 10:43

Beitrag von gast23 »

Ein Beispiel (Finder Suchfilterzeilen)

http://www.geekology.co.za/blog/wp-cont ... search.jpg

Wenn man das prototypisch umsetzt (Ohne perfekter Code Gedanke)
Dann ist eine Zeile ein Widget. Ein Hostwidget hat zb ein VLayout.
Eine Zeile sendet plus und minus Signale. Diese sind z.B. mit zwei Slots des Hostwidget verbunden. In den Slots kannst du den sender casten (Ja böse, kein OOP :-D) und dann die entsprechende Aktion ausführen z.B. index+1 ein neue Zeile einfügen.

Was machst du beim reset Button? Naja das einfachste wäre

Code: Alles auswählen

while(layout->count() > n)
delete layout->removeAt(n);
n = um z.b. 2 Zeilen als Initialzustand stehen zu lassen
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

gast23 hat geschrieben: Was machst du beim reset Button? Naja das einfachste wäre

Code: Alles auswählen

while(layout->count() > n)
delete layout->removeAt(n);
n = um z.b. 2 Zeilen als Initialzustand stehen zu lassen
Du hast ja bereits selbst geschrieben, dass eine QList sinnvoll ist (in deinem Beispiel z.B. zum Auslesen oder reseten der Filter-Regeln). Also:

Code: Alles auswählen

while(myFilterWidgetList.count())
  myFilterWidgetList.takeLast()->deleteLater();
fertig.

Ein "delete sender()" (Klick auf einen "Minus"-Button in deinem Beispiel) ist übrigens höchst illegal, weil du dich ja gerade in der Event-Verarbeitung dieser Instanz befindest.. also: deleteLater()!
gast23
Beiträge: 103
Registriert: 11. August 2010 10:43

Beitrag von gast23 »

solarix hat geschrieben: Ein "delete sender()" (Klick auf einen "Minus"-Button in deinem Beispiel) ist übrigens höchst illegal, weil du dich ja gerade in der Event-Verarbeitung dieser Instanz befindest.. also: deleteLater()!
Wenn das Signal als letzte Anweisung rausgeht dürfte das doch keine Probleme bereiten...
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

doch kann es... abgesehen davon (dass es haarsträubend ware, wenn sich die Software NACH dem Destruktor einer Klasse noch in einer Klassenmethode der besagten Klasse und Instanz befände), hängt es auch noch von der Connection (direct, queued) ab.

Daher: verwende einfach bei allen QObjecten immer deleteLater() und die Welt ist in Ordnung.

hth..
padreigh
Beiträge: 340
Registriert: 13. Mai 2010 10:06

Beitrag von padreigh »

gast23 hat geschrieben:Ein Beispiel (Finder Suchfilterzeilen)

http://www.geekology.co.za/blog/wp-cont ... search.jpg

Wenn man das prototypisch umsetzt (Ohne perfekter Code Gedanke)
Dann ist eine Zeile ein Widget. Ein Hostwidget hat zb ein VLayout.
Eine Zeile sendet plus und minus Signale. Diese sind z.B. mit zwei Slots des Hostwidget verbunden. In den Slots kannst du den sender casten (Ja böse, kein OOP :-D) und dann die entsprechende Aktion ausführen z.B. index+1 ein neue Zeile einfügen.
Mhh nö ... das wäre für mich ein Widget (A) das ein Widget(B) mit den Suchknöppen enthält, darunter ein TreeView.

Je Zeile in (B) ist ein eigenes Widget (Format (C), Datum (D), Bildgröße (BG), ...) je nach Auswahl (zB (C)==BILD) wird ein Signal an (B) geschickt das dann un/passende weitere Optionen ein/ausblendet. Ein Druck auf (+/-) würde ein Signal auslösen das über (B) and (A) weitergeleitet wird (vielleicht auch direkt an (A)) das dann eine entsprechende Suche (RegExp("pic_size:w>400")) anstößt.

Das TreeView bekommt als Model eine von QSortFilterProxyModel abgeleitete Klasse die mehrere SuchRegExps akzeptiert. Das ProxyModel bekommt ein QFileSystemModel als Model ... warscheinlich erweitert um eine Art "tagging" -> UserRole's für zB Bildgrößen, SoundLängen, ...

Ein clear würde alle FilterRegExps löschen.


Oder soll ein "+-" in (C,D,BG) einen weiteren Filter derselben "Art" ermöglichen? dann würde ich wohl "-" mit close() verbinden und Qt::WA_DeleteOnClose setzen (für jeden ausser der ersten Instanz dieses Widgets das ein disabled'tes "-" bekommt), "+" mit einem create() slot von (C,D,BG) der eine Kopie erstellt, diese dem selben parent zuweist und anschließend per Signal an (B) und einem passenden Slot in (B) dessen Eingliederung in das Layout anleiert.
Patrick (QtCreator 1.3.1, Qt 4.6.3)
---
template = subdirs
Antworten