2017-02-07 5 views
1

Ich arbeite an einem Projekt mit Qt 5.7 mit C++. Ich stecke in einem seltsamen Problem fest.Abrufen von übergeordneten QTableWidget von seiner Zelle Widget-Element

Ich habe eine QTableWidget, die eine QComboBox auf seiner einzigen Zelle enthält. Vereinfachter Code ist wie folgt.

QTableWidget *tab = new QTableWidget(); 
tab->insertColumn(0); 
tab->insertRow(0); 
QComboBox *cb = new QComboBox(tab); 
cb->addItem("A"); 
cb->addItem("B"); 
tab->setCellWidget(0, 0, cb); 

Jetzt auf currentIndexChanged(int) Signal des QComboBox, ich bin eine Verbindung zu einem SLOT wo ich versuche, den Zeiger des QTableWidget abzurufen wie folgt,

QComboBox* cb = qobject_cast<QComboBox*>(sender()); 
QWidget* par = cb->parentWidget(); 

Aber ich bin nicht immer die gleiche Zeiger als der tatsächliche QTableWidget.

Ich habe auch versucht, wie folgt, aber immer noch fehlgeschlagen.

Kann jemand einen anderen Weg vorschlagen oder den Fehler in diesem Codesegment aufzeigen?

Mögliche Lösung gefunden

Eltern Widget cb->parent()->parent() mit abgerufen werden können. Dieser Prozess ist zwar nicht dokumentiert, aber nicht zuverlässig.

Antwort

1

Der Grund ist, dass die QTableWidget ist kein direktes Elternteil von QComboBox, sondern eine große Elternteil. Aber selbst dies ist ein Implementierungsdetail und kann nicht zuverlässig sein, weil es nicht dokumentiert ist.

Ein Ausweg könnte den QTableWidget Zeiger woanders speichern.

+0

Das Hinzufügen einer neuen Mitgliedsvariablen in meiner Klasse zum Speichern des Zeigers ist der letzte Ausweg. Das Abrufen des übergeordneten Elements aus dem Zeiger wäre eine elegante Lösung. Können Sie andere Lösungen vorschlagen? –

+0

Wenn Sie C++ 11 oder C++ 14 verwenden können, verwenden Sie lambdas. Hier ist, wie Sie es tun: https://medium.com/genymobile/how-c-lambda-expressions-can-improve-your-qt-code-8cd524f4ed9f#.w0xett5c2. Sie können einen Zeiger auf das QTabWidget erfassen und den Job dann ausführen. Es ist auch typsicherer als die Makros 'SIGNAL()' und 'SLOT()'. Kurz gesagt: Es macht das Leben so viel einfacher. –

Verwandte Themen