Remove QInternal callbacks and internal functions
After commit 79f675a1e0
, the connect and
disconnect callback API effectively becomes useless. Now that these
callbacks cannot/do not, it makes little sense to keep the backdoors
added for Qt Jambi support.
Remove them for now. Should the Qt Jambi team want/need to port to Qt 5,
we can re-add them, possibly designing a better API for doing so as
well.
Change-Id: I6209a1d647d683c979d5294b632b8c12c0f9f91c
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Reviewed-by: Olivier Goffart <ogoffart@woboq.com>
Reviewed-by: Lars Knoll <lars.knoll@nokia.com>
This commit is contained in:
parent
613183ff8c
commit
ad8edac53c
@ -2831,108 +2831,6 @@ int qrand()
|
|||||||
with meaningful parameter names in their signatures.
|
with meaningful parameter names in their signatures.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
struct QInternal_CallBackTable {
|
|
||||||
QVector<QList<qInternalCallback> > callbacks;
|
|
||||||
};
|
|
||||||
|
|
||||||
Q_GLOBAL_STATIC(QInternal_CallBackTable, global_callback_table)
|
|
||||||
|
|
||||||
bool QInternal::registerCallback(Callback cb, qInternalCallback callback)
|
|
||||||
{
|
|
||||||
if (cb >= 0 && cb < QInternal::LastCallback) {
|
|
||||||
QInternal_CallBackTable *cbt = global_callback_table();
|
|
||||||
cbt->callbacks.resize(cb + 1);
|
|
||||||
cbt->callbacks[cb].append(callback);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool QInternal::unregisterCallback(Callback cb, qInternalCallback callback)
|
|
||||||
{
|
|
||||||
if (cb >= 0 && cb < QInternal::LastCallback) {
|
|
||||||
QInternal_CallBackTable *cbt = global_callback_table();
|
|
||||||
return (bool) cbt->callbacks[cb].removeAll(callback);
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool QInternal::activateCallbacks(Callback cb, void **parameters)
|
|
||||||
{
|
|
||||||
Q_ASSERT_X(cb >= 0, "QInternal::activateCallback()", "Callback id must be a valid id");
|
|
||||||
|
|
||||||
QInternal_CallBackTable *cbt = global_callback_table();
|
|
||||||
if (cbt && cb < cbt->callbacks.size()) {
|
|
||||||
QList<qInternalCallback> callbacks = cbt->callbacks[cb];
|
|
||||||
bool ret = false;
|
|
||||||
for (int i=0; i<callbacks.size(); ++i)
|
|
||||||
ret |= (callbacks.at(i))(parameters);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
extern void qt_set_current_thread_to_main_thread();
|
|
||||||
|
|
||||||
bool QInternal::callFunction(InternalFunction func, void **args)
|
|
||||||
{
|
|
||||||
Q_ASSERT_X(func >= 0,
|
|
||||||
"QInternal::callFunction()", "Callback id must be a valid id");
|
|
||||||
#ifndef QT_NO_QOBJECT
|
|
||||||
switch (func) {
|
|
||||||
#ifndef QT_NO_THREAD
|
|
||||||
case QInternal::CreateThreadForAdoption:
|
|
||||||
*args = QAdoptedThread::createThreadForAdoption();
|
|
||||||
return true;
|
|
||||||
#endif
|
|
||||||
case QInternal::RefAdoptedThread:
|
|
||||||
QThreadData::get2((QThread *) *args)->ref();
|
|
||||||
return true;
|
|
||||||
case QInternal::DerefAdoptedThread:
|
|
||||||
QThreadData::get2((QThread *) *args)->deref();
|
|
||||||
return true;
|
|
||||||
case QInternal::SetCurrentThreadToMainThread:
|
|
||||||
qt_set_current_thread_to_main_thread();
|
|
||||||
return true;
|
|
||||||
case QInternal::SetQObjectSender: {
|
|
||||||
QObject *receiver = (QObject *) args[0];
|
|
||||||
QObjectPrivate::Sender *sender = new QObjectPrivate::Sender;
|
|
||||||
sender->sender = (QObject *) args[1];
|
|
||||||
sender->signal = *(int *) args[2];
|
|
||||||
sender->ref = 1;
|
|
||||||
|
|
||||||
// Store the old sender as "return value"
|
|
||||||
args[3] = QObjectPrivate::setCurrentSender(receiver, sender);
|
|
||||||
args[4] = sender;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
case QInternal::GetQObjectSender: {
|
|
||||||
QObject *receiver = (QObject *) args[0];
|
|
||||||
QObjectPrivate *d = QObjectPrivate::get(receiver);
|
|
||||||
args[1] = d->currentSender ? d->currentSender->sender : 0;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
case QInternal::ResetQObjectSender: {
|
|
||||||
QObject *receiver = (QObject *) args[0];
|
|
||||||
QObjectPrivate::Sender *oldSender = (QObjectPrivate::Sender *) args[1];
|
|
||||||
QObjectPrivate::Sender *sender = (QObjectPrivate::Sender *) args[2];
|
|
||||||
QObjectPrivate::resetCurrentSender(receiver, sender, oldSender);
|
|
||||||
delete sender;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
Q_UNUSED(args);
|
|
||||||
Q_UNUSED(func);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\macro Q_BYTE_ORDER
|
\macro Q_BYTE_ORDER
|
||||||
\relates <QtGlobal>
|
\relates <QtGlobal>
|
||||||
|
@ -1592,26 +1592,6 @@ public:
|
|||||||
RelayoutDropped
|
RelayoutDropped
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
enum Callback {
|
|
||||||
ConnectCallback,
|
|
||||||
DisconnectCallback,
|
|
||||||
AdoptCurrentThread,
|
|
||||||
EventNotifyCallback,
|
|
||||||
LastCallback
|
|
||||||
};
|
|
||||||
|
|
||||||
enum InternalFunction {
|
|
||||||
CreateThreadForAdoption,
|
|
||||||
RefAdoptedThread,
|
|
||||||
DerefAdoptedThread,
|
|
||||||
SetCurrentThreadToMainThread,
|
|
||||||
SetQObjectSender,
|
|
||||||
GetQObjectSender,
|
|
||||||
ResetQObjectSender,
|
|
||||||
LastInternalFunction
|
|
||||||
};
|
|
||||||
|
|
||||||
enum DockPosition {
|
enum DockPosition {
|
||||||
LeftDock,
|
LeftDock,
|
||||||
RightDock,
|
RightDock,
|
||||||
@ -1619,12 +1599,6 @@ public:
|
|||||||
BottomDock,
|
BottomDock,
|
||||||
DockCount
|
DockCount
|
||||||
};
|
};
|
||||||
|
|
||||||
static bool registerCallback(Callback, qInternalCallback);
|
|
||||||
static bool unregisterCallback(Callback, qInternalCallback);
|
|
||||||
|
|
||||||
static bool activateCallbacks(Callback, void **);
|
|
||||||
static bool callFunction(InternalFunction func, void **);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
@ -298,14 +298,6 @@ Q_CORE_EXPORT uint qGlobalPostedEventsCount()
|
|||||||
return currentThreadData->postEventList.size() - currentThreadData->postEventList.startOffset;
|
return currentThreadData->postEventList.size() - currentThreadData->postEventList.startOffset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void qt_set_current_thread_to_main_thread()
|
|
||||||
{
|
|
||||||
QCoreApplicationPrivate::theMainThread = QThread::currentThread();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
QCoreApplication *QCoreApplication::self = 0;
|
QCoreApplication *QCoreApplication::self = 0;
|
||||||
QAbstractEventDispatcher *QCoreApplicationPrivate::eventDispatcher = 0;
|
QAbstractEventDispatcher *QCoreApplicationPrivate::eventDispatcher = 0;
|
||||||
uint QCoreApplicationPrivate::attribs;
|
uint QCoreApplicationPrivate::attribs;
|
||||||
@ -795,14 +787,6 @@ bool QCoreApplication::testAttribute(Qt::ApplicationAttribute attribute)
|
|||||||
*/
|
*/
|
||||||
bool QCoreApplication::notifyInternal(QObject *receiver, QEvent *event)
|
bool QCoreApplication::notifyInternal(QObject *receiver, QEvent *event)
|
||||||
{
|
{
|
||||||
// Make it possible for Qt Jambi and QSA to hook into events even
|
|
||||||
// though QApplication is subclassed...
|
|
||||||
bool result = false;
|
|
||||||
void *cbdata[] = { receiver, event, &result };
|
|
||||||
if (QInternal::activateCallbacks(QInternal::EventNotifyCallback, cbdata)) {
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Qt enforces the rule that events can only be sent to objects in
|
// Qt enforces the rule that events can only be sent to objects in
|
||||||
// the current thread, so receiver->d_func()->threadData is
|
// the current thread, so receiver->d_func()->threadData is
|
||||||
// equivalent to QThreadData::current(), just without the function
|
// equivalent to QThreadData::current(), just without the function
|
||||||
|
@ -2388,13 +2388,6 @@ QMetaObject::Connection QObject::connect(const QObject *sender, const char *sign
|
|||||||
const QObject *receiver, const char *method,
|
const QObject *receiver, const char *method,
|
||||||
Qt::ConnectionType type)
|
Qt::ConnectionType type)
|
||||||
{
|
{
|
||||||
{
|
|
||||||
void *result = 0;
|
|
||||||
const void *cbdata[] = { sender, signal, receiver, method, &type , &result};
|
|
||||||
if (QInternal::activateCallbacks(QInternal::ConnectCallback, (void **) cbdata))
|
|
||||||
return QMetaObject::Connection(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef QT_NO_DEBUG
|
#ifndef QT_NO_DEBUG
|
||||||
bool warnCompat = true;
|
bool warnCompat = true;
|
||||||
#endif
|
#endif
|
||||||
@ -2573,18 +2566,6 @@ QMetaObject::Connection QObject::connect(const QObject *sender, const QMetaMetho
|
|||||||
signalSignature.append((char)(QSIGNAL_CODE + '0'));
|
signalSignature.append((char)(QSIGNAL_CODE + '0'));
|
||||||
signalSignature.append(signal.signature());
|
signalSignature.append(signal.signature());
|
||||||
|
|
||||||
{
|
|
||||||
QByteArray methodSignature;
|
|
||||||
methodSignature.reserve(qstrlen(method.signature())+1);
|
|
||||||
methodSignature.append((char)(method.methodType() == QMetaMethod::Slot ? QSLOT_CODE
|
|
||||||
: method.methodType() == QMetaMethod::Signal ? QSIGNAL_CODE : 0 + '0'));
|
|
||||||
methodSignature.append(method.signature());
|
|
||||||
void *result = 0;
|
|
||||||
const void *cbdata[] = { sender, signalSignature.constData(), receiver, methodSignature.constData(), &type, &result };
|
|
||||||
if (QInternal::activateCallbacks(QInternal::ConnectCallback, (void **) cbdata))
|
|
||||||
return QMetaObject::Connection(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
int signal_index;
|
int signal_index;
|
||||||
int method_index;
|
int method_index;
|
||||||
{
|
{
|
||||||
@ -2714,12 +2695,6 @@ bool QObject::disconnect(const QObject *sender, const char *signal,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
|
||||||
const void *cbdata[] = { sender, signal, receiver, method };
|
|
||||||
if (QInternal::activateCallbacks(QInternal::DisconnectCallback, (void **) cbdata))
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *signal_arg = signal;
|
const char *signal_arg = signal;
|
||||||
QByteArray signal_name;
|
QByteArray signal_name;
|
||||||
bool signal_found = false;
|
bool signal_found = false;
|
||||||
@ -2868,20 +2843,6 @@ bool QObject::disconnect(const QObject *sender, const QMetaMethod &signal,
|
|||||||
signalSignature.append(signal.signature());
|
signalSignature.append(signal.signature());
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
|
||||||
QByteArray methodSignature;
|
|
||||||
if (method.mobj) {
|
|
||||||
methodSignature.reserve(qstrlen(method.signature())+1);
|
|
||||||
methodSignature.append((char)(method.methodType() == QMetaMethod::Slot ? QSLOT_CODE
|
|
||||||
: method.methodType() == QMetaMethod::Signal ? QSIGNAL_CODE : 0 + '0'));
|
|
||||||
methodSignature.append(method.signature());
|
|
||||||
}
|
|
||||||
const void *cbdata[] = { sender, signal.mobj ? signalSignature.constData() : 0,
|
|
||||||
receiver, method.mobj ? methodSignature.constData() : 0 };
|
|
||||||
if (QInternal::activateCallbacks(QInternal::DisconnectCallback, (void **) cbdata))
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
int signal_index;
|
int signal_index;
|
||||||
int method_index;
|
int method_index;
|
||||||
{
|
{
|
||||||
|
@ -152,13 +152,6 @@ QAdoptedThread::~QAdoptedThread()
|
|||||||
// fprintf(stderr, "~QAdoptedThread = %p\n", this);
|
// fprintf(stderr, "~QAdoptedThread = %p\n", this);
|
||||||
}
|
}
|
||||||
|
|
||||||
QThread *QAdoptedThread::createThreadForAdoption()
|
|
||||||
{
|
|
||||||
QScopedPointer<QThread> t(new QAdoptedThread(0));
|
|
||||||
t->moveToThread(t.data());
|
|
||||||
return t.take();
|
|
||||||
}
|
|
||||||
|
|
||||||
void QAdoptedThread::run()
|
void QAdoptedThread::run()
|
||||||
{
|
{
|
||||||
// this function should never be called
|
// this function should never be called
|
||||||
|
@ -248,7 +248,6 @@ public:
|
|||||||
~QAdoptedThread();
|
~QAdoptedThread();
|
||||||
void init();
|
void init();
|
||||||
|
|
||||||
static QThread *createThreadForAdoption();
|
|
||||||
private:
|
private:
|
||||||
void run();
|
void run();
|
||||||
};
|
};
|
||||||
|
@ -199,28 +199,17 @@ QThreadData *QThreadData::current()
|
|||||||
{
|
{
|
||||||
QThreadData *data = get_thread_data();
|
QThreadData *data = get_thread_data();
|
||||||
if (!data) {
|
if (!data) {
|
||||||
void *a;
|
data = new QThreadData;
|
||||||
if (QInternal::activateCallbacks(QInternal::AdoptCurrentThread, &a)) {
|
QT_TRY {
|
||||||
QThread *adopted = static_cast<QThread*>(a);
|
|
||||||
Q_ASSERT(adopted);
|
|
||||||
data = QThreadData::get2(adopted);
|
|
||||||
set_thread_data(data);
|
set_thread_data(data);
|
||||||
adopted->d_func()->running = true;
|
data->thread = new QAdoptedThread(data);
|
||||||
adopted->d_func()->finished = false;
|
} QT_CATCH(...) {
|
||||||
static_cast<QAdoptedThread *>(adopted)->init();
|
clear_thread_data();
|
||||||
} else {
|
|
||||||
data = new QThreadData;
|
|
||||||
QT_TRY {
|
|
||||||
set_thread_data(data);
|
|
||||||
data->thread = new QAdoptedThread(data);
|
|
||||||
} QT_CATCH(...) {
|
|
||||||
clear_thread_data();
|
|
||||||
data->deref();
|
|
||||||
data = 0;
|
|
||||||
QT_RETHROW;
|
|
||||||
}
|
|
||||||
data->deref();
|
data->deref();
|
||||||
|
data = 0;
|
||||||
|
QT_RETHROW;
|
||||||
}
|
}
|
||||||
|
data->deref();
|
||||||
data->isAdopted = true;
|
data->isAdopted = true;
|
||||||
data->threadId = (Qt::HANDLE)pthread_self();
|
data->threadId = (Qt::HANDLE)pthread_self();
|
||||||
if (!QCoreApplicationPrivate::theMainThread)
|
if (!QCoreApplicationPrivate::theMainThread)
|
||||||
|
@ -101,29 +101,19 @@ QThreadData *QThreadData::current()
|
|||||||
qt_create_tls();
|
qt_create_tls();
|
||||||
QThreadData *threadData = reinterpret_cast<QThreadData *>(TlsGetValue(qt_current_thread_data_tls_index));
|
QThreadData *threadData = reinterpret_cast<QThreadData *>(TlsGetValue(qt_current_thread_data_tls_index));
|
||||||
if (!threadData) {
|
if (!threadData) {
|
||||||
QThread *adopted = 0;
|
threadData = new QThreadData;
|
||||||
if (QInternal::activateCallbacks(QInternal::AdoptCurrentThread, (void **) &adopted)) {
|
// This needs to be called prior to new AdoptedThread() to
|
||||||
Q_ASSERT(adopted);
|
// avoid recursion.
|
||||||
threadData = QThreadData::get2(adopted);
|
TlsSetValue(qt_current_thread_data_tls_index, threadData);
|
||||||
TlsSetValue(qt_current_thread_data_tls_index, threadData);
|
QT_TRY {
|
||||||
adopted->d_func()->running = true;
|
threadData->thread = new QAdoptedThread(threadData);
|
||||||
adopted->d_func()->finished = false;
|
} QT_CATCH(...) {
|
||||||
static_cast<QAdoptedThread *>(adopted)->init();
|
TlsSetValue(qt_current_thread_data_tls_index, 0);
|
||||||
} else {
|
|
||||||
threadData = new QThreadData;
|
|
||||||
// This needs to be called prior to new AdoptedThread() to
|
|
||||||
// avoid recursion.
|
|
||||||
TlsSetValue(qt_current_thread_data_tls_index, threadData);
|
|
||||||
QT_TRY {
|
|
||||||
threadData->thread = new QAdoptedThread(threadData);
|
|
||||||
} QT_CATCH(...) {
|
|
||||||
TlsSetValue(qt_current_thread_data_tls_index, 0);
|
|
||||||
threadData->deref();
|
|
||||||
threadData = 0;
|
|
||||||
QT_RETHROW;
|
|
||||||
}
|
|
||||||
threadData->deref();
|
threadData->deref();
|
||||||
|
threadData = 0;
|
||||||
|
QT_RETHROW;
|
||||||
}
|
}
|
||||||
|
threadData->deref();
|
||||||
threadData->isAdopted = true;
|
threadData->isAdopted = true;
|
||||||
threadData->threadId = (Qt::HANDLE)GetCurrentThreadId();
|
threadData->threadId = (Qt::HANDLE)GetCurrentThreadId();
|
||||||
|
|
||||||
|
@ -47,7 +47,6 @@ class tst_QGlobal: public QObject
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
private slots:
|
private slots:
|
||||||
void qIsNull();
|
void qIsNull();
|
||||||
void qInternalCallbacks();
|
|
||||||
void for_each();
|
void for_each();
|
||||||
void qassert();
|
void qassert();
|
||||||
void qtry();
|
void qtry();
|
||||||
@ -71,78 +70,6 @@ void tst_QGlobal::qIsNull()
|
|||||||
QVERIFY(!::qIsNull(f));
|
QVERIFY(!::qIsNull(f));
|
||||||
}
|
}
|
||||||
|
|
||||||
struct ConnectInfo {
|
|
||||||
QObject *sender;
|
|
||||||
QObject *receiver;
|
|
||||||
QString signal, slot;
|
|
||||||
int type;
|
|
||||||
void reset() {
|
|
||||||
sender = receiver = 0;
|
|
||||||
signal = slot = QString();
|
|
||||||
type = -1;
|
|
||||||
}
|
|
||||||
} connect_info;
|
|
||||||
|
|
||||||
bool disconnect_callback(void **data)
|
|
||||||
{
|
|
||||||
connect_info.sender = (QObject *)(data[0]);
|
|
||||||
connect_info.receiver = (QObject *)(data[2]);
|
|
||||||
connect_info.signal = QString::fromLatin1((const char *) data[1]);
|
|
||||||
connect_info.slot = QString::fromLatin1((const char *) data[3]);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool connect_callback(void **data)
|
|
||||||
{
|
|
||||||
disconnect_callback(data);
|
|
||||||
connect_info.type = *(int *) data[4];
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void tst_QGlobal::qInternalCallbacks()
|
|
||||||
{
|
|
||||||
QInternal::registerCallback(QInternal::ConnectCallback, connect_callback);
|
|
||||||
QInternal::registerCallback(QInternal::DisconnectCallback, disconnect_callback);
|
|
||||||
|
|
||||||
QObject a, b;
|
|
||||||
QString signal = QLatin1String("2mysignal(x)");
|
|
||||||
QString slot = QLatin1String("1myslot(x)");
|
|
||||||
|
|
||||||
// Test that connect works as expected...
|
|
||||||
connect_info.reset();
|
|
||||||
bool ok = QObject::connect(&a, signal.toLatin1(), &b, slot.toLatin1(), Qt::AutoConnection);
|
|
||||||
QVERIFY(!ok); // our dummy callback do not return a valid QMetaObject::Connection
|
|
||||||
QCOMPARE(&a, connect_info.sender);
|
|
||||||
QCOMPARE(&b, connect_info.receiver);
|
|
||||||
QCOMPARE(signal, connect_info.signal);
|
|
||||||
QCOMPARE(slot, connect_info.slot);
|
|
||||||
QCOMPARE((int) Qt::AutoConnection, connect_info.type);
|
|
||||||
|
|
||||||
// Test that disconnect works as expected
|
|
||||||
connect_info.reset();
|
|
||||||
ok = QObject::disconnect(&a, signal.toLatin1(), &b, slot.toLatin1());
|
|
||||||
QVERIFY(ok);
|
|
||||||
QCOMPARE(&a, connect_info.sender);
|
|
||||||
QCOMPARE(&b, connect_info.receiver);
|
|
||||||
QCOMPARE(signal, connect_info.signal);
|
|
||||||
QCOMPARE(slot, connect_info.slot);
|
|
||||||
|
|
||||||
// Unregister callbacks and verify that they are not triggered...
|
|
||||||
QInternal::unregisterCallback(QInternal::ConnectCallback, connect_callback);
|
|
||||||
QInternal::unregisterCallback(QInternal::DisconnectCallback, disconnect_callback);
|
|
||||||
|
|
||||||
connect_info.reset();
|
|
||||||
QTest::ignoreMessage(QtWarningMsg, "Object::connect: No such signal QObject::mysignal(x)");
|
|
||||||
ok = QObject::connect(&a, signal.toLatin1(), &b, slot.toLatin1(), Qt::AutoConnection);
|
|
||||||
QVERIFY(!ok);
|
|
||||||
QCOMPARE(connect_info.sender, (QObject *) 0);
|
|
||||||
|
|
||||||
QTest::ignoreMessage(QtWarningMsg, "Object::disconnect: No such signal QObject::mysignal(x)");
|
|
||||||
ok = QObject::disconnect(&a, signal.toLatin1(), &b, slot.toLatin1());
|
|
||||||
QVERIFY(!ok);
|
|
||||||
QCOMPARE(connect_info.sender, (QObject *) 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void tst_QGlobal::for_each()
|
void tst_QGlobal::for_each()
|
||||||
{
|
{
|
||||||
QList<int> list;
|
QList<int> list;
|
||||||
|
Loading…
Reference in New Issue
Block a user