PDA

View Full Version : findChildren() via parentWidget()-> gives other output than via this-> in the parent



shock
24th November 2011, 20:33
Hey folks!

It seems findChildren() does not find one specific widget (ever the same) if searched for via "parentWidget()->parentWidget()->findChildren<QWidget *>();"
but it can be find if i do "findChildren<QWidget *>();" in parentWidget of the parentWidget() ... i am sry if it might sound confusing ;)

Code should say more than tousand words i think...
There are 3 widgets (DeviceWrapperView, DeviceView, DPTWidget): DeviceViewWrapper contains DeviceView and DeviceView contains DPTWidget..



void DPTWidget::disableWidgets(QList<QWidget*> except){
qDebug() << "Search started ON: " << parentWidget()->parentWidget()->objectName();
listOfWidgets = parentWidget()->parentWidget()->findChildren<QWidget *>();
for (int i = 0; i < listOfWidgets.size(); i++) {
qDebug() << "Objectname: " << listOfWidgets.at(i)->objectName();
if(!except.contains(listOfWidgets.at(i))){
if(listOfWidgets.at(i)->isEnabled() == false)
listOfWidgets.removeAt(i);
else
listOfWidgets.at(i)->setEnabled(false);
}
else
listOfWidgets.removeAt(i);
}
}


Output is:
Search started ON: "deviceViewWrapperStack"
Objectname: "gotoHome"
Objectname: "floorsComboBox"
Objectname: ""
Objectname: "qt_scrollarea_viewport"
Objectname: ""
Objectname: ""
Objectname: ""
Objectname: ""
Objectname: "qt_scrollarea_hcontainer"
Objectname: "qt_scrollarea_vcontainer"
Objectname: "deviceView"
Objectname: "deviceTableView"
Objectname: ""
Objectname: "qt_scrollarea_hcontainer"
Objectname: "qt_scrollarea_vcontainer" .......

Code in DeviceViewWrapper


void DeviceViewWrapper::setViewMode(QString viewMode){
qDebug() << "ViewMode: " << viewMode;
ui.deviceView->setViewMode(viewMode);

QList<QWidget *> listOfWidgets = this->findChildren<QWidget *>();
for (int i = 0; i < listOfWidgets.size(); i++) {
qDebug() << "Objectname: " << listOfWidgets.at(i)->objectName();
}
qDebug() << "MY Objectname: " << this->objectName();
}


Output is:
Objectname: "gotoHome"
Objectname: "floorsComboBox"
Objectname: ""
Objectname: ""
Objectname: "qt_scrollarea_viewport"
Objectname: "qt_scrollarea_hcontainer"
Objectname: ""
Objectname: "qt_scrollarea_vcontainer"
Objectname: ""
Objectname: "roomsComboBox"
Objectname: ""
Objectname: ""
Objectname: "qt_scrollarea_viewport"
Objectname: "qt_scrollarea_hcontainer"
Objectname: ""
Objectname: "qt_scrollarea_vcontainer"
Objectname: ""
Objectname: "deviceView"
Objectname: "deviceTableView" .......
.......................
MY Objectname: "deviceViewWrapperStack"

I am in fact missing the "roomsComboBox" in the output of "DPTWidget", according to the output of objectName() the 2 Objects where the searches were executed to are identical ..?

Hopefully somebody has an idea what i did wrong, maybe i am blind ...
Thanks!

Santosh Reddy
25th November 2011, 00:50
It is not a good idea to modify the list in the for lloop


void DPTWidget::disableWidgets(QList<QWidget*> except){
qDebug() << "Search started ON: " << parentWidget()->parentWidget()->objectName();
listOfWidgets = parentWidget()->parentWidget()->findChildren<QWidget *>();
for (int i = 0; i < listOfWidgets.size(); i++) {
qDebug() << "Objectname: " << listOfWidgets.at(i)->objectName();
if(!except.contains(listOfWidgets.at(i))){
if(listOfWidgets.at(i)->isEnabled() == false)
listOfWidgets.removeAt(i); //<<<<<<<<<<<<<<<<<<<<<< listOfWidgets.size() is modified here, also you will miss the i'th item in the list
else
listOfWidgets.at(i)->setEnabled(false);
}
else
listOfWidgets.removeAt(i); //<<<<<<<<<<<<<<<<<<<<<< listOfWidgets.size() is modified here, also you will miss the i'th item in the list
}
}


Try the following


void DPTWidget::disableWidgets(QList<QWidget*> except){
qDebug() << "Search started ON: " << parentWidget()->parentWidget()->objectName();
listOfWidgets = parentWidget()->parentWidget()->findChildren<QWidget *>();
int i = 0;
while(i < listOfWidgets.size()) {
qDebug() << "Objectname: " << listOfWidgets.at(i)->objectName();
if(!except.contains(listOfWidgets.at(i))){
if(listOfWidgets.at(i)->isEnabled() == false)
{
listOfWidgets.removeAt(i);
continue;
}
else
listOfWidgets.at(i)->setEnabled(false);
}
else
{
listOfWidgets.removeAt(i);
continue;
}
i++;
}
}

shock
25th November 2011, 01:47
Ahmm... in fact... you're right i have not thought of that .. my fault ;)
Thanks works as desired ;)