LINUX.ORG.RU

Как сделать коннект к слоту с параметром по-умолчанию в Qt5

 , , параметр, ,


0

1

Имеется слот с параметром по-умолчанию:

private slots:
    void keepTrack(bool isForse=false);

Мне нужно вызвать его, указав в качестве параметра true.

Согласно вот этой статье http://cppstudio.com/post/11167/, новый синтаксис коннекта не поддерживает слотов с параметрами по-умолчанию, поэтому пользуюсь старым синтаксисом:
    connect(&APPCORE, SIGNAL(deactivation()), this, SLOT(keepTrack(true)));

Однако при запуске в консоль вываливается ошибка:
QObject::connect: No such slot GeoPath::keepTrack(true)

Если убрать параметр true, то ошибки нет, но мне-то нужно вызвать слот с параметром true.

Вопрос: как в этой ситуации сделать коннект к слоту, у которого имеется параметр по-умолчанию?

★★★★★

Тебе надо сделать вот так:

connect(&APPCORE, SIGNAL(deactivation(bool)), this, SLOT(keepTrack(bool)));

В connect нельзя указывать конкретные значения, только типы

XMs ★★★★★
()
Ответ на: комментарий от RazrFalcon

Ну я сделал конечно лямбдой, но это за гранью человечности:

connect(&APPCORE, &Core::deactivation, this, [=](bool force=true){ keepTrack(force); });

Я сам не понимаю как это парсится и как вообще работает.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от RazrFalcon

Учите C++

Тут дело и в космической сложности C++, и в Qt. Старый стиль коннекта, который делался через MOC, более-менее понятно как реализовывался. Насколько я понял, новый стиль коннекта реализуется вроде как самим языком C++.

В новом стиле тип для сигнала и слота задается как QMetaMethod&. Если мы откроем документацию на него, то не найдем описания конструктора. Таким образом, как создается и что представляет из себя объект такого класса, мне непонятно. Возможно, у него пустой конструктор по-умолчанию без аргументов, и поэтому про него не написали, но это как-то странно.

Отсюда по цепочке следуют и другие непонятки. Тупо из практики и по книжкам мы знаем, что для сигналов и слотов в новом стиле передаются указатели на методы. Если метод имеет уникальную сигнатуру и не перегружен, то его вызов прост. Если сигнатура не уникальна, то нужно приводить тип к нужной сигнатуре через static_cast<>, это тоже можно понять. Однако как происходит приведение типа произвольного метода к QMetaMethod& - мне непонятно.

Далее непонятно, как эта сраная лямбда работает в контексте объекта, задаваемого через this. У меня простой случай, и код этой лямбды физически прописан в конструкторе, так как connect прописан в конструкторе. А если бы connect прописывался в другом классе? Лямбда сработала бы, будучи физически прописанной в одном классе, а вызываемая в контексте другого объекта?

Ну и помимо сложностей написания C++ кода, я не могу себе в голове представить, что генерирует компилятор и что происходит в самом машинном коде, когда идет обработка этого connect и вообще работа с лямбдами. В понимании внутренней структуры реализации языка я кое-как допыхтел до vtable с его динамическим полиморфизмом (качественной информации на русском крайне мало, но я думаю, что вроде понял), но далее понимания языка уже нет совсем.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от anonymous

connect(&APPCORE, &Core::deactivation, [this](){ keepTrack(true);});

Да, смысла в бинарной переменной никакого небыло.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Лямбда сработала бы, будучи физически прописанной в одном классе, а вызываемая в контексте другого объекта?

Лямбда - это сахар. А connect просто запоминает указатели сигнала и слота.

не могу себе в голове представить, что генерирует компилятор и что происходит в самом машинном коде

А оно важно для ваших задач?

RazrFalcon ★★★★★
()
Ответ на: комментарий от RazrFalcon

Лямбда сработала бы, будучи физически прописанной в одном классе, а вызываемая в контексте другого объекта?

Лямбда - это сахар. А connect просто запоминает указатели сигнала и слота.

Это сахар для функторов или что-то другое имеете в виду?


не могу себе в голове представить, что генерирует компилятор и что происходит в самом машинном коде

А оно важно для ваших задач?

Важно для понимания языка. А это самая главная задача при использовании языка. Тяжело использовать язык, если не понимаешь, как он работает.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Это сахар для функторов или что-то другое имеете в виду?

Имеется ввиду, что в большинстве случаев компилятор всё соптимизирует и никакого оверхеда не будет.

RazrFalcon ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.