【发布时间】:2018-05-27 23:06:56
【问题描述】:
Qt 在运行时抛出以下错误。
Unable to assign LIMITS_T to LIMITS_T
我假设 Qt 需要更多元数据信息,但我不知道我错过了什么。我已经做了一切来声明元类型:
limits.h
class LIMITS_T : public QObject{
Q_OBJECT
Q_PROPERTY(float min READ readMin WRITE writeMin NOTIFY minChanged)
public:
LIMITS_T() : QObject() {}
LIMITS_T(const LIMITS_T& limit) : QObject()
{
this->min = limit.min;
}
float min = 0;
float readMin() { return min; }
void writeMin(float min) { this->min = min; }
bool operator = (const LIMITS_T &limit)
{
this->min = limit.min;
}
signals:
void minChanged();
};
Q_DECLARE_METATYPE(LIMITS_T)
这是 splitBarGauge 类的简化版本
splitDialGauge.h
class SplitDialGauge : public QQuickPaintedItem
{
Q_OBJECT
Q_PROPERTY(LIMITS_T limits READ getLimits WRITE setLimits NOTIFY limitsChanged)
public:
SplitDialGauge(QQuickItem *parent = 0);
protected:
LIMITS_T limits;
virtual LIMITS_T getLimits();
virtual void setLimits(LIMITS_T value);
}
splitDialGauge.cpp
#include "splitBarGauge.h"
SplitDialGauge::SplitDialGauge(QQuickItem *parent = 0);
: QQuickPaintedItem(parent)
{
}
LIMITS_T SplitDialGauge::getLimits()
{
return this->limits;
}
void SplitDialGauge::setLimits(LIMITS_T limits)
{
this->limits = limits;
update();
}
我在 Qt 元数据系统中注册了该类
#include "limits.h"
#include "splitDialGauge.h"
int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QGuiApplication app(argc, argv);
qmlRegisterType<SplitDialGauge>("ExampleModule", 1, 0, "SplitDialGauge");
qmlRegisterType<LIMITS_T>("ExampleModule", 1, 0, "Limits");
qRegisterMetaType<LIMITS_T>();
QQmlApplicationEngine engine;
engine.load(QUrl(QLatin1String("qrc:/main.qml")));
if (engine.rootObjects().isEmpty())
return -1;
return app.exec();
}
这是来自 QML 文件的片段
import ExampleModule 1.0
ApplicationWindow {
visible: true
width: 800
height: 480
SplitDialGauge {
Limits {
id: qtyLimits
min: 4
}
height: 200
width: 50
limits: qtyLimits
}
}
【问题讨论】:
-
这是 Qt,不是 QT。 QT 代表快速时间。
-
@InnokentiyAlaytsev 对不起。修复了
-
我已经尝试了 LIMITS_T,但它并没有抛出那个错误,我不能将它与 SplitBarGauge 一起使用,因为它似乎不是 Qt 的一部分。
-
@InnokentiyAlaytsev 现在你是 qute。
-
我看到你在覆盖操作符=,这必须返回同一个类的对象:
LIMITS_T operator = (const LIMITS_T &limit) { this->min = limit.min; this->caution = limit.caution; this->max = limit.max; return *this; }