【问题标题】:How to declare Qt::PenStyle in Qt5?如何在 Qt5 中声明 Qt::PenStyle?
【发布时间】:2014-04-24 10:23:10
【问题描述】:

我正在将一个项目从 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:
*不一致的构造函数采用 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()));
                                                                                        ^

【问题讨论】:

    标签: c++ qt enums qvariant


    【解决方案1】:

    问题在于枚举是一种有点棘手的类型,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);}
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-27
      • 1970-01-01
      相关资源
      最近更新 更多