Qt множественное наследование и сигналы - PullRequest
6 голосов
/ 23 марта 2011

У меня проблема с QT из-за множественного наследования из-за QObject. Я знаю, что у многих других есть такие же проблемы, но я не знаю, как мне это исправить.

class NavigatableItem : public QObject
{
    Q_OBJECT

    signals:
        void deselected();
        void selected();
        void activated();
};

class Button : public NavigatableItem, public QToolButton
{
    Q_OBJECT

    ...
}

class MainMenuOption : public Button
{
    Q_OBJECT

    ...
}

Когда я делаю это

MainMenuOption* messages = new MainMenuOption();
connect(messages, SIGNAL(selected()), SLOT(onMenuOptionSelected()))

Я получу ошибку:

QObject 'является неоднозначной основой' MainMenuOption '

Причина, по которой я позволил NavigatableItem наследоваться от QObject из-за сигналов. Есть ли способ сделать это?

Edit:

Добавление виртуального к каждому объявлению наследования, все еще дает мне ту же ошибку:

class NavigatableItem : public virtual QObject

class Button : public virtual NavigatableItem, public virtual QToolButton

class MainMenuOption : public virtual Button

Даже после «очистить все», «запустить qmake» и «собрать все».

Ответы [ 3 ]

8 голосов
/ 23 марта 2011

Требуется немного больше кода, но в прошлом я сделал один из них (в нашем случае NavigatableItem) чисто виртуальным классом, то есть интерфейсом.Вместо того чтобы использовать макрос «сигналы», сделайте их чисто виртуальными защищенными функциями.Затем умножить-наследоваться от QObject производный класс, а также интерфейс, и реализовать методы.

1003 * Я знаю, что это несколько спорно, но избегая множественное наследование реализации любой ценой действительно решает множество проблем и путаницы, Рекомендации по стилю Google C ++ рекомендуют это, и я думаю, что это хороший совет.
class NavigatableItemInterface
{
    // Don't forget the virtual destructor!
    protected:
        virtual void deselected() = 0;
        virtual void selected() = 0;
        virtual void activated() = 0;
};

class Button : public NavigatableItemInterface, public QToolButton
{
    Q_OBJECT
    ...
    signals:
        virtual void deselected();
        ...
}
1 голос
/ 23 марта 2011

Использовать виртуальное наследование, например,

class X : public virtual Y 
{
};

class Z : public virtual Y
{
};

class A : public virtual X, public virtual Z
{
};

будет иметь только одну копию базового класса Y

0 голосов
/ 23 марта 2011

Вы должны использовать виртуальное наследование.

см. http://en.allexperts.com/q/C-1040/virtual-inheritance.htm

Похоже, у вас проблема с бриллиантами, см. Также:

http://www.cprogramming.com/tutorial/virtual_inheritance.html

Сделай так:

class NavigatableItem : public virtual QObject
class Button : public virtual NavigatableItem, public virtual QToolButton
class MainMenuOption : public Button
...