Seite 1 von 1

Auf Steuerelemente aus aunderer Klasse zu greifen

Verfasst: 14. Mai 2013 19:06
von Murmele
Hi,
ich habe seit kurzer Zeit angefangen mit QT programme zu programmieren. Ich bin gerade dabei ein Programm zu schreiben bei dem ich die Serielle Schnittstelle ansprechen kann. Ich habe ein MainWindow, wo sich alle Steuerelemente befinden. Aus der Klasse Serial möchte ich mit der Klasse Log Fehlermeldungen in ein ListView schreiben. Ich habe der Klasse Log da Ui der MainWindow verebt, um auf die Steuerelemente zugreifen zu können. Doch bei jedem Aufruf wird das Programm unerwartet beendet. Die Settingsklasse ist ein anderes Fenster, wo einstellungen getroffen werden können. Um das Fenster wieder zu schließen wurde die MainWindow als Pointer übergeben, aber mir erscheint diese Methode nicht sehr elegant. Deshalb probierte ich es mit Verebung.

Weiß jemand wie man dies elegant löst?
Im Anhang ist der komplette Quellcode. Hier noch ein paar codeausschnitte:
log.h:

Code: Alles auswählen

#include <QMainWindow>
#include "ui_mainwindow.h"

class Log : public QMainWindow, public Ui::MainWindow
{
    Q_OBJECT
public:
    explicit Log(QWidget *parent = 0);
    void printError(QString error);
    
signals:
    
public slots:
private:
    
    
};
serial.cpp:

Code: Alles auswählen

bool serial::openSerialPort(){


    Log *error = new Log();

    error->listLog->addItem("Test"); // Hier stürzt das Programm ab
Dieser Fehler kommt, wenn ich im Debugmodus Schritt für Schritt durchgehe.
Der Prozess wurde nach Erhalt eines Signals vom Betriebssystem angehalten.

Name des Signals :
SIGSEGV
Bedeutung :
Segmentation fault

Re: Auf Steuerelemente aus aunderer Klasse zu greifen

Verfasst: 14. Mai 2013 23:46
von veeman
Hallo Murmele,

das geht mit Vererbung nicht. Der weg über die Pointer war schon richtig.

Erklärung:
Du erstellst momentan eine abgeleitete Klasse von QMainWindow und deinem Ui, welche du dann mit new instanziert.
Dies bedeutet zu Gleich das es ein komplett neues von deinem ersten Hauptfenster verschiedenes Objekt ist und damit die Eigenschaften jeweils für sich selbst stehen.
Der absturzt wird von der nicht initialisierten Widgets des neuen Fenster herbei gefürt (diese werden mit setupUi erstellt).


Noch eine Bemerkung zu diesem Codeabschnitt:

Code: Alles auswählen

void MainWindow::openSettingsWindow(){
    new_settings_window = new Settings(this,settings_value);
    new_settings_window->show();
}
Beachte hier das jedes mal wenn du auf das Menu klickst jeweils ein NEUES Objekt erstellt wird und während der Laufzeit nicht mehr entfernt wird. Da fehlt halt eine Abfrage ob es nicht doch schon das Objekt gibt.
Durch mehrfaches klicken auf das Menu läuft der Speicher voll.

Aufgrund der Architektur von Qt und das du dem Settings Fenster ein parent an gibst wird es automatisch beim Beenden des Programm freigegben. Dennoch solltest du darauf achten das es dann nicht mehrfach erstellt wird.

Re: Auf Steuerelemente aus aunderer Klasse zu greifen

Verfasst: 15. Mai 2013 18:56
von Murmele
Vielen Dank für die Antwort!!! Gibt es nur diesen Weg auf ein Steuerelement zuzugreifen oder geht das auch anders weil somit muss man jeder Klasse im Konstruktor immer MainWindow mit übergeben. Könnte ich die Variable new_settings_window auch direkt in der Funktion deklarieren? oder wird das objekt gelöscht, sobald die funktion beendet wurde?

Re: Auf Steuerelemente aus aunderer Klasse zu greifen

Verfasst: 17. Mai 2013 18:45
von veeman
Das ist wohl die beste Methode. Warum jeder Klasse? Nur denen die es auch wirklich verwenden.

Je nach dem wie du die Variable definierst new_settings_window wird diese auch gelöscht oder eben auch nicht.
Wie gesagt eine einfache if Abfrage ob das die Variable initialisiert ist sollte reichen.