Почему сигналы Qt по умолчанию являются публичными? - PullRequest
0 голосов
/ 23 апреля 2019

Сегодня я понял, что если у вас есть 3 класса, например:

класс 1 имеет сигнал

класс 2 имеет сигнал, который подключается к частному слоту класса 3

класс 3 имеет личный слот, а класс 2 - друг класса 3

Если я подключу сигнал класса 1 к сигналу класса 2, я могу по существу вызвать частный слот класса 3, испуская сигнал класса 1.

Если бы сигналы были частными или защищенными, этого бы не произошло.

Есть еще один сценарий, в котором это может быть плохо, представьте, что у нас есть такая настройка:

класс 1 имеет сигнал

класс 2 имеет сигнал, который подключается к защищенному слоту базовых классов

класс 3 - это базовый класс с защищенным слотом

Не нарушает ли это объектно-ориентированные принципы?

1 Ответ

3 голосов
/ 24 апреля 2019

woboq упоминает это:

Сигналы были защищены в Qt4 и ранее.Они становятся открытыми в Qt5 для включения нового синтаксиса .


Вы можете создать частный / защищенный вспомогательный объект с сигналом 'private':

class Helper : public QObject
{
    Q_OBJECT
public:
    Helper(QObject *parent) : QObject(parent) { }
signals:
    void MyPrivateSignal();
};

class MyClass : public QObject
{
    Q_OBJECT
public:
    MyClass()
        : QObject(),
        helper(new Helper(this))
    {
        connect(helper, &Helper::MyPrivateSignal, this, &MyClass::MyPrivateSlot);
    }

private slots:
    void MyPrivateSlot();

private:
    void InvokeMyPrivateSignal()
    {
        emit helper->MyPrivateSignal();
    }

private: // or protected:
    Helper *helper;
};

Любой может подключиться к Helper::MyPrivateSignal() экземпляра Helper, но не для вашего Helper экземпляра, потому что только вы его знаете.

...