Auf Steuerelemente aus aunderer Klasse zu greifen

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
Murmele
Beiträge: 7
Registriert: 14. Mai 2013 14:30

Auf Steuerelemente aus aunderer Klasse zu greifen

Beitrag 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
Dateianhänge
SerialInterface.zip
(70.64 KiB) 341-mal heruntergeladen
veeman
Beiträge: 277
Registriert: 3. Oktober 2012 01:43
Kontaktdaten:

Re: Auf Steuerelemente aus aunderer Klasse zu greifen

Beitrag 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.
Murmele
Beiträge: 7
Registriert: 14. Mai 2013 14:30

Re: Auf Steuerelemente aus aunderer Klasse zu greifen

Beitrag 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?
veeman
Beiträge: 277
Registriert: 3. Oktober 2012 01:43
Kontaktdaten:

Re: Auf Steuerelemente aus aunderer Klasse zu greifen

Beitrag 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.
Antworten