Seite 1 von 1

[gelöst]Absturz in QTableWidget

Verfasst: 16. Dezember 2007 01:22
von qtNiko
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:

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
Jetzt die beiden QTableWidget selbst. Die Klassendefinitionen sind bis auf die Namen identisch:

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
};
Nun die beiden Konstruktoren:

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
Und schließlich die beiden Slot on_cancelButton_clicked():

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.
}
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 :cry: