QVariant::QVariant(void*) 是私有的

Posted

技术标签:

【中文标题】QVariant::QVariant(void*) 是私有的【英文标题】:QVariant::QVariant(void*) is private 【发布时间】:2015-12-12 13:15:00 【问题描述】:

我正在尝试使用 setProperty(); 将 C++ 对象公开给 QML。这是我的代码原型:

MyClass.h

class MyClass::public QObject

    Q_OBJECT

public:
    explicit MyClass(QObject *parent = 0);
    ~MyClass();

private:
    QScreen *screen;
    QPixmap myPixmap;
;

MyClass.cpp

MyClass::MyClass (QObject *parent) : QObject(parent)

    screen = QGuiApplication::primaryScreen();


MyClass::~MyClass()




void MyClass::captureIt()

    myPixmap = screen->grabWindow(0);
    myPixmap.save("/home/john/Pictures/screen.png");

ma​​in.cpp 中的用法

QQmlApplicationEngine engine;
MyClass mc;

engine.rootContext()->setProperty("myclass", &mc);
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

ma​​in.qml 中的用法

onClicked: mc.captureIt()

当我尝试编译时发生了错误,因为QVariant(问题标题中提到的那个)出现了奇怪的错误。

你有什么办法解决这个问题吗?

更新 这不是 ringo 在下面的 cmets 中发布的内容的副本。问题不在于我无法将我的课程转换为QVariant。我可以。 但问题是 setProperty() 不允许我这样做。我必须把我完全简单的对象放在那里。

【问题讨论】:

Storing pointers using QListWidgetItem::setData的可能重复 @ringø,你能解释一下这与我所问的重复吗? 请把问题读到底部,同样的问题。然后阅读可能对您有帮助的答案... @ringø,我已经更新了我的问题 您应该使用 setContextProperty。就是这样。 【参考方案1】:

你需要使用QVariant::fromValue从一个指针创建一个QVariant:

engine.rootContext()->setProperty("myclass", QVariant::fromValue(&mc));

【讨论】:

以上是关于QVariant::QVariant(void*) 是私有的的主要内容,如果未能解决你的问题,请参考以下文章

Qt - 没有匹配函数调用‘QVariant::QVariant(MyClass&)’

QVariant相当于一个包含大多数Qt数据类型的联合体(源码解读)

(void(*)(void)) &shellcode啥意思?

从 'void* (*)(int*)' 到 'void* (*)(void*)' 的无效转换

错误:从‘void*’到‘void* (*)(void*)’的无效转换 - pthreads

void类型及void指针