2013-02-06 6 views
5

Mam proste pytanie Qt. Chcę, aby automatycznie wygenerowane pliki UIC pochodzą z niestandardowego interfejsu jak w klasie:Wyliczenie UIC wygenerowało klasę Qt UI z niestandardowego interfejsu

intencji

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

Wygenerowany plik UIC powinna wyglądać następująco:

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

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

Dlaczego?

Każda klasa Ui :: zajęłaby się implementacją MyUiInterface. W każdej klasie wywodzącej się z Ui :: Class (zob. The Multiple Inheritance Approach) będę mógł wywołać setupUi i retranslateUi, co ma sens, jeśli klasa wywodząca się z klasy UI :: Class jest klasą podstawową. Chcę, aby każdy widget pochodził z mojej podstawowej klasy abstrcat MyWidgetBase. Rozważmy następujący:

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 { 
}; 

Efekt jest każdy MyWidget czas :: changeevent() jest zatytułowany jako, retranslateUi tej konkretnej klasy jest tzw. W przeciwnym razie, zmiennaEvent musiała zostać ponownie wdrożona w każdej klasie. Byłoby to nieco sprzeczne z koncepcją "ponownego użycia kodu".

Myślę, że Qt UIC nie jest w stanie poradzić sobie z tą sytuacją, prawda? Czy istnieje podobny sposób rozwiązania tego problemu?

+0

+1 Świetne pytanie! – cmannett85

Odpowiedz

0

Niestety, czytanie XML Schema for ui files mówi nam, że nie można zautomatyzować korzystania z kompilatora uic.

Jednak nie jest dla mnie jasne, dlaczego chciałbyś zaimplementować to automatycznie - nawet jeśli Uic w jakiś sposób udaje się zaimplementować twój interfejs, będziesz nadal musiał ręcznie dodawać ciała funkcji, edytując wygenerowany plik .h, ponieważ jestem pewien, że nie ma sposobu na włączenie niestandardowego kodu do pliku xml, który będzie tłumaczony jako kod C++.

Dlaczego po prostu nie można ponownie wdrożyć setupUi i w swojej klasie MyWidget? Każda klasa Ui będzie miała jedną z tych klas, więc możesz ją zaimplementować na tym poziomie zamiast w klasie bazowej. Możliwe, że czegoś mi brakuje, ale uważam to za odpowiedni sposób na zrobienie tego.

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

}; 

Dzięki takiemu podejściu, nie trzeba do reimplement changeEvent() którymś z niestandardowych widżety i changeEvent będzie nadal wywołać odpowiednią retranslateUi().

+0

Ok, myślę, że masz na myśli to, aby ustawić SetupUi i retranslateUi jako metody wirtualne w klasie MyWidgetBase i zaimplementować je w MyWidget (i wszystkich innych pochodnych od MyWidgetBase), wywołując tam Ui :: MyWidget :: setupUi (this). To rzeczywiście byłoby rozwiązanie. Z moim rozwiązaniem nie jest wymagane edytowanie wygenerowanych plików nagłówkowych w taki sposób, aby kompilator UI działał zgodnie z intencją :) – bkausbk

+0

@bkausbk Niestety, chyba że ktoś tutaj nie zna żadnego hacka, jak to zrobić, nie sądzę to jest możliwe - ale zobaczmy, widziałem mnóstwo rzeczy pracujących po wszystkim :) –

Powiązane problemy