2013-02-06 7 views
5

Ho una domanda Qt semplice. Voglio che i file UIC generate automaticamente derivano da una classe di un'interfaccia personalizzata come in:Derive UIC ha generato la classe dell'interfaccia utente Qt dall'interfaccia personalizzata

Intenzione

class MyUiInterface { 
public: 
    virtual void setupUi(QWidget* w) = 0; 
    virtual void retranslateUi(QWidget*w) = 0; 
}; 

file di UIC generato dovrebbe essere simile:

class Ui_MyWidget { 
public: 
    void setupUi(QWidget* w) { 
     ... 
    } 
    void retranslateUi(QWidget* w) { 
     ... 
    } 
}; 

namespace Ui { 
    class MyWidget : public MyUiInterface , public Ui_MyWidget {}; 
} 

Perché?

Ogni Ui :: Class sarebbe quindi implementare MyUiInterface. In ogni classe che deriva da Ui :: Class (vedi The Multiple Inheritance Approach) sarei stato in grado di chiamare setupUi e retranslateUi che ha senso se la classe che deriva dalla UI :: classe Class è una classe di base sia. Voglio che ogni widget sia derivato dalla mia classe base abstrcat MyWidgetBase. Prendere in considerazione seguente:

class MyWidgetBase abstract : public QWidget, protected MyUiInterface { 
protected: 
    void changeEvent(QEvent *e) { 
     QWidget::changeEvent(e); 
     if (e->type() == QEvent::LanguageChange) { 
      retranslateUi(this); // Still abstract here 
     } 
    } 
}; 

class MyWidget : public MyWidgetBase : public Ui::MyWidget { 
}; 

L'effetto è, ogni volta myWidget :: ChangeEvent() è callled, retranslateUi di quella specifica classe si chiama. Altrimenti changeEvent doveva essere reimplementato in ogni classe. Questo sarebbe un po 'contrario al concetto di "riutilizzo del codice".

Penso Qt UIC non è in grado di gestire questa situazione non è vero? C'è un modo simile per risolvere questo problema?

+0

+1 Ottima domanda! – cmannett85

risposta

0

Purtroppo, leggendo XML Schema for ui files ci dice che questo non è possibile automatizzare usando il compilatore UIC.

Tuttavia, non è chiaro per quale motivo si vorrebbe implementarlo automaticamente - anche se l'Uic in qualche modo riesce a implementare l'interfaccia, sarà comunque necessario aggiungere corpi delle funzioni a mano, modificando il file .h generato, sono sicuro che non c'è modo di includere il codice personalizzato nel file xml che verrà tradotto come codice C++.

Perché non si reimplementano.e retranslateUi nella classe MyWidget? Ogni classe Ui avrà una di queste classi, quindi puoi implementarla a questo livello, invece della classe base. È possibile che mi manchi qualcosa, ma vedo questo come un modo appropriato per farlo.

class MyWidget : public MyWidgetBase, public Ui::MyWidget { 
public: 
    void setupUi(QWidget* w) { 
     ... 
    } 
    void retranslateUi(QWidget* w) { 
     ... 
    } 

}; 

Con questo approccio, non c'è bisogno di reimplementare changeEvent() in uno dei tuoi widget personalizzati, e changeEvent sarà ancora chiamare il appropriata retranslateUi().

+0

Ok, penso che quello che vuoi dire è fare setupUi e retranslateUi come metodi virtuali in classe MyWidgetBase e implementare in myWidget (e tutti gli altri derivati ​​da MyWidgetBase) chiamando Ui :: :: myWidget setupUi (questo) lì. Questa sarebbe davvero una soluzione. Con la mia soluzione non è richiesto di modificare i file di intestazione generato dal modo in cui il compilatore _if_ UI avrebbe funzionato come ho intenzione :) – bkausbk

+0

@bkausbk Purtroppo, a meno che qualcuno qui non sa fare altre come fare questo, non credo è possibile - ma vediamo, ho visto un sacco di cose che funzionano dopotutto :) –

Problemi correlati