xintrea / mytetra_dev

MyTetra - smart crossplatform manager for information collecting / MyTetra - кроссплатформенный менеджер накопления информации / Официальная страница:
http://webhamster.ru/site/page/index/articles/projectcode/105
254 stars 55 forks source link

Исправлены некоторые варнинги #82

Closed dmhud closed 6 years ago

dmhud commented 6 years ago

Исправлены некоторые варнинги:

Использован новый синтаксис коннектов сигналов и слотов в Qt 5

xintrea commented 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);

?

dmhud commented 6 years ago

В первом случае компилятор сам разберется адрес какого метода взять. А во втором случае существует несколько перегрузок с одним и тем же именем:

    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 - адрес самого метода

dmhud commented 6 years ago

Плюсы такого синтаксиса сигналов-слотов из Qt5 в том, что если мы не правильно указали имена сигналов/слотов или неправильные типы аргументов, то ошибку мы получим во время сборки на этапе компиляции

А если использовать старый синтаксис, то все записи в макросах SIGNAL() и SLOT() будут преобразованы в строки, и если что-то будет не так, то ошибку мы сможем увидеть только в рантайме, Qt пишет об этом в консоль

xintrea commented 6 years ago

Поэтому во втором случае приводится к конкретному указателю на метод класса

static_cast<void(EditorFontSizeComboBox::*)(int)>(&EditorFontSizeComboBox::currentIndexChanged)

где

  1. static_cast<> - явное приведение к нужному типу на этапе компиляции
  2. void(EditorFontSizeComboBox::*)(int) - это указатель на метод класса EditorFontSizeComboBox, с одним аргументом типа int, и возвращаемым типом void
  3. &EditorFontSizeComboBox::currentIndexChanged - адрес самого метода

Я, принял изменения. Но не проще было бы использовать qOverload:

http://doc.qt.io/qt-5/qtglobal.html#qOverload

Все же код попроще бы получился, а результат тот же.

dmhud commented 6 years ago

Да, так будет проще. Не приходилось еще работать с версией Qt выше 5.5, поэтому еще не был знаком с нововведениями, а qOverload появился с версии Qt 5.7 Спасибо, обратная связь полезна :)

Попробую сейчас переделать https://github.com/xintrea/mytetra_dev/pull/87