( tr3w | 2007. 05. 04., p – 18:16 )

A gondot az okozza, hogy a QTabWidget::page(int) QWidgetre mutató pointert ad vissza, QWidgetnek meg nincs feszultsegSlider adattagja.

A kérdés tehát az, hogy hogyan lesz a QWidget*-ból MotorTab*.


QWidget* ptr=motorTabWidget->page(2);

//C-s szintaxis: (csak kompatibilitás miatt van)
MotorTab* mt1=(MotorTab*) ptr;  

//C++-os: 
MotorTab* mt2=static_cast<MotorTab*>(ptr);  
// Működik de nem szép, ha valamit eltoltál (pl a QWidget nem ősosztálya a MotorTabnak,
// vagy bármi miatt értelmetlen a konverzió), ez akkor is megcsinálja és 
// az adattagra hivatkozásnál látszólag minden rendben, tagfüggvénytől meg elszáll..

//Méginkább C++-os:
MotorTab* mt3=dinamic_cast<MotorTab*>(ptr);
// Ha a konverzió meghiusúl, mt3==0, ezt egyszerű if-fel ellenőrizheted.

Tehát röviden:


motorTab = dynamic_cast<MotorTab*>(motorTabWidget->page(2));
Q_ASSERT(motorTab!=0);
motorTab->feszultsegSlider->setValue(100);

Én szoktam assertezni, biztos ami biztos, ha baj van rögtön kiderül (debug fordításnál), a relese-ből meg egyszerűen kimarad ez az ellenőrzés (tehát nem lassít, nem mintha számítana...).
http://doc.trolltech.com/3.3/qapplication.html#Q_ASSERT

"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o