C++ QT: QPushButton Objekt manuell löschen nötig?

T_55

Lieutenant
Registriert
Feb. 2013
Beiträge
643
Hallo,

ich nutze folgenden Codesnippet um ein Buttom in eine Tabelle zu bringen.

C++:
QPushButton* btn_edit = new QPushButton();
btn_edit = new QPushButton();
btn_edit->setText("klick");
btn_edit->setProperty("ID",1);
ui->tableWidget->setCellWidget(0,0,(QWidget*)btn_edit);
connect(btn_edit, SIGNAL(Clicked(bool)),this,SLOT(CellButtomClicked()));

Die Tabelle wird hin und wieder bei neuen Daten komplett neu erstellt und entsprechend der obige code ausgeführt.
Jetzt frage ich mich (da ich sonst nicht viel mit dynamischer Speicher per "new" arbeite aber natürlich weiß, dass dieser "normal" manuell gelöscht gehört) muss ich, bevor ich die Tabelle neu erzeuge, die alten QPushButton Objekte extra löschen oder werden die Dinger irgendwie automatisch freigegeben beim erzeugen der neuen Tabelle?

LG
 
manuell löschen, oder auf dem Stack allokieren oder unique_ptr nutzen.

C++:
QPushButton* btn_edit = new QPushButton();
btn_edit = new QPushButton();
Den ersten musst du auf jeden Fall löschen.


C++:
#include <memory>
auto btn_edit = make_unique<QPushButton>();
//oder
QPushButton btn_edit();
//oder
auto btn_edit = new QPushButton();
//...
delete btn_edit;

EDIT: QT scheint das Löschen zu übernehmen, sobald du es einer QT-Klasse übergibst, sh. unten.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: T_55, hroessler und abcddcba
Das verwenden von Smart-Pointern ist generell eine gute Idee :)

greetz
hroessler
 
Danke, ich habe mal die Sache per make_unique versucht, bekomme dann aber den Fehler bei setCellWidget:
<cannot cast from type 'std::unique_ptr<QPushButton, std::default_delete<QPushButton> >' to pointer type 'QWidget *'

C++:
auto btn_edit = std::make_unique<QPushButton>();
btn_edit->setText("klick");
btn_edit->setProperty("ID",1);
ui->tableWidget->setCellWidget(0,0,(QWidget*)btn_edit);
connect(btn_edit, SIGNAL(Clicked(bool)),this,SLOT(CellButtomClicked()));

Und nochmal generell blöd gefragt, solange die Tabelle existiert und dessen Buttoms anklickbar sind, muss doch das Objekt leben, woher weiß dann eigentlich der smarter Pointer wann das Ding nicht mehr gebraucht wird?
 
Smart-Pointer und Qt führen leider auch gerne zu den einen oder anderen Fluch, da Qt selbt mit Smart-Pointern noch nicht nativ umgehen kann.
 
  • Gefällt mir
Reaktionen: T_55 und new Account()
Vorweg: Erste und zweite Zeile redundant, oder versteh ich da was nicht?
Dann: setCellWidget() Dokumentation - Das tableWidget nimmt dann ownership, also musst du dich um den Pointer nicht kuemmern.
In Qt hast du eigentlich sehr haeufig eine Parent-Child-Beziehung zwischen den QObjects, das parent kuemmert sich dann um das Loeschen seiner Childs usw.
Wenn du Smartpointer benutzen moechtest, kannst du dir auch die Smartpointer, die Qt selbst mitbringt, mal angucken.
 
  • Gefällt mir
Reaktionen: T_55 und new Account()
Du kannst dir bei Bedarf/Zeit/Lust auch einmal Valgrind anschauen.
 
  • Gefällt mir
Reaktionen: BlackMark und T_55
Ich sehe gerade noch in deinem Snippet:

C++:
ui->tableWidget->setCellWidget(0,0,(QWidget*)btn_edit);
connect(btn_edit, SIGNAL(Clicked(bool)),this,SLOT(CellButtomClicked()));

Zeile1: Diesen komischen Cast (QWidget*) kannst du dir denke ich sparen
Zeile2: Seit Qt5 (glaube ich), benutzt man eine andere Schreibweise um Signals und Slots zu connecten:
C++:
connect(btn_edit, &QPushButton::clicked, this, &MyWidgetFoo::CellButtonClicked)
Details dazu: New Signal and Slot Syntax
 
  • Gefällt mir
Reaktionen: T_55
Zurück
Oben