2017-02-07 10 views
1

Я работаю над проектом с использованием Qt 5.7 с C++. Я застрял в странной проблеме.Извлечение родительского QTableWidget из элемента его виджета

У меня есть QTableWidget, который содержит QComboBox на своей единственной ячейке. Упрощенный код выглядит следующим образом.

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); 

Сейчас на currentIndexChanged(int) сигнал QComboBox, я подключаю к SLOT, где я пытаюсь получить указатель на QTableWidget следующим образом,

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

Но, я не получаю то же самое указатель как фактический QTableWidget.

Я также пытался сделать следующее, но все еще не удалось.

QComboBox* cb = qobject_cast<QComboBox*>(sender()); 
QObject *par = cb->parent(); 
QTableWidget *tab = qobject_cast<QTableWidget *>(par); 

Может кто-нибудь предложить другой способ сделать это или указать на ошибку в этом сегменте кода?

Возможное решение Найдено

Родитель Widget можно получить с помощью cb->parent()->parent(). Хотя этот процесс не документирован, поэтому он не является надежным.

ответ

1

Причина в том, что QTableWidget не является прямым родителем QComboBox, но является великим родителем. Но даже это деталь реализации, на которую нельзя положиться, потому что она не документирована.

Выход из устройства может содержать указатель QTableWidget в другом месте.

+0

Добавление новой переменной-члена в мой класс для хранения указателя будет последним выходом. Извлечение родителя из указателя было бы изящным решением. Можете ли вы предложить некоторые другие решения? –

+0

Если вы можете использовать C++ 11 или C++ 14, используйте lambdas. Вот как вы это делаете: https://medium.com/genymobile/how-c-lambda-expressions-can-improve-your-qt-code-8cd524f4ed9f#.w0xett5c2. Вы можете захватить указатель на QTabWidget и выполнить задание. Он также более безопасен по типу, чем макросы 'SIGNAL()' и 'SLOT()'. Короче: это делает жизнь намного проще. –