Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

Указатель на parent или сигнал?



  • Здравствуйте :) Не принимайте краткость за грубость.

    Допустим, есть самодельный контрол, наследующий QWidget. И этот виджет должен уметь вызывать функцию своего предка (главного окна, например). Я пока знаю три способа это сделать:

    1. С помощью сигнала: определить в виджете сигнал, а предок подключает слот к этому сигналу.
    2. Передать виджету указатель на предка и сохранить его. Придется импортировать в виджет заголовочный файл предка, чтоб были доступны его функции.
    3. Хранить в виджете указатель на коллбэк-функцию. Еще не пробовал.

    Наверное, всё это будет работать. Но интересно знать, какой способ предпочтительнее. С точки зрения пряморукости, олдускульности, стабильности, производительности итп. Спасибо :)



  • [quote author="Sion88" date="1397902373"] 1. С помощью сигнала: определить в виджете сигнал, а предок подключает слот к этому сигналу. [/quote] Это наиболее универсальный способ, потому что слушать сигнал могут и другие виджеты

    [quote author="Sion88" date="1397902373"]
    2. Передать виджету указатель на предка и сохранить его. Придется импортировать в виджет заголовочный файл предка, чтоб были доступны его функции. [/quote] Если вы придерживаетесь иерархии объектов Qt то вы всё равно передаёте указатель на предка, а заголовочный файл необходим для иерархии классов. Получается что для этого способа у вас уже всё есть даже сигнал придумывать не надо :-)

    [quote author="Sion88" date="1397902373"] 3. Хранить в виджете указатель на коллбэк-функцию. Еще не пробовал. [/quote] Мне кажеться это будет приблизительное повторение имплементации сигнал/слот.

    [quote author="Sion88" date="1397902373"] Наверное, всё это будет работать. Но интересно знать, какой способ предпочтительнее. С точки зрения пряморукости, олдускульности, стабильности, производительности итп. Спасибо :) [/quote] Как это обычно бывает, нет однозначного решения, так как мы не знаем всех деталей проекта.
    Может быть что сигнал/слот не достаточно эфективны и функция которая должна реагировать не может быть включена в публичный заголовочный файл, тогда третий способ это единственный вариант. Но исходя из того что вы написали я бы использовал сигнал/слот, как наиболее универсальный способ.



  • Спасибо. Значит, буду выбирать по ситуации. Мне просто было важно знать, не является ли что-то из этого совсем кривым/неприемлемым подходом. И, похоже, мне нужно про эту иерархию подробнее почитать...


Log in to reply