- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在将一个项目从 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 constructor taking Qt::GlobalColor and producing QVariant(QColor) instance was removed. Code constructing such variants can be migrated by explicitly calling QColor constructor. For example from “QVariant(Qt::red)” to “QVariant(QColor(Qt::red))*Similarly, implicit creation of QVariants from enum values Qt::BrushStyle, Qt::PenStyle, and Qt::CursorShape have been removed. Create objects explicitly or use static_cast(Qt::SolidLine) to create a QVariant of type int with the same value as the enum.
问题是,如果我不能那样做 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()));
^
最佳答案
问题是枚举有点棘手,Qt 5 似乎已经为这些有问题的枚举移除了一些特定的魔法。 QVariant 的基本模板构造函数被定义为私有(private)的,以强制 QVariants 只能使用它们真正可以处理的类型来构造。
文档中提出的第一个解决方案是实例化一个对象,因为在 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);}
那么请继续发布一个独立的示例,以便我们进一步讨论。
关于c++ - Qt5中如何声明Qt::PenStyle?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23266187/
我正在将一个项目从 Qt 4.x 迁移到 5,并且有一个类包含一个属性: Qt::PenStyle penStyle; 及其各自的get函数: Qt::PenStyle getPenStyle() {
我是一名优秀的程序员,十分优秀!