Qt 中的强制类型转换:qvariant_cast ,qobject_cast

电玩女神 2023-09-29 17:12 22阅读 0赞

在 C++ 开发中经常要进行数据类型的强制转换。

开始的直接对基本数据类型强制类型转换,如 float fnum = 3.14; int num = (int) fnum;

随着 C++ 标准的发展,又提供了 dynamic_cast、const_cast 、static_cast、reinterpret_cast 等高级安全的强制转换方法。

dynamic_cast: 通常在基类和派生类之间转换时使用,run-time cast。
const_cast: 主要针对 const 和 volatile 的转换。
static_cast: 一般的转换,no run-time check. 通常,如果你不知道该用哪个,就用这个。
reinterpret_cast: 用于进行没有任何关联之间的转换,比如一个字符指针转换为一个整形数。

QT 框架提供的强制类型转换方法:

qobject_cast qobject_cast () 函数的行为类似于标准 C ++ dynamic_cast (),其优点是不需要 RTTI 支持,并且它可以跨动态库边界工作。

  1. QObject *obj = new QTimer; // QTimer inherits QObject
  2. QTimer *timer = qobject_cast<QTimer *>(obj);
  3. // timer == (QObject *)obj
  4. QAbstractButton *button = qobject_cast<QAbstractButton *>(obj);
  5. // button == 0

qgraphicsitem_cast 场景视图 Item 类转换

QGraphicsScene 和 QGraphicsItem 的大多数便利函数(例如:items (),selectedItems ()、collidingItems ()、childItems ())返回一个 QList 列表,在遍历列表的时候,通常需要对其中的 QGraphicsItem 进行类型检测与转换,以确定实际的 item。

  1. QList<QGraphicsItem *> items = scene->items();
  2. foreach (QGraphicsItem *item, items) {
  3. if (item->type() == QGraphicsRectItem::Type) {       // 矩形
  4. QGraphicsRectItem *rect = qgraphicsitem_cast<QGraphicsRectItem*>(item);
  5. // 访问 QGraphicsRectItem 的成员
  6. } else if (item->type() == QGraphicsLineItem::Type) {     // 直线
  7. QGraphicsLineItem *line = qgraphicsitem_cast<QGraphicsLineItem*>(item);
  8. // 访问 QGraphicsLineItem 的成员
  9. } else if (item->type() == QGraphicsProxyWidget::Type) {   // 代理 Widget
  10. QGraphicsProxyWidget *proxyWidget = qgraphicsitem_cast<QGraphicsProxyWidget*>(item);
  11. QLabel *label = qobject_cast<QLabel *>(proxyWidget->widget());
  12. // 访问 QLabel 的成员
  13. } else if (item->type() == CustomItem::Type) {        // 自定义 Item
  14. CustomItem *customItem = qgraphicsitem_cast<CustomItem*>(item);
  15. // 访问 CustomItem 的成员
  16. } else {
  17. // 其他类型 item
  18. }
  19. }

需要注意的是,为了使该函数正确使用自定义 Item,需要在 QGraphicsItem 子类中重写 type () 函数才行。

  1. class CustomItem : public QGraphicsItem
  2. {
  3. public:
  4. enum { Type = UserType + 1 };
  5. int type() const override
  6. {
  7. // Enable the use of qgraphicsitem_cast with this item.
  8. return Type;
  9. }
  10. ...
  11. };

qvariant_cast QVariant 类型转换为实际的类型

Returns the given value converted to the template type T.

This function is equivalent to QVariant::value().

发表评论

表情:
评论列表 (有 0 条评论,22人围观)

还没有评论,来说两句吧...

相关阅读

    相关 强制类型转换

    强制类型转换 有可能会丢失一些数据 double a=9.99999; int ab=(int)a; 如果想对浮点数进行舍入运算,则需使用Math.r

    相关 强制类型转换

    关于强制类型转换的问题,很多书都讨论过,写的最详细的是C++ 之父的《C++ 的设计和演化》。最好的解决方法就是不要使用C风格的强制类型转换,而是使用标准C++的类型转换符:s

    相关 JavaScript 强制类型转换

    JavaScript 作为一个动态编程语言,其中的数据类型会随着程序运行而动态改变。对于很多人来说,强制类型转换很容易造成程序出错,而要记住所有的转换方式又是一件不那么容易的事

    相关 强制类型转换

    在Java中由于继承和向上转型,子类可以非常自然地转换成父类,但是父类转换成子类则需要强制转换。 继承关系为:Son extends Father Father f