Подтвердить что ты не робот

Разница между методами QObject:: connect vs connect

Я новичок с Qt. В большинстве случаев разработчикам Qt необходимо использовать сигналы и слоты для обмена объектами. До сих пор я видел два способа подключения сигналов и слотов.

1)QObject::connect(scrollBar, SIGNAL(valueChanged(int)),label,  SLOT(setNum(int)));

2)connect(scrollBar, SIGNAL(valueChanged(int)),label,  SLOT(setNum(int)));

Какая разница между ними? Почему мы должны префикс QObject в первом методе?

4b9b3361

Ответ 1

Вы вызываете статическую версию в обоих вышеупомянутых случаях, подпись которой такова:

QMetaObject:: Connection QObject:: connect (const QObject * sender, const char * signal, const QObject * receiver, const char * метод, Qt:: Тип подключаемого типа = Qt:: AutoConnection) [статические]

Если вы не подключаетесь внутри подкласса QObject, вам нужно будет использовать вариант с областью, соответственно, потому что у вас не будет объекта для его вызова. Здесь вы можете увидеть код, представляющий разницу.

Не скопировано

class MyClass : public QObject
{
    Q_OBJECT
    public:
        MyClass(QObject *parent) : QObject(parent) {
            connect(this, SIGNAL(mySignal()), SLOT(mySlot()));
        }

    public signals:
        void mySignal();

    public slots:
        void mySlot();
};

Scoped

int main(int argc, char **argv)
{
    QCoreApplication a(argc, argv);
    MyClass myObject;
    QObject::connect(&myObject, SIGNAL(mySignal()), &myObject, SLOT(mySlot()));
    return a.exec();
}

Обратите внимание, что если вы пытаетесь сделать это соединение в объекте получателя, вы можете даже пропустить третий аргумент для удобства (т.е. меньше ввода), потому что нестатическая версия const будет позаботиться об этом автоматически в соответствии с документацией:

QMetaObject:: Connection QObject:: connect (const QObject * sender, const char * signal, const char * method, Qt:: Тип ConnectType = Qt:: AutoConnection) const

Эта функция перегружает connect().

Подключает сигнал от объекта-отправителя к этому объекту.

Эквивалент соединения (отправитель, сигнал, этот, метод, тип).

Каждое соединение, которое вы делаете, излучает сигнал, поэтому дублированные соединения выдают два сигнала. Вы можете разбить соединение, используя disconnect().