В Qt, как мне использовать слоты Q_OBJECT и сигналы с множественным наследованием?

StackOverflow https://stackoverflow.com/questions/1489238

  •  18-09-2019
  •  | 
  •  

Вопрос

Я просмотрел связанные вопросы и не смог найти ничего, что касалось бы именно того, о чем я говорил, поэтому позвольте мне описать.

У меня есть класс, скажем foo, который должен иметь свои собственные слоты и сигналы, но также должен наследоваться от QXmlDefaultHandler (звучит довольно странно, но я столкнулся с этой ситуацией при попытке использовать QHttp для чтения веб-сайта непосредственно в QBuffer).

class foo: public QXmlDefaultHandler, public QObject
{
    public:
        foo();
        ~foo();

       Q_OBJECT
   public slots:
       void bar();
}

Этот код, если он сопровождается cpp для подключения bar к сигналу в другом месте, не будет компилироваться.Вы получите ошибки о том, что некоторые члены QObject не являются членами QXmlDefaultHandler.Кроме того, вы не можете переместить Q_OBJECT, иначе вы получите ошибки vtable из-за того, что не реализовали некоторые вещи (продолжайте!попробуйте!).

пожалуйста, смотрите мой ответ для (очень простого) исправления.Я буду рад проголосовать за вас как за принятый ответ, если я думаю, что вы объясните это лучше, чем я.

Редактировать:для вас, ветеринаров c ++ и Qt, пожалуйста, отправьте ответ, если вы можете объяснить это лучше.я потратил довольно много времени на поиск этой информации, поэтому, пожалуйста, помогите кому-нибудь еще, если вы можете сделать это лучше меня.

Это было полезно?

Решение

В документация для moc указывает, что в случаях множественного наследования класс, предоставляющий QObject, должен появляться первым

Если вы используете множественное наследование, moc предполагает, что первый унаследованный класс является подклассом QObject.Кроме того, убедитесь, что только первый унаследованный класс является QObject.

 // correct
 class SomeClass : public QObject, public OtherClass
 {
     ...
 };

Виртуальное наследование с помощью QObject не поддерживается.

Другие советы

class foo: public QObject, public QXmlDefaultHandler
{
    public:
        foo();
        ~foo();
   Q_OBJECT
   public slots:
       void bar();
}

Как бы просто это ни звучало, если вы не поставите QObject первым в списке наследования, эта задача невыполнима.Это ограничение в системе метаобъектов Qt.Если вы этого не сделаете, компилятор попытается применить некоторые члены QObject как часть QXmlDefaultHandler.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top