Seite 1 von 1

[gelöst] Q_PROPERTY funktioniert nicht

Verfasst: 10. Dezember 2008 10:37
von Bronski
Hallo,
Ich habe einige Attribute meiner Klasse mit Q_PROPERTY verwendet:

Code: Alles auswählen



class T_partition:public Tdavids_class
{
Q_PROPERTY (QString dev READ get_device WRITE set_device) 

private:


protected:

public:

QString dev;


T_partition()
{
}


/* Die folgenden Funktionen werden, wenn dem Attribut dev etwas zugewiesen bzw abgefragt wird, nie erreicht !!!*/

void set_device(QString device_name)
{
partitions_info.refresh();
               
constructor_id = id_device_property;

#if defined(DEBUG_T_PARTITION)

cout << "set_device erreicht \n";
cout << "constructor_id: "<< constructor_id<<"\n"; 

#endif


dev = device_name;
init_device();


}

QString get_device()
{
#if defined(DEBUG_T_PARTITION)
cout << "get_device erreicht \n";
#endif

return dev;

}
Fehlermeldungen erscheinen keine.
1 Was habe ich falsch gemacht ?

2. Was genau machen Q_ENUM und Q_FLAGS ?

Vielen Dank im Vorraus für eure Antworten.

Verfasst: 10. Dezember 2008 10:58
von AuE
was genau steht'n in der doku was die machen?

was funktioniert denn nicht wie es soll?

Verfasst: 10. Dezember 2008 12:59
von Bronski
1.
Also, ich verstehe es so dem Attribut "dev" ausserhalb der Klasse ein Wert zugewiesen wird, dass die Funktion set_device(QString dev) ausgeführt wird.
Die Meldung "set_device erreicht erscheint nicht".

Ich dachte Q_PROPERTY funktioniert ähnlich wie der property -Bezeichner in Delphi - oder etwa nicht ?

2.
Die Doku:

Enumeration types are registered with the Q_ENUMS() macro. Here's the final class declaration including the property related declarations:

Code: Alles auswählen

    class MyClass : public QObject
    {
        Q_OBJECT
        Q_PROPERTY(Priority priority READ priority WRITE setPriority)
        Q_ENUMS(Priority)

    public:
        MyClass(QObject *parent = 0);
        ~MyClass();

        enum Priority { High, Low, VeryHigh, VeryLow };
        void setPriority(Priority priority);
        Priority priority() const;
    };

Another similar macro is Q_FLAGS(). Like Q_ENUMS(), it registers an enumeration type but marks it in addition as a set of "flags", i.e. the enumeration values can be OR'd together. An I/O class might have enumeration values Read and Write and accept Read | Write: such an enum is best handled with Q_FLAGS(), rather than Q_ENUMS().

Hier steht nur das Aufzählungen mit Q_ENUMS registriert werden.
Wo registriert ?

Verfasst: 10. Dezember 2008 13:06
von AuE
im normalfall würde man nen enum machen ala enum

Code: Alles auswählen

ebitstate{eunset = 0, eset = 1};
scheinbbar macht er das bei der property ohne das du viel coden musst.

bei den flags wird er es so machen das er dann in etwa sowas anlegt

Code: Alles auswählen

value1 0x001
value2 0x002
value3 0x004
value4 0x008
...
so das man die werte dann verodern kann also value = value1 | value2

womit value dann 3 wäre-das scheint das ganze Geheimniss zu sein.

Ob das property ding aus delphi kommt bzw das gleiche ist wie dort kann ich dir nicht sagen. da musst du die doku befragen!

Verfasst: 10. Dezember 2008 13:33
von Bronski
Danke,
ich habe jetzt eine Vorstellung was Q_ENUMS und Q_FLAGS machen.

Aber aus der Doku unter

http://www.potu.com/man/doc.trolltech.c ... rties.html

werde ich nicht ganz schlau:

Es kann doch nicht sein , dass wenn ich das Attribut einer Klasse setzen möchte, ich das umständlich über object->setProperty() machen muss- oder ?

Verfasst: 11. Dezember 2008 15:42
von Volker
Du kannst Properties auf zwei Arten manipulieren. Einmal direkt über die Methode, die unter WRITE beim Q_PROPERTY Makro angeben ist und einmal über die QObject::setProperty Methode. Was daran umständlich ist weiß ich allerdings nicht.

[gelöst] Q_PROPERTY funktioniert nicht

Verfasst: 11. Dezember 2008 18:29
von Bronski
Vielen Dank,
ihr habt mir sehr geholfen.

setProperty hat bei mir lange Zeit nicht funktioniert, weil ich versucht habe den neuen Wert des Attributs direkt zu übergeben und nicht in einer Variable zu QVariant.



Also:
partition3.setProperty("dev","/dev/sda9");

und nicht:

QVariant test_var ="/dev/sda9";
partition3.setProperty("dev",test_var);



Dies ist das erste was ich als umständlich empfinde.
Ich frage mich auch ob die Übergabe des Attributsnamens als String nicht fehleranfällig ist.

Das zweite ist:
Der Compiler meckert, wenn ich das mit Q_PROPERTY verwendete Attribut "dev" private oder protected deklariere.
Dadurch ist es möglich dev ausserhalb der Klasse zu verändern ohne dass set_device() aufgerufen wird.

Vielleicht bin ich auch einfach zu blöd Q_POPERTY richtig einzusetzen.
Es wäre toll wenn jemand von euch mal ein Beispiel geben könnte wie man das nach allen Regeln der Kunst macht.

Ansonsten nochmals:
Vielen Dank :D