Qt, передать параметр в функцию - PullRequest
0 голосов
/ 15 марта 2020

Как передать параметр в функцию getFunction через слот?

funcMenu->addAction("&1", garphArea, SLOT(getFunction(2)));

Ответы [ 2 ]

3 голосов
/ 15 марта 2020

В современных C ++ и Qt5 самый простой способ - не подключаться напрямую к слоту, а подключить его к lamda , который делает то, что вам нужно:

funcMenu->addAction("&1", graphArea, [graphArea](){
    graphArea->getFunction(2);
});

Выше код предполагает, что graphArea является указателем, и захватывает его по значению. Вы должны изучить C ++ лямбды, чтобы понять это более полно, или если вы хотите больше, чем просто то, что выше. Есть много нюансов и мелких грязных деталей в использовании лямбд (например, когда захватывать по значению, когда по ссылке), и их легко использовать неправильно.


Историческая справка: В Qt4, правильный способ сделать это - использовать QSignalMapper, но, на мой взгляд, это не интуитивно понятно и требует больше затрат, чем использование лямбды.

0 голосов
/ 15 марта 2020

Согласно документации здесь это Functor. Сигнал triggered() действия подключен к функтору. Функтор может быть указателем на функцию-член объекта context .

Итак, в вашем случае третий аргумент должен быть указателем на функцию-член объекта контекста garphArea

Вы можете обратиться к this , чтобы понять, как для передачи указателей на функции в качестве аргументов.

Более того, число аргументов в SIGNAL и SLOT должно совпадать. Здесь triggered() сигнал не имеет аргументов, поэтому я не уверен, что вы можете напрямую подключиться к функции-члену, принимающей аргументы. Возможно, подключитесь к функции-члену без аргументов и вызовите нужную функцию внутри нее.

РЕДАКТИРОВАТЬ 1:

Я вижу, что вы используете эту удобную функцию для вызова вашего слота. В нем говорится, что сигнал triggered() действия подключен к элементному слоту приемника . Но все же, чтобы заставить его работать, попробуйте позвонить без SLOT, например:

funcMenu->addAction("&1", garphArea, getFunction());

или

funcMenu->addAction("&1", garphArea, getFunction);

Я не тестировал эту строку кода, но она должна дать вам некоторое представление , Мои комментарии выше относительно аргументов все еще остаются верными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...