Sto provando a prendere un QVariant
(in questo caso da un QProperty
generato su una classe) e in base al tipo, restituire un QWidget
che consente di modificarlo in modo appropriato.
una firma per la funzione di conversione potrebbe essere simile a questa:
template<typename T>
QWidget * createWidget(const QString& label, const T& value, QWidget * parent = nullptr);
Tuttavia, poiché ho a che fare con QVariant
s, ho bisogno di un modo per attivare il tipo di QVariant
per scegliere la funzione corretta overload / template.
La mia idea era di avere semplicemente una gigantesca istruzione switch e specializzare un modello per ogni tipo (al fine di evitare una sostituzione errata del sovraccarico, in particolare con tipi int-like)
vale a dire:
QWidget *createDisplayWidget(const QString &label, const QVariant &q_variant,
QWidget *parent = nullptr) {
QWidget *display_widget = nullptr;
switch (q_variant.userType()) {
case QMetaType::Bool:
display_widget = createWidget(label, q_variant.value<bool>(), parent);
break;
case QMetaType::Int:
display_widget = createWidget(label, q_variant.value<int>(), parent);
break;
....
....
....
}
return display_widget;
}
Mi stavo chiedendo ci sono alternative legittime a questo approccio con diversi compromessi? Non riesco a pensare a nessun altro metodo per svolgere questo compito, o qualcosa che si adatta meglio al mio caso d'uso. Mi sembra chiaro e solo la nuova funzione e un caso aggiuntivo sullo switch dovranno essere aggiornati con nuovi tipi, ma ciò è anche restrittivo in quanto richiederà la ricompilazione di quella porzione di codice.