2

我正在将一个项目从 Qt 4.x 迁移到 5,并且有一个包含以下属性的类:

Qt::PenStyle penStyle;

及其各自的get函数:

Qt::PenStyle getPenStyle() {return penStyle;}

我得到一个编译错误说

error: 'QVariant::QVariant(Qt::PenStyle)' is private
     QVariant(Qt::PenStyle) Q_DECL_EQ_DELETE;
     ^
..\marssies\painterbar.cpp:217:88: error: within this context
         lineStyle -> setCurrentIndex(lineStyle -> findData(graphicObject->getPenStyle()));
                                                                                        ^

做了一些研究,我发现了这一点:

QVariant:
*Inconsistent 构造函数采用 Qt::GlobalColor 并产生 QVariant(QColor) 实例已被删除。可以通过显式调用 QColor 构造函数来迁移构建此类变体的代码。例如从“QVariant(Qt::red)”到“QVariant(QColor(Qt::red))

*类似地,从枚举值 Qt::BrushStyle、Qt::PenStyle 和 Qt::CursorShape 隐式创建 QVariants 已被删除。显式创建对象或使用 static_cast(Qt::SolidLine) 创建与枚举具有相同值的 int 类型的 QVariant。

问题是,如果我不能像那样做 Qt::PenStyle,我应该如何声明属性/函数?显式创建对象是什么意思?我已经尝试过像引用所说的那样做一些事情,但我没有设法解决它。我确实设法解决了其他类似的错误,但它们都不是属性或函数的声明。

完整错误:

In file included from ..\..\..\..\..\Qt5\5.2.1\mingw48_32\include\QtCore/qsettings.h:46:0,
                 from ..\..\..\..\..\Qt5\5.2.1\mingw48_32\include\QtCore/QSettings:1,
                 from ..\marssies\appcommon.h:10,
                 from ..\marssies\painterbar.h:5,
                 from ..\marssies\painterbar.cpp:1:
..\..\..\..\..\Qt5\5.2.1\mingw48_32\include/QtCore/qvariant.h: In member function 'void PainterBar::setGraphicObject(GraphicsPrimitive*, PainterBar::FinishMode)':
..\..\..\..\..\Qt5\5.2.1\mingw48_32\include/QtCore/qvariant.h:482:5: error: 'QVariant::QVariant(Qt::PenStyle)' is private
     QVariant(Qt::PenStyle) Q_DECL_EQ_DELETE;
     ^
..\marssies\painterbar.cpp:217:88: error: within this context
         lineStyle -> setCurrentIndex(lineStyle -> findData(graphicObject->getPenStyle()));
                                                                                        ^
4

1 回答 1

4

问题是枚举有点棘手,Qt 5 似乎已经为这些有问题的枚举消除了一些特定的魔力。QVariant 的基本模板构造函数被定义为私有的,以强制 QVariant 只能使用它们真正可以处理的类型来构造。

文档中提出的第一个解决方案是实例化一个对象,因为在 QVariant 中保存“普通”类型比在枚举中更容易。QColor、QPen 等都是 QObject,因此将它们保存在 QVariant 中的一般逻辑适用于它们;它不适用于 Qt::PenStyle。

第二种解决方案是人们在处理枚举时使用的典型 C 风格的解决方案。由于枚举存储为 int,因此您始终可以显式转换为 int(C 有时也会隐式执行此操作,而 C++ 则不会,afaik)。所以有效存储在 QVariant 中的是一个 int,而程序员是唯一知道它实际上是 Qt::PenStyle 的人。

虽然第一个解决方案效率略低(考虑存储数千个 QPen 对象而不是 QPenStyles/ints),但它可能更简洁,因为保留了语义(QVariant 持有可以用来绘制的笔)。

如果这对您不起作用:

int getPenStyle() {return (int)penStyle;}

或者

QPen getPenStyle() {return QPen(penStyle);}

那么请继续发布一个独立的示例,以便我们进一步讨论。

于 2014-04-24T11:51:48.417 回答