feature.cpp
来自「奇趣公司比较新的qt/emd版本」· C++ 代码 · 共 230 行
CPP
230 行
/******************************************************************************** Copyright (C) 1992-2007 Trolltech ASA. All rights reserved.**** This file is part of the tools applications of the Qt Toolkit.**** This file may be used under the terms of the GNU General Public** License version 2.0 as published by the Free Software Foundation** and appearing in the file LICENSE.GPL included in the packaging of** this file. Please review the following information to ensure GNU** General Public Licensing requirements will be met:** http://trolltech.com/products/qt/licenses/licensing/opensource/**** If you are unsure which license is appropriate for your use, please** review the following information:** http://trolltech.com/products/qt/licenses/licensing/licensingoverview** or contact the sales department at sales@trolltech.com.**** In addition, as a special exception, Trolltech gives you certain** additional rights. These rights are described in the Trolltech GPL** Exception version 1.0, which can be found at** http://www.trolltech.com/products/qt/gplexception/ and in the file** GPL_EXCEPTION.txt in this package.**** In addition, as a special exception, Trolltech, as the sole copyright** holder for Qt Designer, grants users of the Qt/Eclipse Integration** plug-in the right for the Qt/Eclipse Integration to link to** functionality provided by Qt Designer and its related libraries.**** Trolltech reserves all rights not expressly granted herein.**** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.******************************************************************************/#include "feature.h"#include <QTextStream>#include <QRegExp>#include <QLibraryInfo>#include <QFileInfo>QMap<QString, Feature*> Feature::instances;Feature* Feature::getInstance(const QString &key){ QString ukey = key.toUpper(); if (!instances.contains(ukey)) instances[ukey] = new Feature(ukey); return instances[ukey];}Feature::~Feature(){ delete d;}void Feature::clear(){ foreach (Feature *f, instances.values()) delete f; instances.clear();}static QString listToHtml(const QString &title, const QStringList &list){ if (list.isEmpty()) return QString(); QString str; QTextStream stream(&str); stream << "<h3>" << title << ":</h3>"; stream << "<ul>"; foreach (QString l, list) stream << "<li>" << l << "</li>"; stream << "</ul>"; return str;}static QString listToHtml(const QString &title, const QList<Feature*> &list){ QStringList stringlist; foreach (Feature *f, list) { QString s("[%3] <a href=\"feature://%1\">%2</a>"); s = s.arg(f->key()).arg(f->key()); s = s.arg(f->selectable() && f->enabled() ? "On" : "Off"); stringlist << s; } return listToHtml(title, stringlist);}static QString linkify(const QString &src){ static QRegExp classRegexp("\\b(Q[\\w]+)"); QString docRoot = QLibraryInfo::location(QLibraryInfo::DocumentationPath); QString result = src; int pos = 0; while ((pos = classRegexp.indexIn(result, pos)) != -1) { QString className = classRegexp.cap(1); QString file = docRoot + "/html/" + className.toLower() + ".html"; QFileInfo info(file); if (info.isFile()) { QString link = QString("<a href=\"file://%1\">%2</a>") .arg(file).arg(className); result.replace(pos, className.length(), link); pos += link.length(); } else { pos += className.length(); } } return result;}QString Feature::toHtml() const{ QString str; QTextStream stream(&str); stream << "<h2><font size=\"+2\" color=\"darkBlue\">" << key() << "</font></h2>" << "<h2><font size=\"+2\">" << title() << "</font></h2>"; if (!description().isEmpty()) stream << "<p>" << description() << "</p>"; stream << listToHtml("Section", QStringList(section())) << listToHtml("Requires", dependencies()) << listToHtml("Required for", supports()) << listToHtml("See also", relations()); return linkify(str);}Feature::Feature(const QString &key) : d(new FeaturePrivate(key)) {}void Feature::setTitle(const QString &title){ d->title = title;}void Feature::setSection(const QString §ion){ d->section = section;}void Feature::setDescription(const QString &description){ d->description = description;}void Feature::addRelation(const QString &key){ d->relations.insert(getInstance(key));}void Feature::setRelations(const QStringList &keys){ foreach(QString key, keys) if (key != "???") addRelation(key);}QList<Feature*> Feature::relations() const{ return d->relations.toList();}void Feature::addDependency(const QString &key){ Feature *f = getInstance(key); d->dependencies.insert(f); f->d->supports.insert(this);}void Feature::setDependencies(const QStringList &keys){ foreach(QString key, keys) addDependency(key);}QList<Feature*> Feature::dependencies() const{ return d->dependencies.toList();}QList<Feature*> Feature::supports() const{ return d->supports.toList();}/* Returns a html formatted detailed description of this Feature.*/QString Feature::getDocumentation() const{ return QString() + "<h2>" + d->title + "</h2>";}void Feature::setEnabled(bool on){ if (on == d->enabled) return; d->enabled = on; foreach (Feature *f, supports()) f->updateSelectable(); emit changed();}/* Update whether this feature should be selectable. A feature is selectable if all its dependencies are enabled.*/void Feature::updateSelectable(){ bool selectable = true; foreach (Feature *f, dependencies()) if (!f->selectable() || !f->enabled()) selectable = false; if (selectable != d->selectable) { d->selectable = selectable; foreach (Feature *f, supports()) f->updateSelectable(); emit changed(); }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?