gpt4 book ai didi

c++ - Qt5中如何声明Qt::PenStyle?

转载 作者:搜寻专家 更新时间:2023-10-31 01:04:52 25 4
gpt4 key购买 nike

我正在将一个项目从 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com