[gelöst]Absturz in QTableWidget
Verfasst: 16. Dezember 2007 01:22
Ich habe in meinem Programm zwei Parametersätze, die mit jeweils einer Klasse QTableWidget angesehen und editiert werden können.
Bis auf die Namen sind beide Klassen völlig gleich aufgebaut.
Die jeweiligen Daten sind in je einer struct enthalten.
Der Konstruktor des Hauptfensters initialisiert die Daten für beide QTableWidgets und erzeugt jeweils ein Objekt von beiden QTableWidgets.
Das erste Objekt wird problemlos erzeugt. Beim Erzeugen des zweiten stürzt das Programm ab.
Konstruktor des Hauptfensters:
Jetzt die beiden QTableWidget selbst. Die Klassendefinitionen sind bis auf die Namen identisch:
Nun die beiden Konstruktoren:
Und schließlich die beiden Slot on_cancelButton_clicked():
Es gibt noch einen Unterschied:
Der Debugger läuft im ersten Slot beim Steppen wie zu erwarten über die Anweisungen "table->item(1,0)->setText(...)" hinweg. Beim zweiten Slot hingegen geht der Debugger beim Steppen in eine Datei
"qtablewidget.h" und dort zu
"inline void QTableWidgetItem::setText(const QString &atext) {...},
obwohl ich kein step-into, sondern nur step anklicke.
Das ganze sieht sehr mysteriös aus, weshalb ich für Tipps sehr dankbar wäre.
Hi, hab's gefunden:
Im Konstruktor b_Parameter fehlte das Erzeugen und Einfügen der QTableWidgetItems. Das Programm wollte Items, die es gar nicht gab, mit Inhalt füllen
Bis auf die Namen sind beide Klassen völlig gleich aufgebaut.
Die jeweiligen Daten sind in je einer struct enthalten.
Der Konstruktor des Hauptfensters initialisiert die Daten für beide QTableWidgets und erzeugt jeweils ein Objekt von beiden QTableWidgets.
Das erste Objekt wird problemlos erzeugt. Beim Erzeugen des zweiten stürzt das Programm ab.
Konstruktor des Hauptfensters:
Code: Alles auswählen
...
f_config = get_f_config_ptr(); // Pointer f_config zeigt jetzt auf die ersten Parameterdaten
f_config->par1 = 0; // Initialisieren des ersten Parametersatzes par1...
f_config->par2 = 1;
...
f_ParList = new f_Parameter(this); // Erzeugen des ersten QTableWidget,------> ok
b_config = get_b_config_ptr(); // Pointer b_config zeigt jetzt auf die zweiten Parameterdaten
b_config->par1 = 0; // Initialisieren des zweiten Parametersatzes par1...
b_config->par2 = 1;
...
b_ParList = new b_Parameter(this); // Erzeugen des zweiten QTableWidget--------->hier Absturz
Code: Alles auswählen
... #include ...
class f_Parameter : public QDialog // zweite Klasse heisst b_Parameter
{
Q_OBJECT // zweite Klasse dito
public:
f_Parameter(QWidget *parent=0); // zweite Klasse hier: b_Parameter(...)
QTableWidget *table; // zweite Klasse dito
QStringList paramNames; // zweite Klasse dito
private:
Ui::f_Params uifP; // zweite Klasse hier: Ui::b_Params uibP
private slots:
void on_okButton_clicked(); // zweite Klasse dito
void on_cancelButton_clicked(); // zweite Klasse dito
};
Code: Alles auswählen
... diverse #include
F_CONFIG *f_config; // zweiter Konstruktor hier: B_CONFIG *b_config, Pointer auf die jeweiligen Parameterdaten,
f_Parameter::f_Parameter(QWidget *parent) : QDialog(parent) { // zweiter Konstruktor hier: b_Parameter::b_Parameter(...)
uifP.setupUi(this); // zweiter Konstruktor hier: uibP.setupUi(this);
... Tabellenüberschriften werden hier erzeugt
f_config = get_f_config_ptr(); // zweiter Konstruktor hier: b_config = get_b_config_ptr(); Pointer auf den ersten/zweiten Parametersatz
on_cancelButton_clicked(); // zweiter Konstruktor dito, hiermit werden die Parameterwerte in das QTableWidget übernommen
Code: Alles auswählen
void f_Parameter::on_cancelButton_clicked() { // zweiter Slot hier: void b_Parameter::on_cancelButton_clicked()
// abgespeicherte Werte übernehmen (Änderungen rückgängig)
table->item(1,0)->setText(QString::number(f_config->par1)); // zweiter Slot hier: table->item(1,0)->setText(QString::number(b_config->par1)); ----------> hier passiert im zweiten Slot der Absturz, obwohl doch beides gleich aussieht!
table->item(2,0)->setText(QString::number(f_config->par2));
... usw.
}
Der Debugger läuft im ersten Slot beim Steppen wie zu erwarten über die Anweisungen "table->item(1,0)->setText(...)" hinweg. Beim zweiten Slot hingegen geht der Debugger beim Steppen in eine Datei
"qtablewidget.h" und dort zu
"inline void QTableWidgetItem::setText(const QString &atext) {...},
obwohl ich kein step-into, sondern nur step anklicke.
Das ganze sieht sehr mysteriös aus, weshalb ich für Tipps sehr dankbar wäre.
Hi, hab's gefunden:
Im Konstruktor b_Parameter fehlte das Erzeugen und Einfügen der QTableWidgetItems. Das Programm wollte Items, die es gar nicht gab, mit Inhalt füllen