qobject_cast

Alles rund um die Programmierung mit Qt
Antworten
otternase
Beiträge: 62
Registriert: 25. Januar 2008 12:20

qobject_cast

Beitrag von otternase »

Hallo

Anfänger braucht Hilfe:

Ein object_cast liefert nur einen Nullzeiger, obwohl das zu castende Objekt eindeutig vom Typ der Zielklasse ist:

a) meine eigene Klasse, abgeleitet von QWidget:

Code: Alles auswählen

class myBuaWidget : public QWidget
{
    Q_OBJECT
...
}
b) als Plugin im Designer

c) ui-File erzeugt mit meinem Widget:

Code: Alles auswählen

  <widget class="myBuaWidget" name="mein Widget" >
   <property name="geometry" >
    <rect>
...
  </widget>
d) ui File mittels QUiLoader geladen:

Code: Alles auswählen

int main(int argc, char *argv[])
 {
     QApplication app(argc, argv);

        QUiLoader loader;

        QFile file("test.ui");
        file.open(QFile::ReadOnly);
        QWidget *myWidget = loader.load(&file, 0);
        file.close();
e) Liste aller Widgets in myWidget erzeugt und Infos zu jedem Widget ausgegeben:

Code: Alles auswählen

        QList<QWidget *> widgets = myWidget->findChildren<QWidget *>();
        foreach(QWidget *widget, widgets) {
          qDebug() << widget->objectName() << widget->metaObject()->className() << widget;
          myBuaWidget *buawidget=qobject_cast<myBuaWidget *>(widget);
          qDebug() << buawidget;
          }
Ausgabe seltsamerweise wie folgt:
"mein Widget" myBuaWidget myBuaWidget(0x8105650, name = "mein Widget")
QObject(0x0)
warum funktioniert der qobject_cast nicht, warum liefert er einen Nullzeiger?
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

Ich kann mich daran erinnern, dass ich auch mal sowas hatte (allerdings nie bei einem einfachen "QWidget").

1. Bist du 100% sicher, dass beide (Plugin und Anwendung) mit der gleichen Header-Version compiliert wurden? ("make distclean; qmake; make" in beiden Projekten)

2. was gibt "qDebug() << widget->inherits("myBuaWidget");" (vermutlich false?)

3. was gibt "qDebug() << dynamic_cast<myBuaWidget *>(widget);
Antworten