// Find the associated menus and toolbars, ignore toolbuttons QWidgetList ActionModel::associatedWidgets(const QAction *action) { QWidgetList rc = action->associatedWidgets(); for (QWidgetList::iterator it = rc.begin(); it != rc.end(); ) if (qobject_cast<const QMenu *>(*it) || qobject_cast<const QToolBar *>(*it)) { ++it; } else { it = rc.erase(it); } return rc; }
/// ///returns a widget ///it supports repeated widget names /// QWidget* getAbsoluteWidget(QStringList path) { _log::misc << "(QWidgetUtils::getAbsoluteWidget)" << std::endl; ///update the view QWidgetUtils::updateAppView(); ///get all the widgets QWidgetList qwl = qApp->allWidgets(); ///get the widget name assert ( path.size() ); QString name = path.back(); if ( name == "" ) { std::cout << "(QWidgetUtils::getAbsoluteWidget) ERROR. The name of the widget is empty." << std::endl; return NULL; } path.pop_back(); //_log::misc << "(QWidgetUtils::getAbsoluteWidget) Name = " << name.toStdString() << std::endl; ///get all widgets with this name QWidgetList qws; foreach ( QWidget *w, qwl ) { if ( getWidgetName ( w ) == name ) { qws.push_back ( w ); } } //_log::misc << "(QWidgetUtils::getAbsoluteWidget) OK" << std::endl; //if there are no selected widgets... if ( qws.size() == 0 ) { _log::misc << "(QWidgetUtils::getAbsoluteWidget) ERROR. There are no selected widgets." << std::endl; return NULL; } //_log::misc << "(QWidgetUtils::getAbsoluteWidget) OK" << std::endl; ///get the concrete widget we are looking for... int level = 1; bool onTopLevel = false; int onTopLevelCount = 0; QWidgetList::iterator qit; /*for (qit = qws.begin(); qit != qws.end(); qit++) { QWidget* w = static_cast<QWidget*> ( *qit ); _log::misc << getWidgetPath(w).toStdString() << std::endl; }*/ // while more than 1 widget remaining // or every widget has been analyzed... while ( qws.size() > 1 && onTopLevelCount < qws.size() ) { //_log::misc << "(QWidgetUtils::getAbsoluteWidget) OK -> " << qws.size() << std::endl; //for the remaining widgets... qit = qws.begin(); while ( qit != qws.end() ) { //get the parent widget QWidget* w = static_cast<QWidget*> ( *qit ); QWidget* wParent = w; assert ( wParent ); onTopLevel = false; for ( int i = 0; i < level; i++ ) { //if we are in a top level widget (with no parent node) //we have to avoid this widget if ( wParent->parent() == NULL ) { onTopLevel = true; onTopLevelCount++; break; } //if not, we go on looking for up else { wParent = static_cast<QWidget*> ( wParent->parent() ); } } //if not at top level... if ( !onTopLevel ) { //we chech the parent name and delete the //widgets whose parent name does not mach if ( getWidgetName ( wParent ) != path.back() ) { qit = qws.erase ( qit ); } else { qit++; } } else { qit++; } } //update the values level++; path.pop_back(); //stop condition (end of the search path) if ( path.size() == 0 ) break; } //_log::misc << "(QWidgetUtils::getAbsoluteWidget) OK" << std::endl; //there has to be only one element at the list if ( qws.size() != 1 ) { std::cout << "(QWidgetUtils::getAbsoluteWidget) ERROR. None or more than one widget selected. Result = " << qws.size() << std::endl; return NULL; } //if not, return the widget return qws.first(); }