本文整理汇总了C++中QMetaObjectBuilder::toMetaObject方法的典型用法代码示例。如果您正苦于以下问题:C++ QMetaObjectBuilder::toMetaObject方法的具体用法?C++ QMetaObjectBuilder::toMetaObject怎么用?C++ QMetaObjectBuilder::toMetaObject使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类QMetaObjectBuilder
的用法示例。
在下文中一共展示了QMetaObjectBuilder::toMetaObject方法的13个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: init
void QDeclarativeOpenMetaObjectTypePrivate::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();
}
}
示例2: 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)");
}
示例3: 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();
}
示例4: addSlot
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;
}
示例5: addSignal
bool Test::addSignal(const QString &signal)
{
if (d->signalName2Id.value(signal, -1) != -1)
return false;
QDataStream istream(d->metadata);
QMetaObjectBuilder builder;
QMap<QByteArray, const QMetaObject*> refs;
builder.deserialize(istream, refs);
int metaIndex = builder.addSignal(signal.toLocal8Bit()).index()
+ d->meta->methodOffset();
d->signalName2Id.insert(signal, metaIndex);
if (d->meta)
free(d->meta);
d->meta = builder.toMetaObject();
QDataStream ostream(&d->metadata, QIODevice::WriteOnly);
builder.serialize(ostream);
return true;
}
示例6: removeSlot
bool Test::removeSlot(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 = d->slotId2Name.key(slot);
builder.removeMethod(metaIndex - d->meta->methodOffset());
d->slotId2Name.remove(metaIndex);
if (d->meta)
free(d->meta);
d->meta = builder.toMetaObject();
QDataStream ostream(&d->metadata, QIODevice::WriteOnly);
builder.serialize(ostream);
return true;
}
示例7: removeSignal
bool Test::removeSignal(const QString &signal)
{
if (d->signalName2Id.value(signal, -1) == -1)
return false;
QDataStream istream(d->metadata);
QMetaObjectBuilder builder;
QMap<QByteArray, const QMetaObject*> refs;
builder.deserialize(istream, refs);
int metaIndex = d->signalName2Id.value(signal) - d->meta->methodOffset();
d->signalName2Id.remove(signal);
builder.removeMethod(metaIndex);
if (d->meta)
free(d->meta);
d->meta = builder.toMetaObject();
QDataStream ostream(&d->metadata, QIODevice::WriteOnly);
builder.serialize(ostream);
return true;
}
示例8: 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);
}
}
示例9:
QMetaObject *metaObjectFor(GoTypeInfo *typeInfo)
{
if (typeInfo->metaObject) {
return reinterpret_cast<QMetaObject *>(typeInfo->metaObject);
}
QMetaObjectBuilder mob;
if (typeInfo->paint) {
mob.setSuperClass(&QQuickPaintedItem::staticMetaObject);
} else {
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) + "()");
const char *typeName = "QVariant";
if (memberInfo->memberType == DTListProperty) {
typeName = "QQmlListProperty<QObject>";
}
QMetaPropertyBuilder propb = mob.addProperty(memberInfo->memberName, typeName, 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++;
}
// TODO Support default properties.
//mob.addClassInfo("DefaultProperty", "objects");
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;
}
示例10: create_dynamic_metaobject
//.........这里部分代码省略.........
prop_builder.setReadable(true);
#else
flags |= 0x00000001;
#endif
if (pp->pyqtprop_set && PyCallable_Check(pp->pyqtprop_set))
{
// Writable.
#if QT_VERSION >= 0x050000
prop_builder.setWritable(true);
#else
flags |= 0x00000002;
#endif
// See if the name of the setter follows the Designer convention.
// If so tell the UI compilers not to use setProperty().
PyObject *setter_name_obj = PyObject_GetAttr(pp->pyqtprop_set,
qpycore_name_attr_name);
if (setter_name_obj)
{
PyObject *ascii_obj = setter_name_obj;
const char *ascii = sipString_AsASCIIString(&ascii_obj);
Py_DECREF(setter_name_obj);
if (ascii)
{
if (qstrlen(ascii) > 3 && ascii[0] == 's' &&
ascii[1] == 'e' && ascii[2] == 't' &&
ascii[3] == toupper(prop_name[0]) &&
qstrcmp(&ascii[4], &prop_name[1]) == 0)
#if QT_VERSION >= 0x050000
prop_builder.setStdCppSet(true);
#else
flags |= 0x00000100;
#endif
}
Py_DECREF(ascii_obj);
}
PyErr_Clear();
}
if (pp->pyqtprop_reset && PyCallable_Check(pp->pyqtprop_reset))
// Resetable.
#if QT_VERSION >= 0x050000
prop_builder.setResettable(true);
#else
flags |= 0x00000004;
#endif
// Add the property flags.
#if QT_VERSION >= 0x050000
// Note that Qt4 always seems to have ResolveEditable set but
// QMetaObjectBuilder doesn't provide an API call to do it.
prop_builder.setDesignable(pp->pyqtprop_flags & 0x00001000);
prop_builder.setScriptable(pp->pyqtprop_flags & 0x00004000);
prop_builder.setStored(pp->pyqtprop_flags & 0x00010000);
prop_builder.setUser(pp->pyqtprop_flags & 0x00100000);
prop_builder.setConstant(pp->pyqtprop_flags & 0x00000400);
prop_builder.setFinal(pp->pyqtprop_flags & 0x00000800);
#else
flags |= pp->pyqtprop_flags;
data[p_offset + (p * 3) + 2] = flags;
#endif
// Save the property data for qt_metacall(). (We already have a
// reference.)
qo->pprops.append(pp);
// We've finished with the property name.
Py_DECREF(pprop.first);
}
#if QT_VERSION < 0x050000
// Add the indices of the notify signals.
if (has_notify_signal)
{
QListIterator<uint> notify_it(notify_signals);
while (notify_it.hasNext())
data[n_offset++] = notify_it.next();
}
#endif
// Initialise the rest of the meta-object.
#if QT_VERSION >= 0x050000
qo->mo = builder.toMetaObject();
#else
qo->mo.d.stringdata = qo->str_data.constData();
qo->mo.d.data = data;
#endif
// Save the meta-object.
pyqt_wt->metaobject = qo;
return 0;
}
示例11: create_dynamic_metaobject
//.........这里部分代码省略.........
// is one that will be proxied by QML at some point.
if (pp->pyqtprop_parsed_type->typeDef() == sipType_QObject)
{
prop_type = ((PyTypeObject *)pp->pyqtprop_parsed_type->py_type())->tp_name;
prop_type.append('*');
}
else
{
prop_type = "QObject*";
}
}
else
{
prop_type = pp->pyqtprop_parsed_type->name();
}
QMetaPropertyBuilder prop_builder = builder.addProperty(prop_name,
prop_type, notifier_id);
// Reset the defaults.
prop_builder.setReadable(false);
prop_builder.setWritable(false);
// Enum or flag.
if (pp->pyqtprop_parsed_type->isEnum() || pp->pyqtprop_parsed_type->isFlag())
{
prop_builder.setEnumOrFlag(true);
}
if (pp->pyqtprop_get && PyCallable_Check(pp->pyqtprop_get))
{
// Readable.
prop_builder.setReadable(true);
}
if (pp->pyqtprop_set && PyCallable_Check(pp->pyqtprop_set))
{
// Writable.
prop_builder.setWritable(true);
// See if the name of the setter follows the Designer convention.
// If so tell the UI compilers not to use setProperty().
PyObject *setter_name_obj = PyObject_GetAttr(pp->pyqtprop_set,
qpycore_dunder_name);
if (setter_name_obj)
{
PyObject *ascii_obj = setter_name_obj;
const char *ascii = sipString_AsASCIIString(&ascii_obj);
Py_DECREF(setter_name_obj);
if (ascii)
{
if (qstrlen(ascii) > 3 && ascii[0] == 's' &&
ascii[1] == 'e' && ascii[2] == 't' &&
ascii[3] == toupper(prop_name[0]) &&
qstrcmp(&ascii[4], &prop_name[1]) == 0)
prop_builder.setStdCppSet(true);
}
Py_DECREF(ascii_obj);
}
PyErr_Clear();
}
if (pp->pyqtprop_reset && PyCallable_Check(pp->pyqtprop_reset))
{
// Resetable.
prop_builder.setResettable(true);
}
// Add the property flags. Note that Qt4 always seems to have
// ResolveEditable set but QMetaObjectBuilder doesn't provide an API
// call to do it.
prop_builder.setDesignable(pp->pyqtprop_flags & 0x00001000);
prop_builder.setScriptable(pp->pyqtprop_flags & 0x00004000);
prop_builder.setStored(pp->pyqtprop_flags & 0x00010000);
prop_builder.setUser(pp->pyqtprop_flags & 0x00100000);
prop_builder.setConstant(pp->pyqtprop_flags & 0x00000400);
prop_builder.setFinal(pp->pyqtprop_flags & 0x00000800);
prop_builder.setRevision(pp->pyqtprop_revision);
// Save the property data for qt_metacall(). (We already have a
// reference.)
qo->pprops.append(pp);
// We've finished with the property name.
Py_DECREF(pprop.first);
}
// Initialise the rest of the meta-object.
qo->mo = builder.toMetaObject();
// Save the meta-object.
pyqt_wt->metaobject = qo;
return 0;
}
示例12: init
void QQmlTypePrivate::init() const
{
if (m_isSetup) return;
QWriteLocker lock(metaTypeDataLock());
if (m_isSetup)
return;
const QMetaObject *mo = m_baseMetaObject;
if (!mo) {
// singleton type without metaobject information
return;
}
// Setup extended meta object
// XXX - very inefficient
if (m_extFunc) {
QMetaObjectBuilder builder;
clone(builder, m_extMetaObject, m_extMetaObject, m_extMetaObject);
builder.setFlags(QMetaObjectBuilder::DynamicMetaObject);
QMetaObject *mmo = builder.toMetaObject();
mmo->d.superdata = mo;
QQmlProxyMetaObject::ProxyData data = { mmo, m_extFunc, 0, 0 };
m_metaObjects << data;
}
mo = mo->d.superdata;
while(mo) {
QQmlType *t = metaTypeData()->metaObjectToType.value(mo);
if (t) {
if (t->d->m_extFunc) {
QMetaObjectBuilder builder;
clone(builder, t->d->m_extMetaObject, t->d->m_baseMetaObject, m_baseMetaObject);
builder.setFlags(QMetaObjectBuilder::DynamicMetaObject);
QMetaObject *mmo = builder.toMetaObject();
mmo->d.superdata = m_baseMetaObject;
if (!m_metaObjects.isEmpty())
m_metaObjects.last().metaObject->d.superdata = mmo;
QQmlProxyMetaObject::ProxyData data = { mmo, t->d->m_extFunc, 0, 0 };
m_metaObjects << data;
}
}
mo = mo->d.superdata;
}
for (int ii = 0; ii < m_metaObjects.count(); ++ii) {
m_metaObjects[ii].propertyOffset =
m_metaObjects.at(ii).metaObject->propertyOffset();
m_metaObjects[ii].methodOffset =
m_metaObjects.at(ii).metaObject->methodOffset();
}
// Check for revisioned details
{
const QMetaObject *mo = 0;
if (m_metaObjects.isEmpty())
mo = m_baseMetaObject;
else
mo = m_metaObjects.first().metaObject;
for (int ii = 0; !m_containsRevisionedAttributes && ii < mo->propertyCount(); ++ii) {
if (isPropertyRevisioned(mo, ii))
m_containsRevisionedAttributes = true;
}
for (int ii = 0; !m_containsRevisionedAttributes && ii < mo->methodCount(); ++ii) {
if (mo->method(ii).revision() != 0)
m_containsRevisionedAttributes = true;
}
}
m_isSetup = true;
lock.unlock();
}
示例13: init
// Initialisation common to all ctors.
void PyQtProxy::init(QObject *qtx, PyQtProxy::ProxyHash *hash, void *key)
{
// Create a new meta-object on the heap so that it looks like it has a
// signal of the right name and signature.
#if QT_VERSION >= 0x050000
QMetaObjectBuilder builder;
builder.setClassName("PyQtProxy");
builder.setSuperClass(&QObject::staticMetaObject);
// Note that signals must be added before slots.
if (type == ProxySignal)
builder.addSignal(signature);
else
builder.addSlot("unislot()");
builder.addSlot("disable()");
meta_object = builder.toMetaObject();
#else
if (type == ProxySignal)
{
QMetaObject *mo = new QMetaObject;
mo->d.superdata = &QObject::staticMetaObject;
mo->d.extradata = 0;
// Calculate the size of the string meta-data as follows:
// - "PyQtProxy" and its terminating '\0' (ie. 9 + 1 bytes),
// - a '\0' used for any empty string,
// - "disable()" and its terminating '\0' (ie. 9 + 1 bytes),
// - the (non-existent) argument names (ie. use the empty string if
// there is less that two arguments, otherwise a comma between each
// argument and the terminating '\0'),
// - the name and full signature, less the initial type character, plus
// the terminating '\0'.
const size_t fixed_len = 9 + 1 + 1 + 9 + 1;
const size_t empty_str = 9 + 1;
int nr_commas = signature.count(',');
size_t len = fixed_len
+ (nr_commas >= 0 ? nr_commas + 1 : 0)
+ signature.size() + 1;
char *smd = new char[len];
memcpy(smd, slot_meta_stringdata, fixed_len);
uint i = fixed_len, args_pos;
if (nr_commas > 0)
{
args_pos = i;
for (int c = 0; c < nr_commas; ++c)
smd[i++] = ',';
smd[i++] = '\0';
}
else
{
args_pos = empty_str;
}
uint sig_pos = i;
qstrcpy(&smd[i], signature.constData());
mo->d.stringdata = smd;
// Add the non-string data.
uint *data = new uint[21];
memcpy(data, slot_meta_data, 21 * sizeof (uint));
// Replace the first method (ie. unislot()) with the new signal.
data[10] = sig_pos;
data[11] = args_pos;
data[14] = 0x05;
mo->d.data = data;
meta_object = mo;
}
else
{
meta_object = &staticMetaObject;
}
#endif
hashed = true;
saved_key = key;
transmitter = qtx;
// Add this one to the global hashes.
mutex->lock();
hash->insert(key, this);
mutex->unlock();
//.........这里部分代码省略.........