⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 generator.cpp

📁 qt-x11-opensource-src-4.1.4.tar.gz源码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
/******************************************************************************** Copyright (C) 1992-2006 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://www.trolltech.com/products/qt/opensource.html**** If you are unsure which license is appropriate for your use, please** review the following information:** http://www.trolltech.com/products/qt/licensing.html or contact the** sales department at sales@trolltech.com.**** 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 "generator.h"#include "outputrevision.h"#include "utils.h"#include <stdio.h>// if the flags change, you MUST to change it in qmetaobject.cpp tooenum PropertyFlags  {    Invalid = 0x00000000,    Readable = 0x00000001,    Writable = 0x00000002,    Resetable = 0x00000004,    EnumOrFlag = 0x00000008,    StdCppSet = 0x00000100,//     Override = 0x00000200,    Designable = 0x00001000,    ResolveDesignable = 0x00002000,    Scriptable = 0x00004000,    ResolveScriptable = 0x00008000,    Stored = 0x00010000,    ResolveStored = 0x00020000,    Editable = 0x00040000,    ResolveEditable = 0x00080000,    User = 0x00100000,    ResolveUser = 0x00200000};enum MethodFlags {    AccessPrivate = 0x00,    AccessProtected = 0x01,    AccessPublic = 0x02,    MethodMethod = 0x00,    MethodSignal = 0x04,    MethodSlot = 0x08,    MethodCompatibility = 0x10,    MethodCloned = 0x20,    MethodScriptable = 0x40};/*  Attention!  This table is copied from qvariant.cpp. If you  change one, change both.*/enum { CoreTypeCount = 28 };static const char* const core_type_map[CoreTypeCount] ={    0,    "bool",    "int",    "uint",    "qlonglong",    "qulonglong",    "double",    "QChar",    "QVariantMap",    "QVariantList",    "QString",    "QStringList",    "QByteArray",    "QBitArray",    "QDate",    "QTime",    "QDateTime",    "QUrl",    "QLocale",    "QRect",    "QRectF",    "QSize",    "QSizeF",    "QLine",    "QLineF",    "QPoint",    "QPointF",    "QRegExp"};enum { GuiTypeCount = 79 - 63 + 1 };static const char* const gui_type_map[GuiTypeCount] ={    "QColorGroup",    "QFont",    "QPixmap",    "QBrush",    "QColor",    "QPalette",    "QIcon",    "QImage",    "QPolygon",    "QRegion",    "QBitmap",    "QCursor",    "QSizePolicy",    "QKeySequence",    "QPen",    "QTextLength",    "QTextFormat"};int qvariant_nameToType(const char* name){    if (name) {        if (strcmp(name, "QVariant") == 0)            return 0xffffffff;        if (strcmp(name, "QCString") == 0)            name = "QByteArray";        else if (strcmp(name, "Q_LLONG") == 0)            name = "qlonglong";        else if (strcmp(name, "Q_ULLONG") == 0)            name = "qulonglong";        else if (strcmp(name, "QIconSet") == 0)            name = "QIcon";        int i;        for (i = 1; i < CoreTypeCount; ++i) {            if (strcmp(core_type_map[i], name) == 0)                return i;        }        for (i = 0; i < GuiTypeCount; ++i) {            if (strcmp(gui_type_map[i], name) == 0)                return (i + 63);        }    }    return 0;}/*  Returns true if the type is a QVariant types.*/bool isVariantType(const char* type){    return qvariant_nameToType(type) != 0;}Generator::Generator(FILE *outfile, ClassDef *classDef) :out(outfile), cdef(classDef){    if (cdef->superclassList.size())        purestSuperClass = cdef->superclassList.first().first;}int Generator::strreg(const char *s){    int idx = 0;    if (!s)        s = "";    for (int i = 0; i < strings.size(); ++i) {        const QByteArray &str = strings.at(i);        if (str == s)            return idx;        idx += str.length() + 1;        idx -= str.count('\\');    }    strings.append(s);    return idx;}void Generator::generateCode(){    bool isQt = (cdef->classname == "Qt");    bool isQObject = (cdef->classname == "QObject");//// build the data array//    int i = 0;    // filter out undeclared enumerators and sets    {        QList<EnumDef> enumList;        for (i = 0; i < cdef->enumList.count(); ++i) {            EnumDef def = cdef->enumList.at(i);            if (cdef->enumDeclarations.contains(def.name)) {                enumList += def;            }            QByteArray alias = cdef->flagAliases.value(def.name);            if (cdef->enumDeclarations.contains(alias)) {                def.name = alias;                enumList += def;            }        }        cdef->enumList = enumList;    }    QByteArray qualifiedClassNameIdentifier = cdef->qualified;    qualifiedClassNameIdentifier.replace(':', '_');    int index = 10;    fprintf(out, "static const uint qt_meta_data_%s[] = {\n", qualifiedClassNameIdentifier.constData());    fprintf(out, "\n // content:\n");    fprintf(out, "    %4d,       // revision\n", 1);    fprintf(out, "    %4d,       // classname\n", strreg(cdef->qualified));    fprintf(out, "    %4d, %4d, // classinfo\n", cdef->classInfoList.count(), cdef->classInfoList.count() ? index : 0);    index += cdef->classInfoList.count() * 2;    int methodCount = cdef->signalList.count() + cdef->slotList.count() + cdef->methodList.count();    fprintf(out, "    %4d, %4d, // methods\n", methodCount, methodCount ? index : 0);    index += methodCount * 5;    fprintf(out, "    %4d, %4d, // properties\n", cdef->propertyList.count(), cdef->propertyList.count() ? index : 0);    index += cdef->propertyList.count() * 3;    fprintf(out, "    %4d, %4d, // enums/sets\n", cdef->enumList.count(), cdef->enumList.count() ? index : 0);//// Build classinfo array//    generateClassInfos();//// Build signals array first, otherwise the signal indices would be wrong//    generateFunctions(cdef->signalList, "signal", MethodSignal);//// Build slots array//    generateFunctions(cdef->slotList, "slot", MethodSlot);//// Build method array//    generateFunctions(cdef->methodList, "method", MethodMethod);//// Build property array//    generateProperties();//// Build enums array//    generateEnums(index);//// Terminate data array//    fprintf(out, "\n       0        // eod\n};\n\n");//// Build stringdata array//    fprintf(out, "static const char qt_meta_stringdata_%s[] = {\n", qualifiedClassNameIdentifier.constData());    fprintf(out, "    \"");    int col = 0;    int len = 0;    for (i = 0; i < strings.size(); ++i) {        QByteArray s = strings.at(i);        len = s.length();        if (col && col + len >= 72) {            fprintf(out, "\"\n    \"");            col = 0;        } else if (len && s.at(0) >= '0' && s.at(0) <= '9') {            fprintf(out, "\"\"");            len += 2;        }        fprintf(out, "%s\\0", s.constData());        col += len + 2;    }    fprintf(out, "\"\n};\n\n");//// Build extra array//    QList<QByteArray> extraList;    for (int i = 0; i < cdef->propertyList.count(); ++i) {        const PropertyDef &p = cdef->propertyList.at(i);        if (!isVariantType(p.type)) {            int s = p.type.indexOf("::");            if (s > 0) {                QByteArray scope = p.type.left(s);                if (scope != "Qt" && scope != cdef->classname && !extraList.contains(scope))                    extraList += scope;            }        }    }    if (!extraList.isEmpty()) {        fprintf(out, "static const QMetaObject *qt_meta_extradata_%s[] = {\n    ", qualifiedClassNameIdentifier.constData());        for (int i = 0; i < extraList.count(); ++i) {            if (i)                fprintf(out, ",\n    ");

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -