void KKbdAccessExtensions::nextHandle() { QWidget* panel = d->panel; // See if current panel has another handle. If not, find next panel. if (panel) { bool advance = true; d->handleNdx++; if (::qt_cast<QSplitter*>( panel )) advance = (d->handleNdx >= dynamic_cast<QSplitter *>(panel)->sizes().count()); else // Undocked windows have only one "handle" (center). advance = (d->handleNdx > 2 || !dynamic_cast<QDockWindow *>(panel)->area()); if (advance) { QWidgetList* allWidgets = getAllPanels(); allWidgets->findRef(panel); panel = 0; if (allWidgets->current()) panel = allWidgets->next(); delete allWidgets; d->handleNdx = 1; } } else { // Find first panel. QWidgetList* allWidgets = getAllPanels(); panel = allWidgets->first(); delete allWidgets; d->handleNdx = 1; } d->panel = panel; if (panel) showIcon(); else exitSizing(); }
void ReportWriterWindow::closeEvent(QCloseEvent * e) { QWidgetList wl = ws->windowList(); QWidget * w = 0; for(w = wl.first(); w; w = wl.next()) { if(!w->close()) return; } e->accept(); }
static QWidget *focusWidget() { QTT_TRACE_FUNCTION(); QWidget *ret = QApplication::focusWidget(); if (!ret) { QWidgetList topLevel = QApplication::topLevelWidgets(); if (!topLevel.isEmpty()) return topLevel.first(); } return ret; }
QString Project::locationOfObject( QObject *o ) { if ( !o ) return QString::null; if ( MainWindow::self ) { QWidgetList windows = MainWindow::self->qWorkspace()->windowList(); for ( QWidget *w = windows.first(); w; w = windows.next() ) { FormWindow *fw = ::qt_cast<FormWindow*>(w); SourceEditor *se = ::qt_cast<SourceEditor*>(w); if ( fw ) { if ( fw->isFake() ) return objectForFakeForm( fw )->name() + QString( " [Source]" ); else return fw->name() + QString( " [Source]" ); } else if ( se ) { if ( !se->object() ) continue; if ( se->formWindow() ) return se->formWindow()->name() + QString( " [Source]" ); else return makeRelative( se->sourceFile()->fileName() ); } } } if ( ::qt_cast<SourceFile*>(o) ) { for ( QPtrListIterator<SourceFile> sources = sourceFiles(); sources.current(); ++sources ) { SourceFile* f = sources.current(); if ( f == o ) return makeRelative( f->fileName() ); } } extern QMap<QWidget*, QString> *qwf_forms; if ( !qwf_forms ) { qWarning( "Project::locationOfObject: qwf_forms is NULL!" ); return QString::null; } QString s = makeRelative( *qwf_forms->find( (QWidget*)o ) ); s += " [Source]"; return s; }
bool ResourceExchange::doOpen() { kdDebug() << "ResourceExchange::doOpen()" << endl; mClient = new ExchangeClient(mAccount, mTimeZoneId); connect(mClient, SIGNAL(downloadFinished(int, const QString &)), SLOT(slotDownloadFinished(int, const QString &))); connect(mClient, SIGNAL(event(KCal::Event *, const KURL &)), SLOT(downloadedEvent(KCal::Event *, const KURL &))); #if 0 kdDebug() << "Creating monitor" << endl; QHostAddress ip; ip.setAddress(mAccount->host()); mMonitor = new ExchangeMonitor(mAccount, ExchangeMonitor::CallBack, ip); connect(mMonitor, SIGNAL(notify(const QValueList<long> &, const QValueList<KURL> &)), this, SLOT(slotMonitorNotify(const QValueList<long> &, const QValueList<KURL> &))); connect(mMonitor, SIGNAL(error(int , const QString &)), this, SLOT(slotMonitorError(int , const QString &))); mMonitor->addWatch(mAccount->calendarURL(), ExchangeMonitor::UpdateNewMember, 1); #endif QWidgetList *widgets = QApplication::topLevelWidgets(); if(!widgets->isEmpty()) mClient->setWindow(widgets->first()); delete widgets; mDates = new DateSet(); mEventDates = new QMap<Event, QDateTime>(); mCacheDates = new QMap<QDate, QDateTime>(); mCache = new CalendarLocal(mTimeZoneId); // mOldestDate = 0L; // mNewestDate = 0L; // FIXME: check if server exists, account is OK, etc. return true; }
QWidgetList* KKbdAccessExtensions::getAllPanels() { QWidgetList* allWidgets = kapp->allWidgets(); QWidgetList* allPanels = new QWidgetList; QWidget* widget = allWidgets->first(); while (widget) { if (widget->isVisible()) { if (::qt_cast<QSplitter*>( widget )) { // Only size QSplitters with at least two handles (there is always one hidden). if (dynamic_cast<QSplitter *>(widget)->sizes().count() >= 2) allPanels->append(widget); } else if (::qt_cast<QDockWindow*>( widget )) { if (dynamic_cast<QDockWindow *>(widget)->isResizeEnabled()) { // kdDebug() << "KKbdAccessExtensions::getAllPanels: QDockWindow = " << widget->name() << endl; allPanels->append(widget); } } } widget = allWidgets->next(); } delete allWidgets; return allPanels; }
/* --| main |------------------------------------------------------ */ extern "C" int KDE_EXPORT kdemain(int argc, char *argv[]) { setgid(getgid()); setuid(getuid()); // drop privileges // deal with shell/command //////////////////////////// bool histon = true; bool menubaron = true; bool tabbaron = true; bool frameon = true; bool scrollbaron = true; bool showtip = true; KAboutData aboutData("konsole", I18N_NOOP("Konsole"), KONSOLE_VERSION, description, KAboutData::License_GPL_V2, "Copyright (c) 1997-2006, Lars Doelle"); aboutData.addAuthor("Robert Knight", I18N_NOOP("Maintainer"), "*****@*****.**"); aboutData.addAuthor("Lars Doelle", I18N_NOOP("Author"), "*****@*****.**"); aboutData.addCredit("Kurt V. Hindenburg", I18N_NOOP("bug fixing and improvements"), "*****@*****.**"); aboutData.addCredit("Waldo Bastian", I18N_NOOP("bug fixing and improvements"), "*****@*****.**"); aboutData.addCredit("Stephan Binner", I18N_NOOP("bug fixing and improvements"), "*****@*****.**"); aboutData.addCredit("Chris Machemer", I18N_NOOP("bug fixing"), "*****@*****.**"); aboutData.addCredit("Stephan Kulow", I18N_NOOP("Solaris support and work on history"), "*****@*****.**"); aboutData.addCredit("Alexander Neundorf", I18N_NOOP("faster startup, bug fixing"), "*****@*****.**"); aboutData.addCredit("Peter Silva", I18N_NOOP("decent marking"), "*****@*****.**"); aboutData.addCredit("Lotzi Boloni", I18N_NOOP("partification\n" "Toolbar and session names"), "*****@*****.**"); aboutData.addCredit("David Faure", I18N_NOOP("partification\n" "overall improvements"), "*****@*****.**"); aboutData.addCredit("Antonio Larrosa", I18N_NOOP("transparency"), "*****@*****.**"); aboutData.addCredit("Matthias Ettrich", I18N_NOOP("most of main.C donated via kvt\n" "overall improvements"), "*****@*****.**"); aboutData.addCredit("Warwick Allison", I18N_NOOP("schema and selection improvements"), "*****@*****.**"); aboutData.addCredit("Dan Pilone", I18N_NOOP("SGI Port"), "*****@*****.**"); aboutData.addCredit("Kevin Street", I18N_NOOP("FreeBSD port"), "*****@*****.**"); aboutData.addCredit("Sven Fischer", I18N_NOOP("bug fixing"), "*****@*****.**"); aboutData.addCredit("Dale M. Flaven", I18N_NOOP("bug fixing"), "*****@*****.**"); aboutData.addCredit("Martin Jones", I18N_NOOP("bug fixing"), "*****@*****.**"); aboutData.addCredit("Lars Knoll", I18N_NOOP("bug fixing"), "*****@*****.**"); aboutData.addCredit("", I18N_NOOP("Thanks to many others.\n" "The above list only reflects the contributors\n" "I managed to keep track of.")); KCmdLineArgs::init(argc, argv, &aboutData); KCmdLineArgs::addCmdLineOptions(options); // Add our own options. // 1.53 sec KCmdLineArgs *args = KCmdLineArgs::parsedArgs(); KCmdLineArgs *qtargs = KCmdLineArgs::parsedArgs("qt"); has_noxft = !args->isSet("xft"); TEWidget::setAntialias(!has_noxft); TEWidget::setStandalone(true); // The following Qt options have no effect; warn users. if(qtargs->isSet("background")) kdWarning() << "The Qt option -bg, --background has no effect." << endl; if(qtargs->isSet("foreground")) kdWarning() << "The Qt option -fg, --foreground has no effect." << endl; if(qtargs->isSet("button")) kdWarning() << "The Qt option -btn, --button has no effect." << endl; if(qtargs->isSet("font")) kdWarning() << "The Qt option -fn, --font has no effect." << endl; KApplication *a = NULL; #ifdef COMPOSITE if(args->isSet("real-transparency")) { char *display = 0; if(qtargs->isSet("display")) display = qtargs->getOption("display").data(); Display *dpy = XOpenDisplay(display); if(!dpy) { kdError() << "cannot connect to X server " << display << endl; exit(1); } int screen = DefaultScreen(dpy); Colormap colormap = 0; Visual *visual = 0; int event_base, error_base; if(XRenderQueryExtension(dpy, &event_base, &error_base)) { int nvi; XVisualInfo templ; templ.screen = screen; templ.depth = 32; templ.c_class = TrueColor; XVisualInfo *xvi = XGetVisualInfo(dpy, VisualScreenMask | VisualDepthMask | VisualClassMask, &templ, &nvi); for(int i = 0; i < nvi; i++) { XRenderPictFormat *format = XRenderFindVisualFormat(dpy, xvi[i].visual); if(format->type == PictTypeDirect && format->direct.alphaMask) { visual = xvi[i].visual; colormap = XCreateColormap(dpy, RootWindow(dpy, screen), visual, AllocNone); kdDebug() << "found visual with alpha support" << endl; argb_visual = true; break; } } } // The QApplication ctor used is normally intended for applications not using Qt // as the primary toolkit (e.g. Motif apps also using Qt), with some slightly // unpleasant side effects (e.g. #83974). This code checks if qt-copy patch #0078 // is applied, which allows turning this off. bool *qt_no_foreign_hack = static_cast< bool * >(dlsym(RTLD_DEFAULT, "qt_no_foreign_hack")); if(qt_no_foreign_hack) *qt_no_foreign_hack = true; // else argb_visual = false ... ? *shrug* if(argb_visual) a = new KApplication(dpy, Qt::HANDLE(visual), Qt::HANDLE(colormap)); else XCloseDisplay(dpy); } if(a == NULL) a = new KApplication; #else KApplication *a = new KApplication; #endif QString dataPathBase = KStandardDirs::kde_default("data").append("konsole/"); KGlobal::dirs()->addResourceType("wallpaper", dataPathBase + "wallpapers"); KImageIO::registerFormats(); // add io for additional image formats // 2.1 secs QString title; if(args->isSet("T")) { title = QFile::decodeName(args->getOption("T")); } if(qtargs->isSet("title")) { title = QFile::decodeName(qtargs->getOption("title")); } QString term = ""; if(args->isSet("tn")) { term = QString::fromLatin1(args->getOption("tn")); } login_shell = args->isSet("ls"); QStrList eargs; const char *shell = 0; if(!args->getOption("e").isEmpty()) { if(args->isSet("ls")) KCmdLineArgs::usage(i18n("You can't use BOTH -ls and -e.\n")); shell = strdup(args->getOption("e")); eargs.append(shell); for(int i = 0; i < args->count(); i++) eargs.append(args->arg(i)); if(title.isEmpty() && (kapp->caption() == kapp->aboutData()->programName())) { title = QFile::decodeName(shell); // program executed in the title bar } showtip = false; } QCString sz = ""; sz = args->getOption("vt_sz"); histon = args->isSet("hist"); menubaron = args->isSet("menubar"); tabbaron = args->isSet("tabbar") && args->isSet("toolbar"); frameon = args->isSet("frame"); scrollbaron = args->isSet("scrollbar"); QCString wname = qtargs->getOption("name"); full_script = args->isSet("script"); auto_close = args->isSet("close"); fixed_size = !args->isSet("resize"); if(!full_script) a->dcopClient()->setQtBridgeEnabled(false); QCString type = ""; if(args->isSet("type")) { type = args->getOption("type"); } if(args->isSet("types")) { QStringList types = KGlobal::dirs()->findAllResources("appdata", "*.desktop", false, true); types.sort(); for(QStringList::ConstIterator it = types.begin(); it != types.end(); ++it) { QString file = *it; file = file.mid(file.findRev('/') + 1); if(file.endsWith(".desktop")) file = file.left(file.length() - 8); printf("%s\n", QFile::encodeName(file).data()); } return 0; } if(args->isSet("schemas") || args->isSet("schemata")) { ColorSchemaList colors; colors.checkSchemas(); for(int i = 0; i < (int)colors.count(); i++) { ColorSchema *schema = colors.find(i); QString relPath = schema->relPath(); if(!relPath.isEmpty()) printf("%s\n", QFile::encodeName(relPath).data()); } return 0; } if(args->isSet("keytabs")) { QStringList lst = KGlobal::dirs()->findAllResources("data", "konsole/*.keytab"); printf("default\n"); // 'buildin' keytab lst.sort(); for(QStringList::Iterator it = lst.begin(); it != lst.end(); ++it) { QFileInfo fi(*it); QString file = fi.baseName(); printf("%s\n", QFile::encodeName(file).data()); } return 0; } QString workDir = QFile::decodeName(args->getOption("workdir")); QString keytab = ""; if(args->isSet("keytab")) keytab = QFile::decodeName(args->getOption("keytab")); QString schema = ""; if(args->isSet("schema")) schema = args->getOption("schema"); KConfig *sessionconfig = 0; QString profile = ""; if(args->isSet("profile")) { profile = args->getOption("profile"); QString path = locate("data", "konsole/profiles/" + profile); if(QFile::exists(path)) sessionconfig = new KConfig(path, true); else profile = ""; } if(args->isSet("profiles")) { QStringList profiles = KGlobal::dirs()->findAllResources("data", "konsole/profiles/*", false, true); profiles.sort(); for(QStringList::ConstIterator it = profiles.begin(); it != profiles.end(); ++it) { QString file = *it; file = file.mid(file.findRev('/') + 1); printf("%s\n", QFile::encodeName(file).data()); } return 0; } // FIXME: more: font args->clear(); int c = 0, l = 0; if(!sz.isEmpty()) { char *ls = (char *)strchr(sz.data(), 'x'); if(ls != NULL) { *ls = '\0'; ls++; c = atoi(sz.data()); l = atoi(ls); } else { KCmdLineArgs::usage(i18n("expected --vt_sz <#columns>x<#lines> e.g. 80x40\n")); } } if(!kapp->authorizeKAction("size")) fixed_size = true; // /////////////////////////////////////////////// // Ignore SIGHUP so that we don't get killed when // our parent-shell gets closed. signal(SIGHUP, SIG_IGN); putenv((char *)"COLORTERM="); // to trigger mc's color detection KonsoleSessionManaged ksm; if(a->isRestored() || !profile.isEmpty()) { if(!shell) shell = konsole_shell(eargs); if(profile.isEmpty()) sessionconfig = a->sessionConfig(); sessionconfig->setDesktopGroup(); int n = 1; QString key; QString sTitle; QString sPgm; QString sTerm; QString sIcon; QString sCwd; int n_tabbar; // TODO: Session management stores everything in same group, // should use one group / mainwindow while(KMainWindow::canBeRestored(n) || !profile.isEmpty()) { sessionconfig->setGroup(QString("%1").arg(n)); if(!sessionconfig->hasKey("Pgm0")) sessionconfig->setDesktopGroup(); // Backwards compatible int session_count = sessionconfig->readNumEntry("numSes"); int counter = 0; wname = sessionconfig->readEntry("class", wname).latin1(); sPgm = sessionconfig->readEntry("Pgm0", shell); sessionconfig->readListEntry("Args0", eargs); sTitle = sessionconfig->readEntry("Title0", title); sTerm = sessionconfig->readEntry("Term0"); sIcon = sessionconfig->readEntry("Icon0", "konsole"); sCwd = sessionconfig->readPathEntry("Cwd0"); workDir = sessionconfig->readPathEntry("workdir"); n_tabbar = QMIN(sessionconfig->readUnsignedNumEntry("tabbar", Konsole::TabBottom), 2); Konsole *m = new Konsole(wname, histon, menubaron, tabbaron, frameon, scrollbaron, 0 /*type*/, true, n_tabbar, workDir); m->newSession(sPgm, eargs, sTerm, sIcon, sTitle, sCwd); m->enableFullScripting(full_script); m->enableFixedSize(fixed_size); m->restore(n); sessionconfig->setGroup(QString("%1").arg(n)); if(!sessionconfig->hasKey("Pgm0")) sessionconfig->setDesktopGroup(); // Backwards compatible m->makeGUI(); m->setEncoding(sessionconfig->readNumEntry("Encoding0")); m->setSchema(sessionconfig->readEntry("Schema0")); // Use konsolerc default as tmpFont instead? QFont tmpFont = KGlobalSettings::fixedFont(); m->initSessionFont(sessionconfig->readFontEntry("SessionFont0", &tmpFont)); m->initSessionKeyTab(sessionconfig->readEntry("KeyTab0")); m->initMonitorActivity(sessionconfig->readBoolEntry("MonitorActivity0", false)); m->initMonitorSilence(sessionconfig->readBoolEntry("MonitorSilence0", false)); m->initMasterMode(sessionconfig->readBoolEntry("MasterMode0", false)); m->initTabColor(sessionconfig->readColorEntry("TabColor0")); // -1 will be changed to the default history in konsolerc m->initHistory(sessionconfig->readNumEntry("History0", -1), sessionconfig->readBoolEntry("HistoryEnabled0", true)); counter++; // show() before 2nd+ sessions are created allows --profile to // initialize the TE size correctly. m->show(); while(counter < session_count) { key = QString("Title%1").arg(counter); sTitle = sessionconfig->readEntry(key, title); key = QString("Args%1").arg(counter); sessionconfig->readListEntry(key, eargs); key = QString("Pgm%1").arg(counter); // if the -e option is passed on the command line, this overrides the program specified // in the profile file if(args->isSet("e")) sPgm = (shell ? QFile::decodeName(shell) : QString::null); else sPgm = sessionconfig->readEntry(key, shell); key = QString("Term%1").arg(counter); sTerm = sessionconfig->readEntry(key); key = QString("Icon%1").arg(counter); sIcon = sessionconfig->readEntry(key, "konsole"); key = QString("Cwd%1").arg(counter); sCwd = sessionconfig->readPathEntry(key); m->newSession(sPgm, eargs, sTerm, sIcon, sTitle, sCwd); m->setSessionTitle(sTitle); // Use title as is key = QString("Schema%1").arg(counter); m->setSchema(sessionconfig->readEntry(key)); key = QString("Encoding%1").arg(counter); m->setEncoding(sessionconfig->readNumEntry(key)); key = QString("SessionFont%1").arg(counter); QFont tmpFont = KGlobalSettings::fixedFont(); m->initSessionFont(sessionconfig->readFontEntry(key, &tmpFont)); key = QString("KeyTab%1").arg(counter); m->initSessionKeyTab(sessionconfig->readEntry(key)); key = QString("MonitorActivity%1").arg(counter); m->initMonitorActivity(sessionconfig->readBoolEntry(key, false)); key = QString("MonitorSilence%1").arg(counter); m->initMonitorSilence(sessionconfig->readBoolEntry(key, false)); key = QString("MasterMode%1").arg(counter); m->initMasterMode(sessionconfig->readBoolEntry(key, false)); key = QString("TabColor%1").arg(counter); m->initTabColor(sessionconfig->readColorEntry(key)); // -1 will be changed to the default history in konsolerc key = QString("History%1").arg(counter); QString key2 = QString("HistoryEnabled%1").arg(counter); m->initHistory(sessionconfig->readNumEntry(key, -1), sessionconfig->readBoolEntry(key2, true)); counter++; } m->setDefaultSession(sessionconfig->readEntry("DefaultSession", "shell.desktop")); m->initFullScreen(); if(!profile.isEmpty()) { m->callReadPropertiesInternal(sessionconfig, 1); profile = ""; // Hack to work-around sessions initialized with minimum size for(int i = 0; i < counter; i++) m->activateSession(i); m->setColLin(c, l); // will use default height and width if called with (0,0) } // works only for the first one, but there won't be more. n++; m->activateSession(sessionconfig->readNumEntry("ActiveSession", 0)); m->setAutoClose(auto_close); } } else { Konsole *m = new Konsole(wname, histon, menubaron, tabbaron, frameon, scrollbaron, type, false, 0, workDir); m->newSession((shell ? QFile::decodeName(shell) : QString::null), eargs, term, QString::null, title, workDir); m->enableFullScripting(full_script); m->enableFixedSize(fixed_size); // 3.8 :-( // exit(0); if(!keytab.isEmpty()) m->initSessionKeyTab(keytab); if(!schema.isEmpty()) { if(schema.right(7) != ".schema") schema += ".schema"; m->setSchema(schema); m->activateSession(0); // Fixes BR83162, transp. schema + notabbar } m->setColLin(c, l); // will use default height and width if called with (0,0) m->initFullScreen(); m->show(); if(showtip) m->showTipOnStart(); m->setAutoClose(auto_close); } int ret = a->exec(); //// Temporary code, waiting for Qt to do this properly // Delete all toplevel widgets that have WDestructiveClose QWidgetList *list = QApplication::topLevelWidgets(); // remove all toplevel widgets that have a parent (i.e. they // got WTopLevel explicitly), they'll be deleted by the parent list->first(); while(list->current()) { if(list->current()->parentWidget() != NULL || !list->current()->testWFlags(Qt::WDestructiveClose)) { list->remove(); continue; } list->next(); } QWidgetListIt it(*list); QWidget *w; while((w = it.current()) != 0) { ++it; delete w; } delete list; delete a; return ret; }
void KKbdAccessExtensions::displayAccessKeys() { // Build a list of valid access keys that don't collide with shortcuts. QString availableAccessKeys = "ABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890"; QPtrList<KXMLGUIClient> allClients = d->mainWindow->factory()->clients(); QPtrListIterator<KXMLGUIClient> it( allClients ); KXMLGUIClient *client; while( (client=it.current()) !=0 ) { ++it; KActionPtrList actions = client->actionCollection()->actions(); for (int j = 0; j < (int)actions.count(); j++) { KAction* action = actions[j]; KShortcut sc = action->shortcut(); for (int i = 0; i < (int)sc.count(); i++) { KKeySequence seq = sc.seq(i); if (seq.count() == 1) { QString s = seq.toString(); if (availableAccessKeys.contains(s)) availableAccessKeys.remove(s); } } } } // Find all visible, focusable widgets and create a QLabel for each. Don't exceed // available list of access keys. QWidgetList* allWidgets = kapp->allWidgets(); QWidget* widget = allWidgets->first(); int accessCount = 0; int maxAccessCount = availableAccessKeys.length(); int overlap = 20; QPoint prevGlobalPos = QPoint(-overlap, -overlap); while (widget && (accessCount < maxAccessCount)) { if (widget->isVisible() && widget->isFocusEnabled() ) { QRect r = widget->rect(); QPoint p(r.x(), r.y()); // Don't display an access key if within overlap pixels of previous one. QPoint globalPos = widget->mapToGlobal(p); QPoint diffPos = globalPos - prevGlobalPos; if (diffPos.manhattanLength() > overlap) { accessCount++; QLabel* lab=new QLabel(widget, "", widget, 0, Qt::WDestructiveClose); lab->setPalette(QToolTip::palette()); lab->setLineWidth(2); lab->setFrameStyle(QFrame::Box | QFrame::Plain); lab->setMargin(3); lab->adjustSize(); lab->move(p); if (!d->accessKeyLabels) { d->accessKeyLabels = new QPtrList<QLabel>; d->accessKeyLabels->setAutoDelete(true); } d->accessKeyLabels->append(lab); prevGlobalPos = globalPos; } } widget = allWidgets->next(); } if (accessCount > 0) { // Sort the access keys from left to right and down the screen. QValueList<KSortedLabel> sortedLabels; for (int i = 0; i < accessCount; i++) sortedLabels.append(KSortedLabel(d->accessKeyLabels->at(i))); qHeapSort( sortedLabels ); // Assign access key labels. for (int i = 0; i < accessCount; i++) { QLabel* lab = sortedLabels[i].label(); QChar s = availableAccessKeys[i]; lab->setText(s); lab->adjustSize(); lab->show(); } } }
/// ///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(); }