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.
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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie denken über die Verwendung
qobject_cast
. Nach dem Guss sollten Sie auch prüfen, ob das Objekt gültig ist.Aber das scheint immer noch wie ein schlechtes design für mich. Die widget-Klasse, die enthält die comboboxes und checkboxes sollten eine Funktion haben, das geht über die checkboxes und comboboxes und gibt einen
QStringList
. Dann könntest du einfach anrufen, die Funktion.Hier ist ein Beispiel
mywidget.h:
mywidget.cpp:
Dann in Ihre andere Klasse, die Sie können einfach anrufen
getCheckBoxTextList
odergetComboTextList
wie diese:Eigentlich, leider muss ich zurückziehen, der Letzte Kommentar. Ich lief einige tests und die if-Anweisungen verhindert es abstürzt, aber das wirft immer noch nicht zu funktionieren scheint, wenn ich eine else mit if(q), es geht um die else-Anweisungen 🙁 Für das Protokoll, ich habe es in das format der Antwort oben, nur mit else-Anweisungen Hinzugefügt, um zu gehen zusammen mit der wenn(q) Aussagen EDIT: ich HABE allerdings erfahren, dass er erfolgreich Umwandlung von QObject* QWidget*, also, wenn ich herausfinden kann wie man von QWidget* QCheckBox* ich werde eingestellt werden.
Der Grund Ihrer Umwandlung fehlschlägt, ist weil Sie versuchen, zu werfen Objekt
QCheckBox
obwohl es völlig verschiedene Art ist. Dieses ist, weil Ihre Logik nicht funktioniert. Gießen Sie es aufQWidget
frist wird Ihnen nicht helfen. Sie können entfernen Sie Ihreif(i %2 == 0)
- Anweisung und die entsprechendenelse
Anweisung und nur überprüfen, wenn ein Zauber funktioniert. Aber ich würde noch empfehlen, dass Sie eine UnterklasseQWidget
fügen Sie IhreQCheckBox
undQComboBox
Objekte, und fügen Sie eine Funktion, die geht durch Sie hindurch und gibt einenQStringList
. Dass Weise werden Sie nicht haben, um jedes casting, und es werden mehr OOP.Aber nicht QCheckBox und QComboBox bereits Unterklassen von QWidget?
...OK, also ich habe ehrlich gesagt keine Ahnung warum, aber gestern Nachmittag, als ich dies versuchte, es hat nicht funktioniert... und nun heute morgen tut es haha. Ich habe nichts verändert in den code, vielleicht war es etwas falsch mit der kompilierten Objekt-Dateien oder sowas... ehrlich gesagt, ich weiß es nicht, aber jetzt ist Ihr code funktioniert, vielen Dank!
InformationsquelleAutor thuga