Qt множественное наследование и сигналы
у меня проблема с 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 enherit из QObject из-за сигналов. Есть ли способ сделать это?
Edit:
добавление виртуального к каждому объявлению наследования, все еще дает мне ту же ошибку:
class NavigatableItem : public virtual QObject
class Button : public virtual NavigatableItem, public virtual QToolButton
class MainMenuOption : public virtual Button
даже после "очистить все", "запустить qmake" и "построить все".
3 ответов
это требует немного больше кода, но то, что я сделал в прошлом, это сделать один из них (ваш NavigatableItem
в этом случае) чистый виртуальный класс, т. е. интерфейс. Вместо использования макроса "сигналы" сделайте их чисто виртуальными защищенными функциями. Затем умножьте наследование от вашего QObject-производного класса, а также интерфейса и реализуйте методы.
Я знаю, что это несколько спорно, но избежать множественного наследования реализации любой ценой решает множество проблем и путаница. The 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();
...
}
используйте виртуальное наследование, например
class X : public virtual Y
{
};
class Z : public virtual Y
{
};
class A : public virtual X, public virtual Z
{
};
будет иметь только одну копию базового класса Y
вы должны использовать виртуальное наследование.
см.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