C++ QT 将 QList 中的项目转换为子类

标签 c++ qt qt4 downcast qlist

我有一个类型为 PrintableObject* 的 QList,例如:

QList<PrintableObject*> drawables;

此列表包含 PrintableX 类型的对象,它们是 PrintableObject 的子类,插入方式如下:

drawables += &PrintableLine( x, y, x2, y2 );

在此之后,我使用列表进行循环,在其中确定实际类型,进行强制转换并尝试使用它:

foreach(PrintableObject* drawable, drawables){

       if(drawable->myClassName == "PrintableLine") {

           PrintableLine* line = (PrintableLine*) drawable;
           painter.drawLine(line->x, line->y, line->x2, line->y2);

       } else if (drawable->myClassName == "PrintableString") {

           PrintableString* string = (PrintableString*) drawable;
           font.setPointSize(string->fontSize);
           painter.setFont(font);

           painter.drawText(string->x, string->y, string->width, string->height, Qt::AlignHCenter | Qt::AlignTop, string->string "if I say?");

       }

   }

除了,当我尝试使用我新的 Shiny 向下倾斜的对象时,它会出现段错误...

有什么建议吗?

最佳答案

看起来你在列表中插入了一个指向死的临时对象的指针:

drawables += &PrintableLine( x, y, x2, y2 );

尝试:

drawables += new PrintableLine( x, y, x2, y2 );

您可能还需要考虑将虚拟 draw 方法添加到您的 PrintableObject 类中以避免 RTTI 和向下转换的需要。

关于C++ QT 将 QList 中的项目转换为子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44650310/

相关文章:

c++ - 如何在 OS X 上初始化 QOpenGLContext 以使用 OpenGL 3.3 版?

使用样式表时的 QTabWidget tabPosition

windows - Qt4 widget 在 windows 上的放置

mysql - QT5.2为什么没有加载QMYSQL驱动?

c++ - 如何将一个qt3库完全移植到qt4?

c++ - 删除 QListView 中的选定项目列表

c++ - Qt删除指针方法

c++ - 我的 vector 相交函数有什么问题?

c++ - boost multi_index_container 和内存碎片

c++ - 我应该在类构造函数内部还是外部初始化 shared_ptr ?