Qt inheritance problem



  • Hello everybody,

    I have a QWidget child class, and I wrote another class which include QObject, as below,

    Page Class :

    #include <QObject>
    
    class Page
    {  
    public:
        Page();
        ~Page();
    private:
        QString PageTitle;
    signals:
    
    public slots:
    };
    

    Child page inherit the Page

    #include <QWidget>
    #include <QTabWidget>
    
    #include "page.h"
    
    class ImageManagerPage : public QWidget, public Page
    {
        Q_OBJECT
    public:
        explicit ImageManagerPage(QWidget *parent = 0);
        ~ImageManagerPage();
    private:
    
    signals:
    
    public slots:
    };
    

    And the problem is that,

    1. I'm not sure is this the right way to inherit a class??
    2. I can't use the QString PageTitle which declare in the Page as private value. like below :
    ImageManagerPage::ImageManagerPage(QWidget *parent) : QWidget(parent),Page()
    {
        this->PageTitle = "Image Manager";
    }
    

    The ERROR msg is :
    page.h:14: error: 'QString Page::PageTitle' is private
    QString PageTitle;

    Anyone familiar with Qt inheritance ?? I 'm not share the different between C++ which I used in VS.
    THANKS~!!



  • Hi @Phong

    In oriented object programming , you need to know about encapsulation

    
    private - Only the current class will have access to the field or method.
    
    protected - Only the current class and subclasses (and sometimes also same-package classes) of this class will have access to the field or method.
    
    public - Any class can refer to the field or call the method.
    
    This assumes these keywords are used as part of a field or method declaration within a class definition.
    

    You PageTitle member variable should be at least protected.

    One last thing:

    I noticed that you have signal, and slot section on your page class:

    signals:

    public slots:

    You need to know that :

    All classes that contain signals or slots must mention Q_OBJECT at the top of their declaration. They must also derive (directly or indirectly) from QObject.
    

    Refer to the doc from this link:

    http://doc.qt.io/qt-4.8/signalsandslots.html

    Hope this can help!



  • @mostefa said in Qt inheritance problem:

    They mu

    Hi @mostefa ,
    I got the point, thanks!!
    But there is another problem that's,
    I tried it before to inherit QObject to Page class,
    and inherit both QWidget and Page will reach to a QObject Ambiguous issue.
    Anything I did it wrong??



  • @Phong said in Qt inheritance problem:

    @mostefa said in Qt inheritance problem:

    They mu

    Hi @mostefa ,
    I got the point, thanks!!
    But there is another problem that's,
    I tried it before to inherit QObject to Page class,
    and inherit both QWidget and Page will reach to a QObject Ambiguous issue.
    Anything I did it wrong??

    i do not think you have to use signal and slot at page class , so you do not need to inherit from QObject at all,this will avoid conflict, cause If

    you will inherit from QObject on your page class
    than inherit from QWidget, page on your ImageManagerPage

    This will lead to a kind of conflict:

    ImageManagerPage:

    1)Inherit from QWidget ,and QWidget inherit from QObject
    2)Inherit from Page , and page inherit from QObject

    So there is something not clear here , please refere to the doc from this link:

    http://doc.qt.io/qt-4.8/moc.html#multiple-inheritance-requires-qobject-to-be-first

    If you are using multiple inheritance, moc assumes that the first inherited class is a subclass of QObject. Also, be sure that only the first inherited class is a QObject.

    I think that you not have at all to inherit from Page class on your ImageManagerPage class at all,

    For me:

    You need just to add a setter on your Page class

    class Page
    {  
    public:
     .
     .
     .
        void setPageTitle(&argPageTitle);//Here this my title
    
    .
    .
    .
    
    private:
        QString PageTitle;
    };
    

    And just include Page class on your ImageManagerPage :

    class ImageManagerPage : public QWidget
    {
        Q_OBJECT
    public:
        explicit ImageManagerPage(QWidget *parent = 0);
        ~ImageManagerPage();
    private:
         Page mPage;
    signals:
    
    public slots:
    };
    

    And then you have just to do:

    QString title= "Image Manager";
    

    .

    mPage.setPageTitle(&title);
    

    and that's it

    Hope this can help !


  • Lifetime Qt Champion

    Hi,

    To add to @mostefa, why not make your page a QWidget based class directly and then re-use it to build your other widgets ?



  • @SGaist said in Qt inheritance problem:

    Hi,

    To add to @mostefa, why not make your page a QWidget based class directly and then re-use it to build your other widgets ?

    I am totally OK with you @SGaist , And i think that your proposition is the best thing to do.



  • @SGaist
    That might be the best way , thanks a lot!!
    BTW, how to mark the topic as SOLVED?



  • @Phong said in Qt inheritance problem:

    @SGaist
    That might be the best way , thanks a lot!!
    BTW, how to mark the topic as SOLVED?

    On the bottom of your post,

    Topic tools,==> mark as solved

    alt text


Log in to reply
 

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