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");
main.cpp 中的用法
QQmlApplicationEngine engine;
MyClass mc;
engine.rootContext()->setProperty("myclass", &mc);
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
main.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*)' 的无效转换