本文整理汇总了C++中QMetaObjectBuilder类的典型用法代码示例。如果您正苦于以下问题:C++ QMetaObjectBuilder类的具体用法?C++ QMetaObjectBuilder怎么用?C++ QMetaObjectBuilder使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了QMetaObjectBuilder类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: QFileInfo
void WrapperObject::BuildMetaObject ()
{
QString path = QFileInfo (Path_).absolutePath ();
QDir scriptDir (path);
QMetaObjectBuilder builder;
builder.setSuperClass (QObject::metaObject ());
builder.setClassName (QString ("LeechCraft::Plugins::Qross::%1::%2")
.arg (Type_)
.arg (SCALL (QString) ("GetName").remove (' ')).toLatin1 ());
int currentMetaMethod = 0;
if (scriptDir.exists ("ExportedSlots"))
{
QFile slotsFile (scriptDir.filePath ("ExportedSlots"));
slotsFile.open (QIODevice::ReadOnly);
QList<QByteArray> sigSlots = slotsFile.readAll ().split ('\n');
Q_FOREACH (QByteArray signature, sigSlots)
{
signature = signature.trimmed ();
if (signature.isEmpty ())
continue;
Index2ExportedSignatures_ [currentMetaMethod++] = signature;
builder.addSlot (signature);
}
示例2: QObject
Test::Test(QObject *parent) :
QObject(parent), d(new TestPrivate)
{
QMetaObjectBuilder builder;
builder.setClassName("Test");
d->catchedSignalId = builder.addSignal("catched(QString,QVariantList)").index();
d->meta = builder.toMetaObject();
QDataStream ostream(&d->metadata, QIODevice::WriteOnly);
builder.serialize(ostream);
}
示例3:
void QDeclarative1OpenMetaObjectTypePrivate::init(const QMetaObject *metaObj)
{
if (!mem) {
mob.setSuperClass(metaObj);
mob.setClassName(metaObj->className());
mob.setFlags(QMetaObjectBuilder::DynamicMetaObject);
mem = mob.toMetaObject();
propertyOffset = mem->propertyOffset();
signalOffset = mem->methodOffset();
}
}
示例4: QServiceProxyBase
QServiceProxy::QServiceProxy(const QByteArray& metadata, ObjectEndPoint* endPoint, QObject* parent)
: QServiceProxyBase(endPoint, parent)
{
Q_ASSERT(endPoint);
d = new QServiceProxyPrivate();
d->metadata = metadata;
d->meta = 0;
d->endPoint = endPoint;
d->localToRemote = 0;
d->remoteToLocal = 0;
QDataStream stream(d->metadata);
QMetaObjectBuilder builder;
QMap<QByteArray, const QMetaObject*> refs;
builder.deserialize(stream, refs);
if (stream.status() != QDataStream::Ok) {
qWarning() << "Invalid metaObject for service received";
} else {
QMetaObject *remote = builder.toMetaObject();
builder.setSuperClass(QServiceProxyBase::metaObject());
QMetaObject *local = builder.toMetaObject();
d->remoteToLocal = new int[local->methodCount()];
d->localToRemote = new int[local->methodCount()];
for (int i = 0; i < local->methodCount(); i++){
const QMetaMethod m = local->method(i);
int r = remote->indexOfMethod(m.methodSignature().constData());
d->localToRemote[i] = r;
if (r > 0)
d->remoteToLocal[r] = i;
}
#if defined(QT_SFW_IPC_DEBUG) && defined(QT_SFW_IPC_DEBUG_VERBOSE)
QString mapping = QString::fromLatin1("%%% QWE Doing lookup table for ") + endPoint->objectName();
for (int i = 0; i < local->methodCount(); i++){
const QMetaMethod m = local->method(i);
int r = d->localToRemote[i];
mapping.append(QString::fromLatin1("\n%%%Mapping %1 from %2 to %3").arg(QString::fromLatin1(m.signature())).arg(i).arg(r));
}
QServiceDebugLog::instance()->appendToLog(mapping);
#endif
d->meta = local;
endPoint->setLookupTable(d->localToRemote, d->remoteToLocal);
}
}
示例5: initializeMetaObject
void QRemoteObjectReplicaPrivate::initializeMetaObject(const QMetaObjectBuilder &builder, const QVariantList &values)
{
Q_ASSERT(!m_metaObject);
m_metaObject = builder.toMetaObject();
//rely on order of properties;
setProperties(values);
}
示例6: QObject
QServiceProxyBase::QServiceProxyBase(ObjectEndPoint *endpoint, QObject *parent)
: QObject(parent), d(0)
{
d = new QServiceProxyBasePrivate();
d->meta = 0;
d->endPoint = endpoint;
d->ipcfailure = -1;
d->timerId = startTimer(1000);
QMetaObjectBuilder sup;
sup.setClassName("QServiceProxyBase");
QMetaMethodBuilder b = sup.addSignal("errorUnrecoverableIPCFault(QService::UnrecoverableIPCError)");
d->ipcfailure = b.index();
d->meta = sup.toMetaObject();
d->ipcFailureSignal = d->meta->method(d->meta->methodOffset());
Q_ASSERT(d->ipcFailureSignal.methodSignature() == "errorUnrecoverableIPCFault(QService::UnrecoverableIPCError)");
}
示例7: istream
bool Test::addSlot(const QString &slot)
{
if (d->slotId2Name.key(slot, -1) != -1)
return false;
QDataStream istream(d->metadata);
QMetaObjectBuilder builder;
QMap<QByteArray, const QMetaObject*> refs;
builder.deserialize(istream, refs);
int metaIndex = builder.addSlot(slot.toLocal8Bit()).index();
d->slotId2Name.insert(metaIndex + d->meta->methodOffset(), slot);
if (d->meta)
free(d->meta);
d->meta = builder.toMetaObject();
QDataStream ostream(&d->metadata, QIODevice::WriteOnly);
builder.serialize(ostream);
return true;
}
示例8: deserializeInitDynamicPacket
void deserializeInitDynamicPacket(QDataStream &in, QMetaObjectBuilder &builder, QVariantList &values)
{
quint32 numSignals = 0;
quint32 numMethods = 0;
quint32 numProperties = 0;
in >> numSignals;
in >> numMethods;
int curIndex = 0;
for (quint32 i = 0; i < numSignals; ++i) {
QByteArray signature;
in >> signature;
++curIndex;
builder.addSignal(signature);
}
for (quint32 i = 0; i < numMethods; ++i) {
QByteArray signature, returnType;
in >> signature;
in >> returnType;
++curIndex;
const bool isVoid = returnType.isEmpty() || returnType == QByteArrayLiteral("void");
if (isVoid)
builder.addMethod(signature);
else
builder.addMethod(signature, QByteArrayLiteral("QRemoteObjectPendingCall"));
}
in >> numProperties;
const quint32 initialListSize = values.size();
if (static_cast<quint32>(values.size()) < numProperties)
values.reserve(numProperties);
else if (static_cast<quint32>(values.size()) > numProperties)
for (quint32 i = numProperties; i < initialListSize; ++i)
values.removeLast();
for (quint32 i = 0; i < numProperties; ++i) {
QByteArray name;
QByteArray typeName;
QByteArray signalName;
in >> name;
in >> typeName;
in >> signalName;
if (signalName.isEmpty())
builder.addProperty(name, typeName);
else
builder.addProperty(name, typeName, builder.indexOfSignal(signalName));
QVariant value;
in >> value;
if (i < initialListSize)
values[i] = value;
else
values.append(value);
}
}
示例9: QObject
// Create a universal proxy used as a slot. Note that this will leak if there
// is no transmitter and this is not a single shot slot. There will be no
// meta-object if there was a problem creating the proxy. This is called
// without the GIL.
PyQtSlotProxy::PyQtSlotProxy(PyObject *slot, QObject *q_tx,
const Chimera::Signature *slot_signature, bool single_shot)
: QObject(), proxy_flags(single_shot ? PROXY_SINGLE_SHOT : 0),
signature(slot_signature->signature), transmitter(q_tx)
{
SIP_BLOCK_THREADS
real_slot = new PyQtSlot(slot, slot_signature);
SIP_UNBLOCK_THREADS
// Create a new meta-object on the heap so that it looks like it has a slot
// of the right name and signature.
QMetaObjectBuilder builder;
builder.setClassName("PyQtSlotProxy");
builder.setSuperClass(&QObject::staticMetaObject);
builder.addSlot("unislot()");
builder.addSlot("disable()");
meta_object = builder.toMetaObject();
// Detect when any transmitter is destroyed. (Note that we used to do this
// by making the proxy a child of the transmitter. This doesn't work as
// expected because QWidget destroys its children before emitting the
// destroyed signal.) We use a queued connection in case the proxy is also
// connected to the same signal and we want to make sure it has a chance to
// invoke the slot before being destroyed.
if (transmitter)
{
// Add this one to the global hash.
mutex->lock();
proxy_slots.insert(transmitter, this);
mutex->unlock();
connect(transmitter, SIGNAL(destroyed(QObject *)), SLOT(disable()),
Qt::QueuedConnection);
}
}
示例10: qMakePair
QMetaObject *DosQMetaObject::createMetaObject(const QString &className,
const SignalDefinitions &signalDefinitions,
const SlotDefinitions &slotDefinitions,
const PropertyDefinitions &propertyDefinitions)
{
QMetaObjectBuilder builder;
builder.setClassName(className.toUtf8());
builder.setSuperClass(m_superClassDosMetaObject->metaObject());
for (const SignalDefinition &signal : signalDefinitions) {
QMetaMethodBuilder signalBuilder = builder.addSignal(::createSignature(signal));
signalBuilder.setReturnType(QMetaType::typeName(QMetaType::Void));
signalBuilder.setAccess(QMetaMethod::Public);
signalBuilder.setParameterNames(createParameterNames(signal));
m_signalIndexByName[signal.name] = signalBuilder.index();
}
QHash<QString, int> methodIndexByName;
for (const SlotDefinition &slot : slotDefinitions) {
QMetaMethodBuilder methodBuilder = builder.addSlot(::createSignature(slot));
methodBuilder.setReturnType(QMetaType::typeName(slot.returnType));
methodBuilder.setAttributes(QMetaMethod::Scriptable);
methodIndexByName[slot.name] = methodBuilder.index();
}
for (const PropertyDefinition &property : propertyDefinitions) {
const int writer = methodIndexByName.value(property.writeSlot, -1);
const int notifier = m_signalIndexByName.value(property.notifySignal, -1);
const QByteArray name = property.name.toUtf8();
const QByteArray typeName = QMetaObject::normalizedType(QMetaType::typeName(property.type));
QMetaPropertyBuilder propertyBuilder = builder.addProperty(name, typeName, notifier);
if (writer == -1)
propertyBuilder.setWritable(false);
if (notifier == -1)
propertyBuilder.setConstant(true);
m_propertySlots[property.name] = qMakePair(methodIndexByName.value(property.readSlot, -1),
methodIndexByName.value(property.writeSlot, -1));
}
return builder.toMetaObject();
}
示例11:
QMetaObject *GoValue::metaObjectFor(GoTypeInfo *typeInfo)
{
if (typeInfo->metaObject) {
return reinterpret_cast<QMetaObject *>(typeInfo->metaObject);
}
QMetaObjectBuilder mob;
mob.setSuperClass(&QObject::staticMetaObject);
mob.setClassName(typeInfo->typeName);
mob.setFlags(QMetaObjectBuilder::DynamicMetaObject);
GoMemberInfo *memberInfo;
memberInfo = typeInfo->fields;
int relativePropIndex = mob.propertyCount();
for (int i = 0; i < typeInfo->fieldsLen; i++) {
mob.addSignal("__" + QByteArray::number(relativePropIndex) + "()");
QMetaPropertyBuilder propb = mob.addProperty(memberInfo->memberName, "QVariant", relativePropIndex);
propb.setWritable(true);
memberInfo->metaIndex = relativePropIndex;
memberInfo++;
relativePropIndex++;
}
memberInfo = typeInfo->methods;
int relativeMethodIndex = mob.methodCount();
for (int i = 0; i < typeInfo->methodsLen; i++) {
if (*memberInfo->resultSignature) {
mob.addMethod(memberInfo->methodSignature, memberInfo->resultSignature);
} else {
mob.addMethod(memberInfo->methodSignature);
}
memberInfo->metaIndex = relativeMethodIndex;
memberInfo++;
relativeMethodIndex++;
}
QMetaObject *mo = mob.toMetaObject();
// Turn the relative indexes into absolute indexes.
memberInfo = typeInfo->fields;
int propOffset = mo->propertyOffset();
for (int i = 0; i < typeInfo->fieldsLen; i++) {
memberInfo->metaIndex += propOffset;
memberInfo++;
}
memberInfo = typeInfo->methods;
int methodOffset = mo->methodOffset();
for (int i = 0; i < typeInfo->methodsLen; i++) {
memberInfo->metaIndex += methodOffset;
memberInfo++;
}
typeInfo->metaObject = mo;
return mo;
}
示例12: create_dynamic_metaobject
// Create a dynamic meta-object for a Python type by introspecting its
// attributes. Note that it leaks if the type is deleted.
static int create_dynamic_metaobject(pyqtWrapperType *pyqt_wt)
{
PyTypeObject *pytype = (PyTypeObject *)pyqt_wt;
qpycore_metaobject *qo = new qpycore_metaobject;
#if QT_VERSION >= 0x050000
QMetaObjectBuilder builder;
#endif
// Get any class info.
QList<ClassInfo> class_info_list = qpycore_get_class_info_list();
// Get the super-type's meta-object.
#if QT_VERSION >= 0x050000
builder.setSuperClass(get_qmetaobject((pyqtWrapperType *)pytype->tp_base));
#else
qo->mo.d.superdata = get_qmetaobject((pyqtWrapperType *)pytype->tp_base);
#endif
// Get the name of the type. Dynamic types have simple names.
#if QT_VERSION >= 0x050000
builder.setClassName(pytype->tp_name);
#else
qo->str_data = pytype->tp_name;
qo->str_data.append('\0');
#endif
// Go through the class dictionary getting all PyQt properties, slots,
// signals or a (deprecated) sequence of signals.
typedef QPair<PyObject *, PyObject *> prop_data;
QMap<uint, prop_data> pprops;
QList<QByteArray> psigs;
SIP_SSIZE_T pos = 0;
PyObject *key, *value;
#if QT_VERSION < 0x050000
bool has_notify_signal = false;
QList<const QMetaObject *> enum_scopes;
#endif
while (PyDict_Next(pytype->tp_dict, &pos, &key, &value))
{
// See if it is a slot, ie. it has been decorated with pyqtSlot().
PyObject *sig_obj = PyObject_GetAttr(value,
qpycore_signature_attr_name);
if (sig_obj)
{
// Make sure it is a list and not some legitimate attribute that
// happens to use our special name.
if (PyList_Check(sig_obj))
{
for (SIP_SSIZE_T i = 0; i < PyList_GET_SIZE(sig_obj); ++i)
{
qpycore_slot slot;
// Set up the skeleton slot.
PyObject *decoration = PyList_GET_ITEM(sig_obj, i);
slot.signature = Chimera::Signature::fromPyObject(decoration);
slot.sip_slot.pyobj = 0;
slot.sip_slot.name = 0;
slot.sip_slot.meth.mfunc = value;
slot.sip_slot.meth.mself = 0;
#if PY_MAJOR_VERSION < 3
slot.sip_slot.meth.mclass = (PyObject *)pyqt_wt;
#endif
slot.sip_slot.weakSlot = 0;
qo->pslots.append(slot);
}
}
Py_DECREF(sig_obj);
}
else
{
PyErr_Clear();
// Make sure the key is an ASCII string. Delay the error checking
// until we know we actually need it.
const char *ascii_key = sipString_AsASCIIString(&key);
// See if the value is of interest.
if (PyType_IsSubtype(Py_TYPE(value), &qpycore_pyqtProperty_Type))
{
// It is a property.
if (!ascii_key)
return -1;
Py_INCREF(value);
qpycore_pyqtProperty *pp = (qpycore_pyqtProperty *)value;
pprops.insert(pp->pyqtprop_sequence, prop_data(key, value));
// See if the property has a scope. If so, collect all
// QMetaObject pointers that are not in the super-class
//.........这里部分代码省略.........
示例13: create_dynamic_metaobject
// Create a dynamic meta-object for a Python type by introspecting its
// attributes. Note that it leaks if the type is deleted.
static int create_dynamic_metaobject(pyqtWrapperType *pyqt_wt)
{
PyTypeObject *pytype = (PyTypeObject *)pyqt_wt;
qpycore_metaobject *qo = new qpycore_metaobject;
QMetaObjectBuilder builder;
// Get any class info.
QList<ClassInfo> class_info_list = qpycore_get_class_info_list();
// Get any enums/flags.
QList<EnumsFlags> enums_flags_list = qpycore_get_enums_flags_list();
// Get the super-type's meta-object.
builder.setSuperClass(get_qmetaobject((pyqtWrapperType *)pytype->tp_base));
// Get the name of the type. Dynamic types have simple names.
builder.setClassName(pytype->tp_name);
// Go through the class hierarchy getting all PyQt properties, slots and
// signals.
QList<const qpycore_pyqtSignal *> psigs;
QMap<uint, PropertyData> pprops;
if (trawl_hierarchy(pytype, qo, builder, psigs, pprops) < 0)
return -1;
qo->nr_signals = psigs.count();
// Initialise the header section of the data table. Note that Qt v4.5
// introduced revision 2 which added constructors. However the design is
// broken in that the static meta-call function doesn't provide enough
// information to determine which Python sub-class of a Qt class is to be
// created. So we stick with revision 1 (and don't allow pyqtSlot() to
// decorate __init__).
// Set up any class information.
for (int i = 0; i < class_info_list.count(); ++i)
{
const ClassInfo &ci = class_info_list.at(i);
builder.addClassInfo(ci.first, ci.second);
}
// Set up any enums/flags.
for (int i = 0; i < enums_flags_list.count(); ++i)
{
const EnumsFlags &ef = enums_flags_list.at(i);
QByteArray scoped_name(pytype->tp_name);
scoped_name.append("::");
scoped_name.append(ef.name);
QMetaEnumBuilder enum_builder = builder.addEnumerator(scoped_name);
enum_builder.setIsFlag(ef.isFlag);
QHash<QByteArray, int>::const_iterator it = ef.keys.constBegin();
while (it != ef.keys.constEnd())
{
enum_builder.addKey(it.key(), it.value());
++it;
}
}
// Add the signals to the meta-object.
for (int g = 0; g < qo->nr_signals; ++g)
{
const qpycore_pyqtSignal *ps = psigs.at(g);
QMetaMethodBuilder signal_builder = builder.addSignal(
ps->parsed_signature->signature.mid(1));
if (ps->parameter_names)
signal_builder.setParameterNames(*ps->parameter_names);
signal_builder.setRevision(ps->revision);
}
// Add the slots to the meta-object.
for (int s = 0; s < qo->pslots.count(); ++s)
{
const Chimera::Signature *slot_signature = qo->pslots.at(s)->slotSignature();
const QByteArray &sig = slot_signature->signature;
QMetaMethodBuilder slot_builder = builder.addSlot(sig);
// Add any type.
if (slot_signature->result)
slot_builder.setReturnType(slot_signature->result->name());
slot_builder.setRevision(slot_signature->revision);
}
// Add the properties to the meta-object.
QMapIterator<uint, PropertyData> it(pprops);
for (int p = 0; it.hasNext(); ++p)
//.........这里部分代码省略.........
示例14: trawl_type
// Trawl a type's dict looking for any slots, signals or properties.
static int trawl_type(PyTypeObject *pytype, qpycore_metaobject *qo,
QMetaObjectBuilder &builder, QList<const qpycore_pyqtSignal *> &psigs,
QMap<uint, PropertyData> &pprops)
{
SIP_SSIZE_T pos = 0;
PyObject *key, *value;
while (PyDict_Next(pytype->tp_dict, &pos, &key, &value))
{
// See if it is a slot, ie. it has been decorated with pyqtSlot().
PyObject *sig_obj = PyObject_GetAttr(value,
qpycore_dunder_pyqtsignature);
if (sig_obj)
{
// Make sure it is a list and not some legitimate attribute that
// happens to use our special name.
if (PyList_Check(sig_obj))
{
for (SIP_SSIZE_T i = 0; i < PyList_GET_SIZE(sig_obj); ++i)
{
// Set up the skeleton slot.
PyObject *decoration = PyList_GET_ITEM(sig_obj, i);
Chimera::Signature *slot_signature = Chimera::Signature::fromPyObject(decoration);
PyQtSlot *slot = new PyQtSlot(value, (PyObject *)pytype,
slot_signature);;
qo->pslots.append(slot);
}
}
Py_DECREF(sig_obj);
}
else
{
PyErr_Clear();
// Make sure the key is an ASCII string. Delay the error checking
// until we know we actually need it.
const char *ascii_key = sipString_AsASCIIString(&key);
// See if the value is of interest.
if (PyObject_TypeCheck(value, &qpycore_pyqtProperty_Type))
{
// It is a property.
if (!ascii_key)
return -1;
Py_INCREF(value);
qpycore_pyqtProperty *pp = (qpycore_pyqtProperty *)value;
pprops.insert(pp->pyqtprop_sequence, PropertyData(key, value));
// See if the property has a scope. If so, collect all
// QMetaObject pointers that are not in the super-class
// hierarchy.
const QMetaObject *mo = get_scope_qmetaobject(pp->pyqtprop_parsed_type);
if (mo)
builder.addRelatedMetaObject(mo);
}
else if (PyObject_TypeCheck(value, &qpycore_pyqtSignal_Type))
{
// It is a signal.
if (!ascii_key)
return -1;
qpycore_pyqtSignal *ps = (qpycore_pyqtSignal *)value;
// Make sure the signal has a name.
qpycore_set_signal_name(ps, pytype->tp_name, ascii_key);
// Add all the overloads.
do
{
psigs.append(ps);
ps = ps->next;
}
while (ps);
Py_DECREF(key);
}
else
{
PyErr_Clear();
}
}
}
return 0;
}
示例15: clone
static void clone(QMetaObjectBuilder &builder, const QMetaObject *mo,
const QMetaObject *ignoreStart, const QMetaObject *ignoreEnd)
{
// Set classname
builder.setClassName(ignoreEnd->className());
// Clone Q_CLASSINFO
for (int ii = mo->classInfoOffset(); ii < mo->classInfoCount(); ++ii) {
QMetaClassInfo info = mo->classInfo(ii);
int otherIndex = ignoreEnd->indexOfClassInfo(info.name());
if (otherIndex >= ignoreStart->classInfoOffset() + ignoreStart->classInfoCount()) {
// Skip
} else {
builder.addClassInfo(info.name(), info.value());
}
}
// Clone Q_PROPERTY
for (int ii = mo->propertyOffset(); ii < mo->propertyCount(); ++ii) {
QMetaProperty property = mo->property(ii);
int otherIndex = ignoreEnd->indexOfProperty(property.name());
if (otherIndex >= ignoreStart->propertyOffset() + ignoreStart->propertyCount()) {
builder.addProperty(QByteArray("__qml_ignore__") + property.name(), QByteArray("void"));
// Skip
} else {
builder.addProperty(property);
}
}
// Clone Q_METHODS
for (int ii = mo->methodOffset(); ii < mo->methodCount(); ++ii) {
QMetaMethod method = mo->method(ii);
// More complex - need to search name
QByteArray name = method.name();
bool found = false;
for (int ii = ignoreStart->methodOffset() + ignoreStart->methodCount();
!found && ii < ignoreEnd->methodOffset() + ignoreEnd->methodCount();
++ii) {
QMetaMethod other = ignoreEnd->method(ii);
found = name == other.name();
}
QMetaMethodBuilder m = builder.addMethod(method);
if (found) // SKIP
m.setAccess(QMetaMethod::Private);
}
// Clone Q_ENUMS
for (int ii = mo->enumeratorOffset(); ii < mo->enumeratorCount(); ++ii) {
QMetaEnum enumerator = mo->enumerator(ii);
int otherIndex = ignoreEnd->indexOfEnumerator(enumerator.name());
if (otherIndex >= ignoreStart->enumeratorOffset() + ignoreStart->enumeratorCount()) {
// Skip
} else {
builder.addEnumerator(enumerator);
}
}
}