File indexing completed on 2024-04-28 05:38:41

0001 #include <QtCore/QObject>
0002 #include <QtCore/QTimer>
0003 #include <QtCore/QPointer>
0004 #include <QtCore/QModelIndex>
0005 #include <QtWidgets/QProgressDialog>
0006 #include <QtDBus/QDBusInterface>
0007 #include <QtWidgets/QMenu>
0008 #include <QtWidgets/QMessageBox>
0009 #if QT_VERSION_MAJOR == 5
0010 #include <QtCore/QState>
0011 #include <QtWidgets/QAction>
0012 #else
0013 #include <QtStateMachine/QState>
0014 #include <QtGui/QAction>
0015 #endif
0016 
0017 class MyObj : public QObject
0018 {
0019     Q_OBJECT
0020 public Q_SLOTS:
0021     void slot1();
0022     void slot2() {};
0023     void slotWithArg(int i = 0) {};
0024 Q_SIGNALS:
0025     void signal1();
0026 };
0027 
0028 void foo()
0029 {
0030     MyObj *o1;
0031     MyObj *o2;
0032 
0033     o1->connect(o1, SIGNAL(signal1()), o2, SLOT(slot1()));
0034     o1->connect(o1, SIGNAL(signal1()), SLOT(slot1()));
0035     o1->connect(o1, SIGNAL(signal1()), SIGNAL(signal1()));
0036     QObject::connect(o1, SIGNAL(signal1()), o2, SIGNAL(signal1()));
0037     QObject::disconnect(o1, SIGNAL(signal1()), o2, SIGNAL(signal1()));
0038 
0039     o1->connect(o1, &MyObj::signal1, &MyObj::signal1);
0040     QObject::connect(o1, &MyObj::signal1, o2, &MyObj::signal1);
0041     QObject::disconnect(o1, &MyObj::signal1, o2, &MyObj::signal1);
0042 
0043     QTimer::singleShot(0, o1, SLOT(slot1()));
0044     QTimer::singleShot(0, o1, &MyObj::slot1);
0045     // QTimer doesn't support it with new connect syntax: Needs lambda
0046     QTimer::singleShot(0, o1, SLOT(slotWithArg()));
0047 };
0048 
0049 
0050 void MyObj::slot1()
0051 {
0052     MyObj *o1;
0053     connect(o1, SIGNAL(signal1()), SLOT(slot2()));
0054 }
0055 
0056 class MyObjDerived : public MyObj
0057 {
0058     Q_OBJECT
0059 public:
0060     MyObjDerived()
0061     {
0062         connect(this, SIGNAL(signal1()), this, SLOT(slot2()));
0063         connect(this, SIGNAL(signal1()), SLOT(slot2()));
0064     }
0065 };
0066 
0067 void testDerived()
0068 {
0069     MyObjDerived *o1;
0070     o1->connect(o1, SIGNAL(signal1()), o1, SLOT(slot2()));
0071     o1->connect(o1, SIGNAL(signal1()), SLOT(slot2()));
0072     QObject::connect(o1, SIGNAL(signal1()), o1, SLOT(slot2()));
0073 }
0074 
0075 class OtherObj : public QObject
0076 {
0077     Q_OBJECT
0078 public Q_SLOTS:
0079     void otherSlot() {}
0080     void otherSlotArg(bool) {}
0081 };
0082 
0083 void testOther()
0084 {
0085     OtherObj *other;
0086     MyObj *o1;
0087     other->connect(o1, SIGNAL(signal1()), SLOT(otherSlot()));
0088 }
0089 
0090 class WithNesting : public QObject
0091 {
0092     Q_OBJECT
0093 public Q_SLOTS:
0094     void slot1() {}
0095 signals: void signal1();
0096 private Q_SLOTS: void privSlot() {}
0097 public:
0098     class Private;
0099     friend class Private;
0100 };
0101 
0102 class WithNesting::Private : public QObject
0103 {
0104     Q_OBJECT
0105 public:
0106     Private(WithNesting *q)
0107     {
0108         q->connect(q, SIGNAL(signal1()), SLOT(slot1()));
0109         connect(q, SIGNAL(signal1()), SLOT(pSlot1()));
0110         connect(q, SIGNAL(signal1()), q, SLOT(privSlot()));
0111         QTimer::singleShot(0, this, SLOT(privateSlot1())); // Testing if private slot gets fixed, it should due to "this"
0112     }
0113 public Q_SLOTS:
0114     void pSlot1() {}
0115 private Q_SLOT:
0116     void privateSlot1() {}
0117 signals:
0118     void signal1();
0119 };
0120 
0121 void testNested()
0122 {
0123      WithNesting::Private *p;
0124      QObject::connect(p, SIGNAL(signal1()), p, SLOT(privateSlot1())); // Warning, but can't fix, can't take address of private
0125 
0126      // QObject::connect(p, &WithNesting::Private::signal1, p, &WithNesting::Private::privateSlot1);
0127 }
0128 
0129 void testCharVariables(const char *methodName)
0130 {
0131     QObject *o;
0132     QTimer::singleShot(0, o, methodName); // OK
0133     QObject::connect(o, methodName, 0, methodName); // OK
0134     o->connect(o, methodName, 0, methodName); // OK
0135     o->connect(o, SIGNAL(destroyed()), 0, methodName); // OK
0136 }
0137 
0138 void testQState()
0139 {
0140     QState *s;
0141     QObject *o;
0142     s->addTransition(o, SIGNAL(destroyed()), s); // Warning
0143     s->addTransition(o, &QObject::destroyed, s); // OK
0144 
0145     WithNesting *wn;
0146     s->addTransition(wn, SLOT(privSlot()), s); // Warning, but can't fix
0147 }
0148 
0149 class TestingArgumentCounts : public QObject
0150 {
0151     Q_OBJECT
0152 public:
0153     TestingArgumentCounts()
0154     {
0155         connect(this, SIGNAL(si0()), SLOT(sl0())); // Warning and fixit
0156         connect(this, SIGNAL(si0()), SLOT(sl1(QString))); // Warning and can't fix
0157         connect(this, SIGNAL(si1(QString)), SLOT(sl0())); // Warning and can fix
0158         connect(this, SIGNAL(si2(QString)), SLOT(sl2())); // Warning and can't fix
0159     }
0160 public Q_SLOTS:
0161     void sl0() {}
0162     void sl1(QString) {}
0163     void sl2(QString,QString,QString = QString()) {}
0164 
0165 signals:
0166     void si0();
0167     void si1(QString);
0168     void si2(QString,QString);
0169     void si3(QString,QString,QString);
0170 };
0171 
0172 
0173 class TestingProtected : public QObject
0174 {
0175     Q_OBJECT
0176 protected Q_SLOT:
0177     void protec();
0178 };
0179 
0180 
0181 class DerivedTestingProtected : public TestingProtected
0182 {
0183     void test()
0184     {
0185         connect(this, SIGNAL(destroyed()), this, SLOT(protec()));
0186     }
0187 };
0188 
0189 
0190 void testQPointer()
0191 {
0192     QPointer<WithNesting> p8733 = new WithNesting();
0193     QObject::connect(p8733, SIGNAL(destroyed()), p8733, SLOT(deleteLater())); // Warning, and when fixed should have .data() due to gcc bug
0194     QObject::connect(p8733, &WithNesting::destroyed, p8733, &WithNesting::deleteLater);
0195     QObject::connect(p8733.data(), SIGNAL(destroyed()), p8733.data(), SLOT(deleteLater())); // Warning
0196     QObject::connect(p8733.data(), &WithNesting::destroyed, p8733.data(), &WithNesting::deleteLater);
0197     p8733->connect(p8733, SIGNAL(destroyed()), SLOT(deleteLater())); // Warning, but no-fix, not implemented. Fails to get implicit caller for now
0198 }
0199 
0200 
0201 
0202 
0203 
0204 
0205 struct S1
0206 {
0207 };
0208 
0209 struct S2
0210 {
0211 
0212 };
0213 
0214 struct S3
0215 {
0216     S3(S2);
0217 };
0218 
0219 struct S1a : public S1
0220 {
0221 
0222 };
0223 
0224 class TestTypes : public QObject
0225 {
0226     Q_OBJECT
0227     TestTypes()
0228     {
0229         connect(this, SIGNAL(s1(bool)), SIGNAL(s2(int)));                           // Warning && fixit
0230         connect(this, SIGNAL(s2(int)), SIGNAL(s1(bool)));                           // Warning && fixit
0231         connect(this, SIGNAL(s2(int)), SIGNAL(s9(float)));                          // Warning && no-fixit
0232         connect(this, SIGNAL(s2(int)), SIGNAL(s10(double)));                        // Warning && no-fixit
0233         connect(this, SIGNAL(s9(float)), SIGNAL(s2(int)));                          // Warning && no-fixit
0234         connect(this, SIGNAL(s10(double)), SIGNAL(s2(int)));                        // Warning && no-fixit
0235         connect(this, SIGNAL(s10(double)), SIGNAL(s7(char)));                       // Warning && no-fixit
0236         connect(this, SIGNAL(s7(char)), SIGNAL(s10(double)));                       // Warning && no-fixit
0237         connect(this, SIGNAL(s3(int*)), SIGNAL(s1(bool)));                          // Warning && no-fixit
0238         connect(this, SIGNAL(s3(int*)), SIGNAL(s6(float *)));                       // Warning && no-fixit
0239         connect(this, SIGNAL(s1(bool)), SIGNAL(s3(int*)));                          // Warning && no-fixit
0240         connect(this, SIGNAL(doubleClicked(QModelIndex)), SIGNAL(triggered(bool))); // Warning && no-fixit
0241         connect(this, SIGNAL(s27(const S1 *)), SIGNAL(s23(const S1)));              // Warning && no-fixit
0242         connect(this, SIGNAL(s22(const S1)), SIGNAL(s27(const S1 *)));              // Warning && no-fixit
0243         connect(this, SIGNAL(s31(const S1 &)), SIGNAL(s31(const S1 &)));            // Warning && fixit
0244         connect(this, SIGNAL(s31(const S1 &)), SIGNAL(s23(const S1)));              // Warning && fixit
0245         connect(this, SIGNAL(s11(S1)), SIGNAL(s31(S1)));                            // Warning && fixit
0246         connect(this, SIGNAL(s31(S1)), SIGNAL(s11(S1)));                            // Warning && fixit
0247     }
0248 
0249 signals:
0250     void s1(bool);
0251     void s2(int);
0252     void s3(int *);
0253     void s4(bool *);
0254     void s5(float *);
0255     void s6(float *);
0256     void s7(char);
0257     void s8(char *);
0258     void s9(float);
0259     void s10(double);
0260     void s11(S1);
0261     void s12(S2);
0262     void s13(S3);
0263     void s14(S1a);
0264     void s15(S1*);
0265     void s16(S2*);
0266     void s17(S3*);
0267     void s18(S1a*);
0268     void s19(S1&);
0269     void s20(S2&);
0270     void s21(S3&);
0271     void s22(S1a&);
0272 
0273     void s23(const S1);
0274     void s24(const S2);
0275     void s25(const S3);
0276     void s26(const S1a);
0277 
0278     void s27(const S1 *);
0279     void s28(const S2 *);
0280     void s29(const S3 *);
0281     void s30(const S1a *);
0282 
0283     void s31(const S1 &);
0284     void s32(S1 &);
0285 
0286     void doubleClicked(const QModelIndex &);
0287     void triggered(bool yes = false);
0288 
0289 };
0290 
0291 namespace Kleo {
0292 class ProgressDialog : public QProgressDialog
0293 {
0294     Q_OBJECT
0295 public:
0296     ProgressDialog(int ms);
0297 };
0298 }
0299 
0300 Kleo::ProgressDialog::ProgressDialog(int ms)
0301 {
0302     QTimer::singleShot(ms, this, SLOT(forceShow()));
0303 }
0304 
0305 struct P {
0306     QPointer<MyObj> ptr;
0307 };
0308 
0309 
0310 class TestQPointerMember : public QObject
0311 {
0312     Q_OBJECT
0313 public:
0314     TestQPointerMember()
0315     {
0316         QPointer<MyObj> ptr;
0317         connect(m_ptr, SIGNAL(signal1()), SLOT(slot1()));
0318         connect(m_ptr, SIGNAL(signal1()), m_ptr, SLOT(slot1()));
0319         connect(ptr, SIGNAL(signal1()), SLOT(slot1()));
0320         connect(ptr, SIGNAL(signal1()), ptr, SLOT(slot1()));
0321         connect(p->ptr, SIGNAL(signal1()), p->ptr.data(), SLOT(slot1()));
0322         connect(d_func()->ptr, SIGNAL(signal1()), d_func()->ptr.data(), SLOT(slot1()));
0323         ptr->disconnect(this);
0324     }
0325 
0326     P* d_func() { return p; };
0327 
0328 public Q_SLOTS:
0329     void slot1() {}
0330 
0331 private:
0332     QPointer<MyObj> m_ptr;
0333     P *p;
0334 };
0335 
0336 
0337 void testWhitelist()
0338 {
0339     QDBusInterface *i;
0340     QObject *o;
0341     o->connect(o, SIGNAL(destroyed()), i, SLOT(foo()));
0342 }
0343 
0344 int main() { return 0; }
0345 
0346 
0347 
0348 
0349 class TestStatic : public QObject
0350 {
0351     Q_OBJECT
0352 public:
0353     TestStatic(QObject *parent = nullptr) : QObject(parent)
0354     {}
0355 
0356 public slots:
0357     static void test(QObject *)
0358     {
0359     }
0360 };
0361 
0362 void testStatic()
0363 {
0364     auto test = new TestStatic;
0365     TestStatic::connect(test, SIGNAL(destroyed(QObject*)), test, SLOT(test(QObject*)));
0366     TestStatic::disconnect(test, SIGNAL(destroyed(QObject*)), test, SLOT(test(QObject*)));
0367 }
0368 
0369 void test1ArgDisconnect()
0370 {
0371     QObject *o;
0372     o->disconnect(SIGNAL(destroyed())); 
0373 }
0374 
0375 void testQMenuAndQMessageBox()
0376 {
0377     QMenu m;
0378     OtherObj o;
0379     m.addAction("test", &o, SLOT(otherSlot())); // Warn
0380     m.addAction("test", &o, &OtherObj::otherSlot); // OK
0381     QMessageBox box;
0382     box.open(); // OK
0383     box.open(&o,SLOT(otherSlot())); // Warn
0384 
0385     m.addAction("test", &o, SLOT(otherSlotArg(bool))); // Warn
0386 }
0387 
0388 #if QT_VERSION_MAJOR == 5
0389 #include "main.qt5.moc_"
0390 #else
0391 #include "main.qt6.moc_"
0392 #endif