Closed dmhud closed 6 years ago
А можно узнать, почему вы в одном случае заменяете так:
connect(indentSlider,SIGNAL(change_textindent_pos(int)),
this,SLOT(onChangeTextindentPos(int)));
на
connect(indentSlider, &IndentSlider::change_textindent_pos,
this, &EditorIndentSliderAssistant::onChangeTextindentPos);
А в другом таком же случае заменяете на такое, что я даже прочитать не могу:
connect( this, SIGNAL(currentIndexChanged(int)),
this, SLOT(onCurrentIndexChanged(int)));
на
connect(this, static_cast<void(EditorFontSizeComboBox::*)(int)>(&EditorFontSizeComboBox::currentIndexChanged),
this, &EditorFontSizeComboBox::onCurrentIndexChanged);
?
В первом случае компилятор сам разберется адрес какого метода взять. А во втором случае существует несколько перегрузок с одним и тем же именем:
void currentIndexChanged(int index);
void currentIndexChanged(const QString &);
И если не указать какой конкретный метод мне нужен из них, то будет ошибка компиляции. Поэтому во втором случае приводится к конкретному указателю на метод класса
static_cast<void(EditorFontSizeComboBox::*)(int)>(&EditorFontSizeComboBox::currentIndexChanged)
где 1) static_cast<> - явное приведение к нужному типу на этапе компиляции 2) void(EditorFontSizeComboBox::*)(int) - это указатель на метод класса EditorFontSizeComboBox, с одним аргументом типа int, и возвращаемым типом void 3) &EditorFontSizeComboBox::currentIndexChanged - адрес самого метода
Плюсы такого синтаксиса сигналов-слотов из Qt5 в том, что если мы не правильно указали имена сигналов/слотов или неправильные типы аргументов, то ошибку мы получим во время сборки на этапе компиляции
А если использовать старый синтаксис, то все записи в макросах SIGNAL() и SLOT() будут преобразованы в строки, и если что-то будет не так, то ошибку мы сможем увидеть только в рантайме, Qt пишет об этом в консоль
Поэтому во втором случае приводится к конкретному указателю на метод класса
static_cast<void(EditorFontSizeComboBox::*)(int)>(&EditorFontSizeComboBox::currentIndexChanged)
где
- static_cast<> - явное приведение к нужному типу на этапе компиляции
- void(EditorFontSizeComboBox::*)(int) - это указатель на метод класса EditorFontSizeComboBox, с одним аргументом типа int, и возвращаемым типом void
- &EditorFontSizeComboBox::currentIndexChanged - адрес самого метода
Я, принял изменения. Но не проще было бы использовать qOverload:
http://doc.qt.io/qt-5/qtglobal.html#qOverload
Все же код попроще бы получился, а результат тот же.
Да, так будет проще. Не приходилось еще работать с версией Qt выше 5.5, поэтому еще не был знаком с нововведениями, а qOverload появился с версии Qt 5.7 Спасибо, обратная связь полезна :)
Попробую сейчас переделать https://github.com/xintrea/mytetra_dev/pull/87
Исправлены некоторые варнинги:
Использован новый синтаксис коннектов сигналов и слотов в Qt 5