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?
+1 Świetne pytanie! – cmannett85