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



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

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

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

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



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

    [quote author="Sion88" date="1397902373"]

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

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

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



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


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.