3014 QCOMPARE(obj2.o2_obj, &obj3); |
3020 QCOMPARE(obj2.o2_obj, &obj3); |
3015 QCOMPARE(obj2.o3_obj, (QObject *)0); //default arg of the signal |
3021 QCOMPARE(obj2.o3_obj, (QObject *)0); //default arg of the signal |
3016 QCOMPARE(obj2.o4_obj, qApp); //default arg of the slot |
3022 QCOMPARE(obj2.o4_obj, qApp); //default arg of the slot |
3017 } |
3023 } |
3018 |
3024 |
|
3025 class ManySignals : public QObject |
|
3026 { Q_OBJECT |
|
3027 friend class tst_QObject; |
|
3028 signals: |
|
3029 void sig00(); void sig01(); void sig02(); void sig03(); void sig04(); |
|
3030 void sig05(); void sig06(); void sig07(); void sig08(); void sig09(); |
|
3031 void sig10(); void sig11(); void sig12(); void sig13(); void sig14(); |
|
3032 void sig15(); void sig16(); void sig17(); void sig18(); void sig19(); |
|
3033 void sig20(); void sig21(); void sig22(); void sig23(); void sig24(); |
|
3034 void sig25(); void sig26(); void sig27(); void sig28(); void sig29(); |
|
3035 void sig30(); void sig31(); void sig32(); void sig33(); void sig34(); |
|
3036 void sig35(); void sig36(); void sig37(); void sig38(); void sig39(); |
|
3037 void sig40(); void sig41(); void sig42(); void sig43(); void sig44(); |
|
3038 void sig45(); void sig46(); void sig47(); void sig48(); void sig49(); |
|
3039 void sig50(); void sig51(); void sig52(); void sig53(); void sig54(); |
|
3040 void sig55(); void sig56(); void sig57(); void sig58(); void sig59(); |
|
3041 void sig60(); void sig61(); void sig62(); void sig63(); void sig64(); |
|
3042 void sig65(); void sig66(); void sig67(); void sig68(); void sig69(); |
|
3043 |
|
3044 public slots: |
|
3045 void received() { rec++; } |
|
3046 public: |
|
3047 int rec; |
|
3048 }; |
|
3049 |
|
3050 |
|
3051 void tst_QObject::isSignalConnected() |
|
3052 { |
|
3053 ManySignals o; |
|
3054 o.rec = 0; |
|
3055 #ifdef QT_BUILD_INTERNAL |
|
3056 QObjectPrivate *priv = QObjectPrivate::get(&o); |
|
3057 QVERIFY(!priv->isSignalConnected(priv->signalIndex("destroyed()"))); |
|
3058 QVERIFY(!priv->isSignalConnected(priv->signalIndex("sig00()"))); |
|
3059 QVERIFY(!priv->isSignalConnected(priv->signalIndex("sig05()"))); |
|
3060 QVERIFY(!priv->isSignalConnected(priv->signalIndex("sig15()"))); |
|
3061 QVERIFY(!priv->isSignalConnected(priv->signalIndex("sig29()"))); |
|
3062 QVERIFY(!priv->isSignalConnected(priv->signalIndex("sig60()"))); |
|
3063 QVERIFY(!priv->isSignalConnected(priv->signalIndex("sig61()"))); |
|
3064 #endif |
|
3065 |
|
3066 QObject::connect(&o, SIGNAL(sig00()), &o, SIGNAL(sig69())); |
|
3067 QObject::connect(&o, SIGNAL(sig34()), &o, SIGNAL(sig03())); |
|
3068 QObject::connect(&o, SIGNAL(sig69()), &o, SIGNAL(sig34())); |
|
3069 QObject::connect(&o, SIGNAL(sig03()), &o, SIGNAL(sig18())); |
|
3070 |
|
3071 #ifdef QT_BUILD_INTERNAL |
|
3072 QVERIFY(!priv->isSignalConnected(priv->signalIndex("destroyed()"))); |
|
3073 QVERIFY(!priv->isSignalConnected(priv->signalIndex("sig05()"))); |
|
3074 QVERIFY(!priv->isSignalConnected(priv->signalIndex("sig15()"))); |
|
3075 QVERIFY(!priv->isSignalConnected(priv->signalIndex("sig29()"))); |
|
3076 |
|
3077 QVERIFY(priv->isSignalConnected(priv->signalIndex("sig00()"))); |
|
3078 QVERIFY(priv->isSignalConnected(priv->signalIndex("sig03()"))); |
|
3079 QVERIFY(priv->isSignalConnected(priv->signalIndex("sig34()"))); |
|
3080 QVERIFY(priv->isSignalConnected(priv->signalIndex("sig69()"))); |
|
3081 QVERIFY(!priv->isSignalConnected(priv->signalIndex("sig18()"))); |
|
3082 #endif |
|
3083 |
|
3084 QObject::connect(&o, SIGNAL(sig18()), &o, SIGNAL(sig29())); |
|
3085 QObject::connect(&o, SIGNAL(sig29()), &o, SIGNAL(sig62())); |
|
3086 QObject::connect(&o, SIGNAL(sig62()), &o, SIGNAL(sig28())); |
|
3087 QObject::connect(&o, SIGNAL(sig28()), &o, SIGNAL(sig27())); |
|
3088 |
|
3089 #ifdef QT_BUILD_INTERNAL |
|
3090 QVERIFY(priv->isSignalConnected(priv->signalIndex("sig18()"))); |
|
3091 QVERIFY(priv->isSignalConnected(priv->signalIndex("sig62()"))); |
|
3092 QVERIFY(priv->isSignalConnected(priv->signalIndex("sig28()"))); |
|
3093 QVERIFY(priv->isSignalConnected(priv->signalIndex("sig69()"))); |
|
3094 QVERIFY(!priv->isSignalConnected(priv->signalIndex("sig27()"))); |
|
3095 #endif |
|
3096 |
|
3097 QCOMPARE(o.rec, 0); |
|
3098 emit o.sig01(); |
|
3099 emit o.sig34(); |
|
3100 QCOMPARE(o.rec, 0); |
|
3101 |
|
3102 QObject::connect(&o, SIGNAL(sig27()), &o, SLOT(received())); |
|
3103 |
|
3104 #ifdef QT_BUILD_INTERNAL |
|
3105 QVERIFY(priv->isSignalConnected(priv->signalIndex("sig00()"))); |
|
3106 QVERIFY(priv->isSignalConnected(priv->signalIndex("sig03()"))); |
|
3107 QVERIFY(priv->isSignalConnected(priv->signalIndex("sig34()"))); |
|
3108 QVERIFY(priv->isSignalConnected(priv->signalIndex("sig18()"))); |
|
3109 QVERIFY(priv->isSignalConnected(priv->signalIndex("sig62()"))); |
|
3110 QVERIFY(priv->isSignalConnected(priv->signalIndex("sig28()"))); |
|
3111 QVERIFY(priv->isSignalConnected(priv->signalIndex("sig69()"))); |
|
3112 QVERIFY(priv->isSignalConnected(priv->signalIndex("sig27()"))); |
|
3113 |
|
3114 QVERIFY(!priv->isSignalConnected(priv->signalIndex("sig04()"))); |
|
3115 QVERIFY(!priv->isSignalConnected(priv->signalIndex("sig21()"))); |
|
3116 QVERIFY(!priv->isSignalConnected(priv->signalIndex("sig25()"))); |
|
3117 QVERIFY(!priv->isSignalConnected(priv->signalIndex("sig55()"))); |
|
3118 QVERIFY(!priv->isSignalConnected(priv->signalIndex("sig61()"))); |
|
3119 #endif |
|
3120 |
|
3121 emit o.sig00(); |
|
3122 QCOMPARE(o.rec, 1); |
|
3123 emit o.sig69(); |
|
3124 QCOMPARE(o.rec, 2); |
|
3125 emit o.sig36(); |
|
3126 QCOMPARE(o.rec, 2); |
|
3127 } |
|
3128 |
|
3129 void tst_QObject::qMetaObjectConnect() |
|
3130 { |
|
3131 SenderObject *s = new SenderObject; |
|
3132 ReceiverObject *r1 = new ReceiverObject; |
|
3133 ReceiverObject *r2 = new ReceiverObject; |
|
3134 r1->reset(); |
|
3135 r2->reset(); |
|
3136 ReceiverObject::sequence = 0; |
|
3137 |
|
3138 int signal1Index = s->metaObject()->indexOfSignal("signal1()"); |
|
3139 int signal3Index = s->metaObject()->indexOfSignal("signal3()"); |
|
3140 int slot1Index = r1->metaObject()->indexOfSlot("slot1()"); |
|
3141 int slot2Index = r1->metaObject()->indexOfSlot("slot2()"); |
|
3142 int slot3Index = r1->metaObject()->indexOfSlot("slot3()"); |
|
3143 |
|
3144 QVERIFY(slot1Index > 0); |
|
3145 QVERIFY(slot2Index > 0); |
|
3146 QVERIFY(slot3Index > 0); |
|
3147 |
|
3148 QVERIFY( QMetaObject::connect( s, signal1Index, r1, slot1Index) ); |
|
3149 QVERIFY( QMetaObject::connect( s, signal3Index, r2, slot3Index) ); |
|
3150 QVERIFY( QMetaObject::connect( s, -1, r2, slot2Index) ); |
|
3151 |
|
3152 QCOMPARE( r1->count_slot1, 0 ); |
|
3153 QCOMPARE( r1->count_slot2, 0 ); |
|
3154 QCOMPARE( r1->count_slot3, 0 ); |
|
3155 QCOMPARE( r2->count_slot1, 0 ); |
|
3156 QCOMPARE( r2->count_slot2, 0 ); |
|
3157 QCOMPARE( r2->count_slot3, 0 ); |
|
3158 |
|
3159 s->emitSignal1(); |
|
3160 |
|
3161 QCOMPARE( r1->count_slot1, 1 ); |
|
3162 QCOMPARE( r1->count_slot2, 0 ); |
|
3163 QCOMPARE( r1->count_slot3, 0 ); |
|
3164 QCOMPARE( r2->count_slot1, 0 ); |
|
3165 QCOMPARE( r2->count_slot2, 1 ); |
|
3166 QCOMPARE( r2->count_slot3, 0 ); |
|
3167 |
|
3168 s->emitSignal2(); |
|
3169 s->emitSignal3(); |
|
3170 s->emitSignal4(); |
|
3171 |
|
3172 QCOMPARE( r1->count_slot1, 1 ); |
|
3173 QCOMPARE( r1->count_slot2, 0 ); |
|
3174 QCOMPARE( r1->count_slot3, 0 ); |
|
3175 QCOMPARE( r2->count_slot1, 0 ); |
|
3176 QCOMPARE( r2->count_slot2, 4 ); |
|
3177 QCOMPARE( r2->count_slot3, 1 ); |
|
3178 |
|
3179 QVERIFY( QMetaObject::disconnect( s, signal1Index, r1, slot1Index) ); |
|
3180 QVERIFY( QMetaObject::disconnect( s, signal3Index, r2, slot3Index) ); |
|
3181 QVERIFY( QMetaObject::disconnect( s, -1, r2, slot2Index) ); |
|
3182 |
|
3183 s->emitSignal1(); |
|
3184 s->emitSignal2(); |
|
3185 s->emitSignal3(); |
|
3186 s->emitSignal4(); |
|
3187 |
|
3188 QCOMPARE( r1->count_slot1, 1 ); |
|
3189 QCOMPARE( r1->count_slot2, 0 ); |
|
3190 QCOMPARE( r1->count_slot3, 0 ); |
|
3191 QCOMPARE( r2->count_slot1, 0 ); |
|
3192 QCOMPARE( r2->count_slot2, 4 ); |
|
3193 QCOMPARE( r2->count_slot3, 1 ); |
|
3194 |
|
3195 //some "dynamic" signal |
|
3196 QVERIFY( QMetaObject::connect( s, s->metaObject()->methodOffset() + 20, r1, slot3Index) ); |
|
3197 QVERIFY( QMetaObject::connect( s, s->metaObject()->methodOffset() + 35, r2, slot1Index) ); |
|
3198 QVERIFY( QMetaObject::connect( s, -1, r1, slot2Index) ); |
|
3199 |
|
3200 r1->reset(); |
|
3201 r2->reset(); |
|
3202 |
|
3203 void *args[] = { 0 , 0 }; |
|
3204 QMetaObject::activate(s, s->metaObject()->methodOffset() + 20, args); |
|
3205 QMetaObject::activate(s, s->metaObject()->methodOffset() + 48, args); |
|
3206 QCOMPARE( r1->count_slot1, 0 ); |
|
3207 QCOMPARE( r1->count_slot2, 2 ); |
|
3208 QCOMPARE( r1->count_slot3, 1 ); |
|
3209 QCOMPARE( r2->count_slot1, 0 ); |
|
3210 QCOMPARE( r2->count_slot2, 0 ); |
|
3211 QCOMPARE( r2->count_slot3, 0 ); |
|
3212 |
|
3213 QMetaObject::activate(s, s->metaObject()->methodOffset() + 35, args); |
|
3214 s->emitSignal1(); |
|
3215 s->emitSignal2(); |
|
3216 |
|
3217 QCOMPARE( r1->count_slot1, 0 ); |
|
3218 QCOMPARE( r1->count_slot2, 5 ); |
|
3219 QCOMPARE( r1->count_slot3, 1 ); |
|
3220 QCOMPARE( r2->count_slot1, 1 ); |
|
3221 QCOMPARE( r2->count_slot2, 0 ); |
|
3222 QCOMPARE( r2->count_slot3, 0 ); |
|
3223 |
|
3224 delete s; |
|
3225 r1->reset(); |
|
3226 r2->reset(); |
|
3227 |
|
3228 #define SIGNAL_INDEX(S) obj1.metaObject()->indexOfSignal(QMetaObject::normalizedSignature(#S)) |
|
3229 OverloadObject obj1; |
|
3230 QObject obj2, obj3; |
|
3231 |
|
3232 QMetaObject::connect(&obj1, SIGNAL_INDEX(sig(int)) , r1, slot1Index); |
|
3233 QMetaObject::connect(&obj1, SIGNAL_INDEX(sig(QObject *, QObject *, QObject *)) , r2, slot1Index); |
|
3234 |
|
3235 QMetaObject::connect(&obj1, SIGNAL_INDEX(sig(QObject *, QObject *, QObject *, QObject *)) , r1, slot2Index); |
|
3236 QMetaObject::connect(&obj1, SIGNAL_INDEX(sig(QObject *)) , r2, slot2Index); |
|
3237 QMetaObject::connect(&obj1, SIGNAL_INDEX(sig(int, int)) , r1, slot3Index); |
|
3238 |
|
3239 emit obj1.sig(0.5); //connected to nothing |
|
3240 emit obj1.sig(1, 'a'); //connected to nothing |
|
3241 QCOMPARE( r1->count_slot1, 0 ); |
|
3242 QCOMPARE( r1->count_slot2, 0 ); |
|
3243 QCOMPARE( r1->count_slot3, 0 ); |
|
3244 QCOMPARE( r2->count_slot1, 0 ); |
|
3245 QCOMPARE( r2->count_slot2, 0 ); |
|
3246 QCOMPARE( r2->count_slot3, 0 ); |
|
3247 |
|
3248 emit obj1.sig(1); //this signal is connected |
|
3249 emit obj1.sig(&obj2); |
|
3250 |
|
3251 QCOMPARE( r1->count_slot1, 1 ); |
|
3252 QCOMPARE( r1->count_slot2, 0 ); |
|
3253 QCOMPARE( r1->count_slot3, 1 ); |
|
3254 QCOMPARE( r2->count_slot1, 0 ); |
|
3255 QCOMPARE( r2->count_slot2, 1 ); |
|
3256 QCOMPARE( r2->count_slot3, 0 ); |
|
3257 |
|
3258 emit obj1.sig(&obj2, &obj3); //this signal is connected |
|
3259 |
|
3260 QCOMPARE( r1->count_slot1, 1 ); |
|
3261 QCOMPARE( r1->count_slot2, 1 ); |
|
3262 QCOMPARE( r1->count_slot3, 1 ); |
|
3263 QCOMPARE( r2->count_slot1, 1 ); |
|
3264 QCOMPARE( r2->count_slot2, 1 ); |
|
3265 QCOMPARE( r2->count_slot3, 0 ); |
|
3266 |
|
3267 delete r1; |
|
3268 delete r2; |
|
3269 |
|
3270 } |
|
3271 |
3019 QTEST_MAIN(tst_QObject) |
3272 QTEST_MAIN(tst_QObject) |
3020 #include "tst_qobject.moc" |
3273 #include "tst_qobject.moc" |