Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
1 / 1 / 0
Регистрация: 20.04.2015
Сообщений: 73
1

Особенности записи аргументов connect в Qt5

08.06.2016, 23:38. Показов 2431. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый вечер.
Поясните пожалуйста, что значит это:
C++ (Qt)
1
connect(mySpinBox, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), mySlider, &QSlider::setValue);
А конкретно вот это:
C++ (Qt)
1
(QSpinBox::*)
Имеется ввиду указатель на любую функцию QSpinBox?
Если можно, прокомментировать всю строку. Спасибо!
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.06.2016, 23:38
Ответы с готовыми решениями:

Как боротся с вирусом a-connect(i-connect,z-connect)
Итак расскажу что за вирус... Этот вирус создает новое подключение VPN a-connect и через 1-2...

Perl + MySQL = ошибка DBI connect(dbname=mysql; host=localhost',''...) failed: Couldnt connect to
С перлом беда какая-то, третий день мучаюсь и ничего не получается... хелп!!!. use dbi; $dbh =...

Could not connect: Can't connect to MySQL server
Здраствуйте. Очень прошу Вашей помощи. Уже не знаю что делать, ужас просто какой то. Раньше все...

"Can't connect to MySQL server on 'localhost' (10061) QMYSQL: Unable to connect"
Добрый день! У меня следующая проблема на Windows XP установила QtCreator и MySQL сервер теперь...

12
Pied Piper
236 / 227 / 57
Регистрация: 15.01.2013
Сообщений: 855
09.06.2016, 00:04 2
Лучший ответ Сообщение было отмечено NewBi как решение

Решение

Кастит указатель на функцию типа &QSpinBox::valueChanged, к указателю на функцию класса QSpinBox который принимает int и возвращает void. Вроде так.
1
0 / 0 / 0
Регистрация: 08.08.2015
Сообщений: 91
09.06.2016, 06:45 3
Не понимаю зачем отказались от старого способа записи, раньше было короче и удобнее...а сейчас у неперегруженных функций с параметрами приходится записывать этот длинный каст, который не вмещается в ширину экрана. Почему компилятор не может это сделать за меня?
0
Pied Piper
236 / 227 / 57
Регистрация: 15.01.2013
Сообщений: 855
09.06.2016, 10:55 4
Цитата Сообщение от kavashige Посмотреть сообщение
Не понимаю зачем отказались от старого способа записи, раньше было короче и удобнее...
Старый способ есть и сейчас, используйте его.

Цитата Сообщение от kavashige Посмотреть сообщение
Почему компилятор не может это сделать за меня?
Откуда компилятор знает чего вы там хотите?
1
0 / 0 / 0
Регистрация: 08.08.2015
Сообщений: 91
09.06.2016, 18:08 5
Цитата Сообщение от ArmanPrestige Посмотреть сообщение
Старый способ есть и сейчас, используйте его.
Он работает только со слотами, если например взять лямбда выражение, то я уже должен писать новым способом.

Цитата Сообщение от ArmanPrestige Посмотреть сообщение
Откуда компилятор знает чего вы там хотите?
Если всего одна сигнатура и нет перегрузок, то почему бы не возложить это компилятору и не сделать запись короче.
0
1943 / 1768 / 825
Регистрация: 23.01.2014
Сообщений: 6,230
09.06.2016, 19:20 6
Можно пару вопросов:
1. Причем тут лямбда-функции?
2. Зачем этот каст?
0
Pied Piper
236 / 227 / 57
Регистрация: 15.01.2013
Сообщений: 855
09.06.2016, 20:55 7
Цитата Сообщение от kavashige Посмотреть сообщение
Если всего одна сигнатура и нет перегрузок
Вообще-то, если всего один сигнал (без перегрузок) то достаточно

C++ (Qt)
1
connect(this, &MyClass::mySignal, otherClass, &OtherClass::hisSlot);
Добавлено через 2 минуты
Цитата Сообщение от pav1uxa Посмотреть сообщение
1. Причем тут лямбда-функции?
При том, что в connect можно передать лямбду. Но тогда, как сигнал надо передавать функтор, а не const char* как раньше.

З.Ы. результат SLOT(...), SIGNAL(...) - const char*

Цитата Сообщение от pav1uxa Посмотреть сообщение
2. Зачем этот каст?
В случае перегруженных сигналов и слотов при передачи функтора возникает коллизия. Кастом явно указывается, какой сигнал/слот использовать.
1
1943 / 1768 / 825
Регистрация: 23.01.2014
Сообщений: 6,230
09.06.2016, 21:13 8
Цитата Сообщение от ArmanPrestige Посмотреть сообщение
При том, что в connect можно передать лямбду.
Я знаю, но разве то что в примере передается в коннекте это лямбда? Видимо у меня неверное представление о лямбда-функциях.
Цитата Сообщение от ArmanPrestige Посмотреть сообщение
В случае перегруженных сигналов и слотов при передачи функтора возникает коллизия. Кастом явно указывается, какой сигнал/слот использовать.
Здорово, только недавно думал над тем, что же делать в таких случаях. Удачно ответ нашелся сам собой
0
Pied Piper
236 / 227 / 57
Регистрация: 15.01.2013
Сообщений: 855
09.06.2016, 23:58 9
Цитата Сообщение от pav1uxa Посмотреть сообщение
Я знаю, но разве то что в примере передается в коннекте это лямбда? Видимо у меня неверное представление о лямбда-функциях.
Это просто товарищ kavashige завел тему о лямбдах. Для их использования в коннекте нужно использовать новый синтаксис.
0
0 / 0 / 0
Регистрация: 08.08.2015
Сообщений: 91
10.06.2016, 08:14 10
Прошу прощения, но каждый раз, когда я вижу новый синтаксис меня коробит...видимо только меня
Цитата Сообщение от ArmanPrestige Посмотреть сообщение
Вообще-то, если всего один сигнал (без перегрузок) то достаточно connect(this, &MyClass::mySignal, otherClass, &OtherClass::hisSlot);
А если он всего один и с параметрами... то я уже должен писать static_cast<void (QSpinBox::*)(int)>(...) бегая по всей клавиатуре нажимая символы * < : в то время, как в старом способе после слова SIGNAL(anysignal(int)) достаточно было указать сигнатуру в скобках, почему нельзя было сделать так?

connect(this, &MyClass::mySignal(int), otherClass, &OtherClass::hisSlot(int));
0
Pied Piper
236 / 227 / 57
Регистрация: 15.01.2013
Сообщений: 855
10.06.2016, 08:26 11
kavashige, кто вам такле сказал?... Да хоть там будет 10 аргументов. Если нет перегрузок, то ничего кастить не надо.
1
1943 / 1768 / 825
Регистрация: 23.01.2014
Сообщений: 6,230
10.06.2016, 19:20 12
Цитата Сообщение от kavashige Посмотреть сообщение
нельзя было сделать так?
connect(this, &MyClass::mySignal(int), otherClass, &OtherClass::hisSlot(int));
А зачем, если можно (как указали выше)
C++ (Qt)
1
connect(this, &MyClass::mySignal, otherClass, &OtherClass::hisSlot);
? Это же короче.
0
0 / 0 / 0
Регистрация: 08.08.2015
Сообщений: 91
10.06.2016, 22:07 13
Да я ошибся, действительно работает без указания типа...видимо давно я пытался соединить сигнал с функцией или лямбдой получив по рукам от компилятора стал всегда делать с явным указанием типа.

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

C++ (Qt)
1
2
3
4
5
6
    typedef void (QComboBox::*QComboIntSignal)(int);
 
    connect(filterSyntaxComboBox, static_cast<QComboIntSignal>(&QComboBox::currentIndexChanged),
            this, &TagViewer::filterRegExpChanged);
    connect(filterColumnComboBox, static_cast<QComboIntSignal>(&QComboBox::currentIndexChanged),
            this, &TagViewer::filterColumnChanged);
0
10.06.2016, 22:07
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.06.2016, 22:07
Помогаю со студенческими работами здесь

Странное расположение в памяти аргументов функции с неизвестным количество аргументов
Не могу понять, почему такая программа не работает, выдавая segmentation fault после распечатки...

$model.open несколько возвращаемых аргументов аргументов в resolve
$scope.HrenId = ' '; $scope.editWord = function (origId, nonOrigId) { var...

Выдаёт Database Error: Unable to connect to the database:Could not connect to MySQL
Здравствуйте! У меня сайт находится на основном домене но я сделал DNS и прикрепил ещё один домен....

Есть функция с кучей аргументов, как её вызвать в другой функции (если половины аргументов у меня нет)?
Я конечно, понимаю, что на такие вопросы отвечают &quot;почитай книжку&quot;. Я читала, честное слово:)...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru