Seite 1 von 1

Q_PROPERTY für eigenschaften von membern?

Verfasst: 1. März 2009 17:44
von -=Freaky=-
hi,

ist es irgendwie möglich, die eigenschaften von membern einer klasse in dieser selbst als Q_PROPERTY verfügbar zu machen?
kleines beispiel, wie ich es u.a. probiert habe:

Code: Alles auswählen

class SettingsClass: public QObject
{
    Q_OBJECT

    Q_PROPERTY( int m_int READ getInt WRITE setInt )

    friend class MainWindow;

public:
    SettingsClass( QObject *parent = 0 )
	:QObject( parent )
    { /* ... */ }

    SettingsClass( const SettingsClass &p_other ){ /* ... */ }
    SettingsClass& operator=( const SettingsClass &p_other ){ /* ... */ }

    void setInt( const int p_int ){ m_int = p_int; }
    void setDouble( const double p_double ){ m_double = p_double; }
    void setString( const QString &p_string ){ m_string = p_string; }


    int getInt() const{ return m_int; }
    double getDouble() const{ return m_double; }
    QString getString() const{ return m_string; }


private:
    int m_int;
    double m_double;
    QString m_string;
};

Code: Alles auswählen

class MainWindow : public QMainWindow
{
    Q_OBJECT

    Q_PROPERTY( SettingsClass m_settings READ getSettings WRITE setSettings )
    
    Q_PROPERTY( int m_settings::m_int READ m_settings::getInt WRITE m_settings::setInt ) // und das hier klappt natuerlich nicht ganz

public:
    MainWindow(QWidget *parent = 0)
        :QMainWindow( parent )
    { /* ... */ }
    ~MainWindow(){ /* ... */ }

    SettingsClass& getSettings(){ return m_settings; }
    void setSettings( const SettingsClass &p_settings ){ m_settings = p_settings; }

private: // oder auch public, macht keinen unterschied
    SettingsClass m_settings;
};
das problem liegt also quasi in der 2. Q_PROPERTY-zeile in der MainWindow klasse ...
bisher konnte ich keine infos dazu finden, ob es auch so moeglich ist, oder nur direkte member der klasse als properties verfuegbar gemacht werden koennen ...
zur not muss ich mir eben was anderes ausdenken ...

kann mir da jemand weiterhelfen?
danke im voraus!

mfg,
julian

Verfasst: 1. März 2009 21:25
von The User
Also eigentlich sollte das gehen, in dem du die Getter auch in MainWindow schreibst.
Wofür brauchst du das denn?

Verfasst: 1. März 2009 21:43
von -=Freaky=-
ja aus dem beispiel wird der sinn wohl nicht so klar ... ;)
ich habe halt eine klasse und diverse eigenschaften wurden in eine andere klasse ausgelagert, (die auch noch mit QVariants arbeitet, also gibt es genau 1 set und 1 get methode fuer alle settings darin ...).

diese settings, die ausgelagert wurden, sollen nun aber trotzdem als properties der "hauptklasse" verfügbar sein, obwohl sie eben ausgelagert sind.

zu deinem vorschlag:
das wuerde zwar evtl. funktionieren, aber wenn ich getter und/oder setter in MainWindow bzw. die jew. übergeordnete "hauptklasse" nehme, kann ich auch die paar variablen mit ruebernehmen und die uebersichtlichkeit durch die auslagerung ist hinfaellig ... und das ist leider gerade nicht sinn und zweck der aktion ...

ich weiss auch gar nicht, ob das ganze wirklich noetig ist, aber ich habe damit einige zeit rumprobiert und es interessiert mich wirklich, wie/ob sowas machbar ist ...

mfg,
julian

Verfasst: 2. März 2009 17:27
von The User
Warum willst du denn dann überhaupt die Properties haben?

Verfasst: 2. März 2009 18:23
von -=Freaky=-
z.b. um in nem property dialog (im designer oder sonstwo) alles als properties d. "hauptklasse" zu haben, waere das nuetzlich.

mfg,
julian

Verfasst: 2. März 2009 21:49
von The User
Du musst dann wohl zwangsläufig Getter und Setter ins Mainwindow packen. Der Vorteil der Auslagerung ist ja nicht weg: Du kannst ja immer noch die ganze Konfiguration austauschen.

Verfasst: 2. März 2009 22:05
von -=Freaky=-
alles klar, danke fuer deine hilfe!
ja, der eine vorteil ist natuerlich, dass das alles einfach austauschbar ist.
der andere aber imho, dass die klasse etwas uebersichtlicher wird vom umfang an member-variablen und -methoden.

aber wie auch immer, dann wird das ganze wohl nicht anders loesbar sein ... was solls :)

mfg,
julian

Verfasst: 3. März 2009 18:32
von The User
Die Methoden schaden doch nicht ud der Aufwand ist auch nicht hoch, kannst dir ja ein Makro schreiben, dass dir die Getter und Setter erzeugt.

Verfasst: 3. März 2009 19:47
von -=Freaky=-
The User hat geschrieben:Die Methoden schaden doch nicht ud der Aufwand ist auch nicht hoch, kannst dir ja ein Makro schreiben, dass dir die Getter und Setter erzeugt.
hm, das ist wirkliche eine coole idee ... :D
das koennt ich ggf. probieren, ja.
danke fuer den tipp!
so unoffensichtlich isses nicht, aber selbst drauf gekommen waer ich so schnell auch nicht. :)

mfg,
julian