我无法理解Q_PROPERTY的用法.Q_PROPERTY如何帮助使程序防御?它是干什么用的?我见过论坛,但真的无法进行论坛.我已经理解了这个例子,但不是它的用法.
这是一个例子,我从中获得了什么.我知道阅读会给予阅读权限.
write属性将赋予仅写入权限.但它有什么需要呢?有人可以举例说明吗?
class MyClass : public QObject
{
Q_OBJECT
Q_PROPERTY(Priority priority READ priority WRITE setPriority NOTIFY priorityChanged)
Q_ENUMS(Priority)
public:
MyClass(QObject *parent = 0);
~MyClass();
enum Priority { High, Low, VeryHigh, VeryLow };
void setPriority(Priority priority)
{
m_priority = priority;
emit priorityChanged(priority);
}
Priority priority() const
{ return m_priority; }
signals:
void priorityChanged(Priority);
private:
Priority m_priority;
};
Run Code Online (Sandbox Code Playgroud) 我对我的班级进行了非常简短(和部分)的描述,以表明我的问题。基本上我设置了两个属性。
class Fruit : public QObject
{
Q_OBJECT
....
public:
Q_PROPERTY( int price READ getPrice NOTIFY priceChanged)
Q_PROPERTY(Fruit * fruit READ fruit WRITE setFruit NOTIFY fruitChanged)
}
Run Code Online (Sandbox Code Playgroud)
在我的 QML 中,如果我访问该price属性,它会运行良好。但是,如果我访问fruit明显返回的属性Fruit,然后尝试使用它的price属性,那是行不通的。这不应该这样工作吗?
Text {
id: myText
anchors.centerIn: parent
text: basket.price // shows correctly
//text: basket.fruit.price // doesn't show
}
Run Code Online (Sandbox Code Playgroud)
第二个返回的Fruit也是一个属性,它有price属性,但它似乎无法访问该属性?这应该有效吗?
更新
我包括我的源代码。我用 创建了一个新的演示HardwareComponent,这样更有意义。我试图根据我收到的答案让它工作,但没有运气。
HardwareComponentComputerclass 是和的基类CPU。
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
class HardwareComponent …Run Code Online (Sandbox Code Playgroud) 在我正在编写的代码中,我需要Q_PROPERTY通过一个集成从私有成员公开QWidget。像这样的东西会很好:
class MyWidget: public QWidget{
Q_OBJECT
Q_PROPERTY(QString headerText MEMBER myLabel.text NOTIFY QLabel::notify)
private:
QLabel myLabel
}
Run Code Online (Sandbox Code Playgroud)
是否可以这样做以及如何这样做?或者我是否必须手动编写所有获取/设置方法?
我正在尝试将2d QList作为Q_PROPERTY传递给QML,但是在QML内部,并且我实际上无法访问任何信息。
一些代码:
c ++:q_property由构造函数中的q_invokable函数填充:
void Class::createNewGameArray(){
QList<QList<QString>> testArray;
for( int i = 0; i < _intervals.size(); ++i) {
QList<QString> innerArray;
testArray.append(innerArray);
testArray[i].append(_intervals[i]);
testArray[i].append("Audio");
}
for( int i = 0; i < _intervals.size(); ++i) {
QList<QString> innerArray;
testArray.append(innerArray);
testArray[i+12].append(_intervals[i]);
testArray[i+12].append("Text");
}
std::random_shuffle(testArray.begin(),testArray.end());
Class::setGameArray(testArray);
emit gameArrayChanged(_newGameArray);
Run Code Online (Sandbox Code Playgroud)
返回以下内容:
(("M7", "Text"), ("M3", "Text"), ("m3", "Text"), ("M6", "Audio"), ("TT", "Audio"), ("P4", "Text"), ("m7", "Audio"), ("m2", "Text"), ("m6", "Audio"), ("m6", "Text"), ("M7", "Audio"), ("P5", "Text"), ("P4", "Audio"), ("m2", "Audio"), ("M2", "Audio"), ("M3", "Audio"), ("P5", "Audio"), …Run Code Online (Sandbox Code Playgroud) 我有一个私有类成员变量status,我想在每次更改时发出一个带有其值的信号。因此,我使用Q_PROPERTY并指定了一个信号NOTIFY:
#ifndef CAMERACONTROL_H
#define CAMERACONTROL_H
#include <QObject>
#include <iostream>
class CameraControl : public QObject
{
Q_OBJECT
Q_PROPERTY(QString status MEMBER status NOTIFY statusChanged)
private:
QString status;
public:
explicit CameraControl(QObject *parent = nullptr);
~CameraControl();
void changeStatus()
{
std::cout << "changeStatus called" << std::endl; // The function definitely gets called!
this->status = "Change status again!";
}
public slots:
void outputStatus(const QString &status) {
std::cout << status.toStdString() << std::endl;
}
signals:
void statusChanged(const QString &status);
};
#endif // …Run Code Online (Sandbox Code Playgroud) 我有一个QQuickItem类,其中一些成员在 QML 中使用,因此它们的声明如下:
Q_PROPERTY (bool myBool MEMBER _myBool NOTIFY myBoolChanged)
Run Code Online (Sandbox Code Playgroud)
如果我想在 C++ 代码中(从另一个类)访问此成员,我是否有免费的get-accessor ?它的语法是什么?
我不清楚该文档:
如果未指定 READ 访问器函数,则需要 MEMBER 变量关联。这使得给定的成员变量可读可写,而无需创建 READ 和 WRITE 访问器函数。
这是否使成员只能在 QML 中或在 C++ 中可读和可写?
考虑这些类:
Class A : public QObject {
...
Q_PROPERTY(int value READ value WRITE setValue NOTIFY valueChanged)
virtual int value() { return m_value; }
void setValue(int v) { m_value = v; Q_EMIT valueChanged();}
...
};
Class B : public A {
...
int value() { return m_value * 2; }
...
};
Run Code Online (Sandbox Code Playgroud)
访问属性值时,直接调用A类方法而不是B类.
到目前为止,为了解决这个明显的限制,我复制了属性代码并连接了每个类的信号.
这是最好的解决方案吗?
有没有人看到潜在的问题(由于属性具有相同的名称)?
qproperty ×8
qt ×8
c++ ×6
qml ×2
qt-signals ×2
overriding ×1
polymorphism ×1
qlist ×1
qobject ×1
qt5.4 ×1
qt5.9 ×1
qtquick2 ×1