[Solved] 'QVariant::QVariant': cannot access private member declared in class 'QVariant'



  • // Base class
    class CommandQueue : public QThread
    {
        Q_OBJECT
    
    public:
        virtual ~CommandQueue();
    
    protected:
        void CommandQueue();
    };
    
    
    
    // Derived classes
    class ReadCommandQueue : public CommandQueue
    {
        Q_OBJECT
    
        Q_PROPERTY(bool isReadingData   READ isReadingData  NOTIFY isReadingDataChanged)
    
    
    public:
        ReadCommandQueue(QObject *parent = 0);
        ~ReadCommandQueue();
    
        bool isReadingData() const;
    
    protected:
        void run() override final;
    
    private:
        bool m_isReadingData;
    };
    
    
    class WriteCommandQueue : public CommandQueue
    {
        Q_OBJECT
    
        Q_PROPERTY(bool isWritingData   READ isWritingData  NOTIFY isWritingDataChanged)
    
    public:
        WriteCommandQueue(QObject *parent = 0);
        ~WriteCommandQueue();
    
        bool isWritingData() const;
    
    Q_SIGNALS:
        /**
         * signal used just to notify the CommandQueueCenter
         * to pull the new info written
         */
        void finishedWritingCommands();
        void isWritingDataChanged();
    
    protected:
        void run() override final;
    
    private:
        bool m_isWritingData;
    };
    
    
    
    // CommandQueueCenter has these functions
    ReadCommandQueue* CommandQueueCenter::readCommandQueue() const
    {
        return d->readCommandQueue;
    }
    
    WriteCommandQueue* CommandQueueCenter::writeCommandQueue() const
    {
        return d->writeCommandQueue;
    }
    

    I need these objects in my QML application so i expose them like i've always done as follows:

        m_centralWidget->engine()->rootContext()->setContextProperty("ApplicationData", m_core.applicationData());
        m_centralWidget->engine()->rootContext()->setContextProperty("CmdQueueCenter", m_core.commandQueueCenter());
        m_centralWidget->engine()->rootContext()->setContextProperty("MainWindow", this);
        m_centralWidget->engine()->rootContext()->setContextProperty("ReadCommandQueue", m_core.commandQueueCenter()->readCommandQueue());
    
    // This last line creates my error
        m_centralWidget->engine()->rootContext()->setContextProperty("WriteCommandQueue", m_core.commandQueueCenter()->writeCommandQueue());
    

    All was fine with the "ReadCommandQueue" but when I added the "WriteCommandQueue" i got the following error:

    'QVariant::QVariant': cannot access private member declared in class 'QVariant'
    

    Any idea why this is happening? The classes are basically identical.



  • Can you show the constructor of CommandQueue and WriteCommandQueue

    P.S.
    Unrelated to the problem at hand but still strange:
    void CommandQueue(); and WriteCommandQueue(QObject *parent = 0); looks like something fishy is going on with your parent-child management but I can't be sure as you did not include the implementation



  • @VRonin said in 'QVariant::QVariant': cannot access private member declared in class 'QVariant':

    Can you show the constructor of CommandQueue and WriteCommandQueue

    CommandQueue::CommandQueue(QObject *parent)
        : QThread(parent)
        , m_connectionStatus(ConnectorStatus::Disconnected)
    {
    }
    
    
    WriteCommandQueue::WriteCommandQueue(QObject *parent)
        : CommandQueue(parent)
        , m_isWritingData(false)
    {
    }
    
    
    ReadCommandQueue::ReadCommandQueue(QObject *parent)
        : CommandQueue(parent)
        , m_isReadingData(false)
    {
    }
    

    I added the ReadCommandQueue as well as it didn't cost me anything to do a copy/paste

    P.S.
    Unrelated to the problem at hand but still strange:
    void CommandQueue(); and WriteCommandQueue(QObject *parent = 0); looks like something fishy is going on with your parent-child management but I can't be sure as you did not include the implementation

    Yeah, whilst removing implementation deatials i erroneously deleted the QObject *parent = nullptr . Sorry about that



  • Try cleaning the project and re-running qmake, looks like the Q_OBJECT wasn't spotted by moc.



  • Already did that. Same problem. That's why I can't figure out this error. All the right pieces are in place. (Well, apparently not..)



  • The problem is that setContextProperty is calling the QVariant overload instead of the QObject one and QVariant(void*) is private. QVariant::fromValue(m_core.commandQueueCenter()->writeCommandQueue()) should solve the copilation but unsure if it's ok



  • Yeah, it should be calling the QObject* overload. For now the issue has been fixed with a cast

    m_centralWidget->engine()->rootContext()->setContextProperty("WriteCommandQueue", (QObject*)m_core.commandQueueCenter()->writeCommandQueue());
    

    but does anyone know why the wrong overload is being called?



  • Does main() (or wherever you call setContextProperty from) know WriteCommandQueue is a QObject? i.e. did you include writesommandqueue.h or is it just forward declared like class WriteCommandQueue;?



  • @VRonin said in 'QVariant::QVariant': cannot access private member declared in class 'QVariant':

    Does main() (or wherever you call setContextProperty from) know WriteCommandQueue is a QObject? i.e. did you include writesommandqueue.h or is it just forward declared like class WriteCommandQueue;?

    alt text

    I forgot the inclusion.. Was convinced I had already done it. Thanks


Log in to reply
 

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