Qt - gewusst Wie: konvertieren von QObject UI-Elementen?

Arbeite ich in Qt 4.7, und ich habe ein QWidget-Objekt in meinem dialog. Ich müssen gehen durch jeder der Kinder und extrahieren Sie den aktuellen text in eine QStringList. Jedes andere Objekt ist ein QCheckBox, und der rest sind QComboBoxes (ich würde nur den text-Teil der beiden). Bisher ist die einzige Möglichkeit die ich mir vorstellen könnte, dies zu tun wäre, um die Kinder () - Funktion, um Sie als QObject*'s und warf Sie, wie das ist:

QStringList textlist;
for(int i = 0; i < ui->myWidget->children().size(); i++)
{
    if(i % 2 == 0)
    {
        QCheckBox *q = (QCheckBox *)ui->myWidget->children().at(i);
        textlist.append(q->text());
    }
    else
    {
        QComboBox *q = (QComboBox *)ui->myWidget->children().at(i);
        textlist.append(q->currentText());
    }
}

Jedoch, wenn ich versuche, dies zu nutzen, es baut und kompiliert in Ordnung, aber dann stürzt ab, wenn Sie ausgeführt werden. Habe ich überprüft und beide Klassen sind Unterklassen (wenn auch indirekt durch QAbstractButton und QWidget) von QObject, die die Art der Objekte in der Liste ui->myWidget->die Kinder(), so habe ich das Gefühl, dass Sie sollten in der Lage sein, zu wirken auf diese Weise. Ich habe nicht viel gearbeitet mit dieser Art der Sache vor, also ich nicht sicher bin, ob es einen besseren Weg, dies zu tun. Wenn jemand eine Idee hat, es würde sehr geschätzt werden. Danke!

UPDATE: So, ich kann nicht das casting auf diese Weise zu arbeiten oder mit der qobject_cast. Ich HABE allerdings entdeckt, dass ich gehen kann, von QObject, QWidget, und ich denke, ich sollte in der Lage sein zu gehen von QWidget, um die notwendigen Gegenstände mit dynamic_cast, aber das funktioniert auch nicht. Jetzt habe ich dieses:

QStringList textlist;
for(int i = 0; i < ui->myWidget->children().size(); i++)
{
    QWidget *qw = qobject_cast<QWidget*>(ui->myWidget->children().at(i)
    if(i % 2 == 0)
    {
        QComboBox *q = dynamic_cast<QComboBox*>(qw);
        if(q)
        {
            textlist.append(q->text());
        }
    }
    else
    {
        QCheckBox *q = dynamic_cast<QCheckBox*>(qw);
        if(q)
        {
            textlist.append(q->currentText());
        }
    }
}

Wenn jemand eine Idee hat, würde ich mich über Hilfe freuen. Danke.

UPDATE2: ich habe nicht viel gefunden online hilft, die mit dieser noch, so kann ich Sie genauso gut Fragen, wie gut, wenn es trotzdem zu tun, OHNE casting, d.h. die Objekte direkt aus dem QWidget in Ihrer ursprünglichen Art, ich würde wirklich zu schätzen, dass wie gut. Ich bin nicht heartset auf meine aktuelle Strategie oder irgendetwas, es war der einzige Weg, ich könnte denken, es zu tun - ich werde nichts nehmen, das funktioniert an dieser Stelle.

Verwenden qobject_cast<QComboBox*>(ptr) eher als die C-Stil-casts, die Sie verwenden, und überprüfen Sie, dass der Guss gelingt, bevor der Zugriff auf den text. Die Weise, die Sie der Verwendung von C-Stil-casts ist wirklich gefährlich, denn es gibt keine Warnung, wenn der cast fehlschlägt. Mit einer ausgefallenen C-style cast, am besten Sie Holen sich einen Absturz, wenn Sie gehen, um zu versuchen und verwenden Sie den Mauszeiger. Im schlimmsten Fall, Sie bekommen silent data corruption.
Gibt es irgendeinen trick, um zu bekommen, dass die Arbeit? Es gibt mir Fehler wie "cannont konvertieren von 'overloaded-function' zu 'QCheckBox*'"
Nie Meinung über mein Kommentar, es war nur ein dummer Tippfehler meinerseits. Danke!
Vermeiden Sie im Allgemeinen C-style cast in C++ - code, und verwenden Sie es mit OOP-Objekten. Beachten Sie, dass die Zeiger auf dieselbe Objekt-Instanz kann mit unterschiedlichen Wert, abhängig von der Art des Zeiger.

InformationsquelleAutor thnkwthprtls | 2014-02-13

Schreibe einen Kommentar