LINUX.ORG.RU

[Qt] проблеммы при наследовании классов Qt и своих классов.

 


0

0

Имеется такой вот код. Не могу унаследовать вперемешку с QDialog и Ui::test свой класс Abstract. Без него всё компилируется, а с ним ошибка.

moc_video_lavc.cpp:39: error: ‘staticMetaObject’ is not a member of ‘AbstractVideoPlugin’ moc_video_lavc.cpp: In member function ‘virtual void* PluginLavcVideo::qt_metacast(const char*)’: moc_video_lavc.cpp:57: error: ‘qt_metacast’ is not a member of ‘AbstractVideoPlugin’ moc_video_lavc.cpp: In member function ‘virtual int PluginLavcVideo::qt_metacall(QMetaObject::Call, int, void**)’: moc_video_lavc.cpp:62: error: ‘qt_metacall’ is not a member of ‘AbstractVideoPlugin’

test.h

#include <QDialog>
#include "ui_test.h"

class Abstract{};


class Test: public Abstract, public QDialog, public Ui::test
{
Q_OBJECT
public:
Test(QWidget *parent = 0);
};

test.cpp


#include <QtGui>
#include "test.h"

Test::Test(QWidget *parent)
:QDialog(parent)
{
setupUi(this);
}

Чтобы moc все правильно понял, нужно первым предком ставить один из QObject-ов, т.е. QDialog, в вашем случае.

Т.е.

class test:public QDialog,public Abstract,public Ui::test{};

Алсо, наследоваться от Ui::не нужно.

class some:public QSome{
protected:
Ui::someui someui;
public:
some::some(){
this->someui.setupUi(this);
}};

staseg ★★★★★
()
Ответ на: комментарий от staseg

Конструктор криво написал, но наверное понятно:).

staseg ★★★★★
()
Ответ на: комментарий от staseg

>Чтобы moc все правильно понял, нужно первым предком ставить один из QObject-ов, т.е. QDialog, в вашем случае.



Благодарю вас! Извиняюсь за глупость, просто никак не ожидал такой подставы от moc.

ShTH
() автор топика
Ответ на: комментарий от ShTH

К сожалению moc это все же своего рода костыль, поэтому существуют такие вот неожиданные условности.

m0rph ★★★★★
()
Ответ на: комментарий от staseg

>Алсо, наследоваться от Ui::не нужно.


А почему? В оффициальной книге троллей именно так было.

ShTH
() автор топика
Ответ на: комментарий от ShTH

>>Алсо, наследоваться от Ui::не нужно.

А почему? В оффициальной книге троллей именно так было.

это странно, что так было. Просто создай объект Ui::*** и управляй им. Это тебе обеспечит инкапсуляцию (\m/)

name_no ★★
()
Ответ на: комментарий от name_no

>это странно, что так было. Просто создай объект Ui::*** и управляй им. Это тебе обеспечит инкапсуляцию (\m/)


А я думал, что своя специфика. А так да, элегантнее через объект.

ShTH
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.