Я работаю над проектом с использованием 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()
. Хотя этот процесс не документирован, поэтому он не является надежным.
Добавление новой переменной-члена в мой класс для хранения указателя будет последним выходом. Извлечение родителя из указателя было бы изящным решением. Можете ли вы предложить некоторые другие решения? –
Если вы можете использовать C++ 11 или C++ 14, используйте lambdas. Вот как вы это делаете: https://medium.com/genymobile/how-c-lambda-expressions-can-improve-your-qt-code-8cd524f4ed9f#.w0xett5c2. Вы можете захватить указатель на QTabWidget и выполнить задание. Он также более безопасен по типу, чем макросы 'SIGNAL()' и 'SLOT()'. Короче: это делает жизнь намного проще. –