2016-04-25 8 views
0

Ich habe ein paar Widgets in QtCreator, die von der gleichen Klasse gefördert werden. Allerdings möchte ich, dass sie feine Unterschiede zwischen den beiden haben, daher möchte ich einige Unterschiede in der UI-Datei bestehen, die die hochgestufte Klasse verwenden kann, um sich zu unterscheiden. Dynamische Eigenschaften scheinen der Weg zu sein, also habe ich im UI-Editor jedem promoted Widget eine dynamische Eigenschaft zugewiesen. In dem Code habe ich versucht, die Eigenschaft zugreifen, aber bemerkte es nur scheint Konstruktion verfügbar Post zu sein (wahrscheinlich, weil Qt setProperty() Aufruf, nachdem das Objekt erstellt wird.Qt: wann kann ich auf dynamische Eigenschaften von qtcreator zugreifen?

MyWidget::MyWidget(QWidget* parent) : QGLWidget(parent) 
{ 
    this->property("someProperty").toString(); // returns blank 
} 

void MyWidget::initializeGL() 
{ 
    this->property("someProperty").toString(); // returns string set in UI file 
} 

Also meine Frage wie nutzen Menschen diese Eigenschaften für Konstruktor Ich könnte das einfach in initializeGL tun, aber das scheint merkwürdig, da diese Eigenschaften nicht mit der Initialisierung von OpenGL in Verbindung stehen. Ich könnte mir vorstellen, dass ich auch eine Verbindung mit dem geänderten Signal der Eigenschaft herstellen könnte dies?

Antwort

1

Wenn der generierte Code für setupUi() von Ihrer .ui-Datei in etwa so funktioniert:

MyWidget *w = new MyWidget; 
w->setProperty(...); 

dann greift Ihr Konstruktor auf eine Meta-Eigenschaft zu, die noch nicht existiert.

Sie können QObject::event() erneut implementieren, um QDynamicPropertyChangeEvent s zu erfassen, damit Sie nach der Initialisierung der Eigenschaft handeln können.

bool MyWidget::event(QEvent *ev) 
{ 
    if (ev->type() == QEvent::DynamicPropertyChange) { 
     if (QDynamicPropertyChangeEvent *propEv = static_cast<QDynamicPropertyChangeEvent *>(ev)) { 
      if (propEv->propertyName() == "someProperty") 
       ... 
     } 
    } 
} 

Beachten Sie, dass dieser Code jeder Zeit gibt es eine dynamische Eigenschaftsänderung aufgerufen werden.

Ein besserer Ansatz könnte sein, eine Funktion zum Ausführen der notwendigen Initialisierung auf dem Widget zu erstellen, nachdemsetupUi() usw. aufgerufen und die dynamische Eigenschaft erstellt wurde.

Normalerweise wird dynamischen Eigenschaften im Konstruktor ein Standardwert zugewiesen, so dass sie immer verfügbar sind und später nicht null sind.

setProperty("someProperty", defaultValue); 
+0

Ich habe Ihre Antwort als richtig markiert, weil es funktioniert, aber ich endete mit einem anderen Ansatz. Ich habe gerade dünne Unterklassen erstellt, die gerade diese Eigenschaften hatten, so dass sie zum Zeitpunkt der Erstellung verfügbar waren und diese in Qt Creator hochgestuft wurden. Schien sauberer als Eigenschaften in der ui-Datei zu haben und sich mit einer anderen init-Funktion beschäftigen zu müssen. – voodoogiant

+0

Definitiv der bessere Ansatz. Ich war auf einer Boulevardzeitung und ging wegen der Tippgeschwindigkeit für das unmittelbare Problem. –

Verwandte Themen