QList和QVector的一些基本用法

本文详细介绍了Qt中QList与QVector的基本用法,包括数据结构体与类的定义,QList的创建、添加、修改、删除操作,以及如何使用迭代器和排序函数。特别关注了指针类型在QList中的处理方式,如内存管理、遍历和排序技巧。

 

QList和QVector基本用法一样

QList<T> list 和QList<T*>list

T可以是数据类型或者指针(类指针)

定义一个数据结构体

typedef struct student

{

    int id;

    QString name;

    QString sex;

    int age;

    QString des;

 

}student;

 

或者定义一个类

class Facility : public QObject

{

    Q_OBJECT

public:

    explicit Facility(QObject *parent = nullptr);

    QString name;

signals:

public slots:

}

 

1、创建QList

(1)T为非指针的数据结构

QList<student> SList;
    //非指针
    for (int i=0;i<10;i++) {
       student s1;
       s1.id=i;
       s1.name = "哇哈哈"+tr("%1").arg(i);
       s1.age=10+i;
       SList.append(s1);

 }

(2) T为指针类型

QList<Facility *> flist;
  Facility *P = new Facility();
  P->name = "哈哈哈";
  flist.push_back(P);
  Facility *P1 = new Facility();
  P1->name = "大神把";
flist.push_back(P1);

2、添加、插入

void append(const T&value)     在QList尾部插入value

 void append(const TQList<T>&value)       在QList尾部插入QList<T>&value

void insert ( int i, const T & value )      在QList其中某个位置插入value,假如没 声明i ,i 默认size()及在最后插入value

 iterator insert ( iterator before, const T & value )    在迭代器的前个位置插入value并返回当前迭代器的位置

3、修改值

QList.at(i) 不能修改值

(1)、可以用下标修改值,然后replace

for (int i=0;i<SList.size();i++) {
        if (SList[i].id%2) {
            SList[i].id=SList[i].id*-1;
            SList.replace(i,SList[i]);
        }

    }

(2)、用迭代器修改值

QList<student *>::iterator i;
   for (i = SList.begin();i!=SList.end();) {
       if ((*i)->id%2) {
           (*i)->id=(*i)->id*(-1);
       }
       ++i;
   }

4、删除item (一般使用迭代器)

注意内存泄露

不要在foreach里面进行元素的remove/add操作,remove请使用Iterator方式

(1)T非指针,直接removeOne或erase 全部删除用clear

(2)指针类型的,必须先delete *i 然后removeOne或erase

全部删除QList先删除指针内存再删除item 可以使用qDeleteAll(flist);flist.clear();
使用迭代器删除item时注意下标
QList<Facility *>::iterator i=flist.begin();
    for (;i!=flist.end();++i) {
      if ((*i)->name.contains("大")) {
         (*i)->name = (*i)->name.replace("大","小");         
          delete *i//指针需要删除内存
          flist.removeOne(*i);
        //  flist.erase(i);
          i--;  // 注意i的位置要回退一位
      }
  }

5、排序

使用qSort函数

bool compareData(const student &infoA, const student &infoB)
{
    return infoA.id < infoB.id;

}

 

qSort(SList.begin(),SList.end(),compareData);//按id排序

 

或者冒泡排序

//冒泡排序

    for (int i=0;i<SList.size();i++) {

        for (int j=i+1;j<SList.size();j++) {

            if (SList[j].id>SList[i].id)//互换

            {

                student temp;

                temp = SList[i];

                SList[i]=SList[j];

                SList[j]=temp;

            }

        }

    }

 

D:\QTproject\QtDxf\dxfhelper.cpp:352: error: C2665: “QList<QVector3D>::append”: 没有重载函数可以转换所有参数类型 D:\QTproject\QtDxf\dxfhelper.cpp(352): error C2665: “QList<QVector3D>::append”: 没有重载函数可以转换所有参数类型 D:\QT\6.5.3\msvc2019_64\include\QtCore/qlist.h(447): note: 可能是“void QList<QVector3D>::append(QList<QVector3D> &&)” D:\QTproject\QtDxf\dxfhelper.cpp(352): note: “void QList<QVector3D>::append(QList<QVector3D> &&)”: 无法将参数 1 从“QVector2D”转换为“QList<QVector3D> &&” D:\QTproject\QtDxf\dxfhelper.cpp(352): note: 原因如下: 无法从“QVector2D”转换为“QList<QVector3D>” D:\QTproject\QtDxf\dxfhelper.cpp(352): note: 没有可用于执行该转换的用户定义的转换运算符,或者无法调用该运算符 D:\QT\6.5.3\msvc2019_64\include\QtCore/qlist.h(443): note: 或 “void QList<QVector3D>::append(const QList<QVector3D> &)” D:\QTproject\QtDxf\dxfhelper.cpp(352): note: “void QList<QVector3D>::append(const QList<QVector3D> &)”: 无法将参数 1 从“QVector2D”转换为“const QList<QVector3D> &” D:\QTproject\QtDxf\dxfhelper.cpp(352): note: 原因如下: 无法从“QVector2D”转换为“const QList<QVector3D>” D:\QTproject\QtDxf\dxfhelper.cpp(352): note: 没有可用于执行该转换的用户定义的转换运算符,或者无法调用该运算符 D:\QT\6.5.3\msvc2019_64\include\QtCore/qlist.h(435): note: 或 “void QList<QVector3D>::append(QVector3D &&)” D:\QTproject\QtDxf\dxfhelper.cpp(352): note: “void QList<QVector3D>::append(QVector3D &&)”: 无法将参数 1 从“QVector2D”转换为“QVector3D &&” D:\QTproject\QtDxf\dxfhelper.cpp(352): note: 原因如下: 无法从“QVector2D”转换为“T” with [ T=QVector3D ] D:\QTproject\QtDxf\dxfhelper.cpp(352): note: 没有可用于执行该转换的用户定义的转换运算符,或者无法调用该运算符 D:\QT\6.5.3\msvc2019_64\include\QtCore/qlist.h(433): note: 或 “void QList<QVector3D>::append(const QVector3D &)” D:\QTproject\QtDxf\dxfhelper.cpp(352): note: “void QList<QVector3D>::append(const QVector3D &)”: 无法将参数 1 从“QVector2D”转换为“const QVector3D &” D:\QTproject\QtDxf\dxfhelper.cpp(352): note: 原因如下: 无法从“QVector2D”转换为“const T” with [ T=QVector3D ] D:\QTproject\QtDxf\dxfhelper.cpp(352): note: 没有可用于执行该转换的用户定义的转换运算符,或者无法调用该运算符 D:\QTproject\QtDxf\d
04-01
<think>好的,我现在需要解决在Qt 6.5.3中将QVector2D转换为QVector3D,然后调用QList<QVector3D>::append方法时的编译错误。首先,我应该理解为什么会出现这个错误。QList<QVector3D>的append方法需要接收一个QVector3D类型的参数,而如果传入的是QVector2D,类型不匹配自然会导致编译错误。 那么,如何将QVector2D转换为QVector3D呢?我需要查看Qt的文档,看看有没有现成的转换方法或者构造函数。QVector3D可能有接受QVector2D并补充第三个参数的构造函数,或者可能需要手动构造。比如,QVector3D的构造函数可能有QVector3D(const QVector2D &vector, float zpos),这样的话,我可以将QVector2D的实例加上一个z值来创建QVector3D。 假设用户有一个QVector2D对象vec2,想要将其转换为QVector3D,可能需要这样做:QVector3D vec3(vec2.x(), vec2.y(), 0.0f),或者使用QVector3D(vec2, 0.0f)。然后,将这个vec3添加到QList<QVector3D>中。 不过,用户可能在代码中直接尝试append(QVector2D),而没有进行转换。这时候需要检查代码,确认是否在append的时候传入了正确的类型。例如: QList<QVector3D> list; QVector2D vec2(1.0, 2.0); list.append(vec2); // 这里会出错,因为类型不匹配 正确的做法应该是: list.append(QVector3D(vec2.x(), vec2.y(), 0.0f)); 或者,如果QVector3D有对应的构造函数: list.append(QVector3D(vec2, 0.0f)); 另外,还需要注意Qt版本的问题。比如,用户提到的引用[1]中提到Qt6可能需要将endl改为Qt::endl,这可能涉及到命名空间的变化。不过这个问题主要出现在输出流中,与当前问题无关。引用[2]中提到的CMake配置可能影响项目构建,但编译错误更可能直接来自类型转换的问题。 还需要检查是否包含了正确的头文件,比如#include <QVector3D>#include <QVector2D>,否则编译器可能无法识别这些类型,导致错误。 总结解决方法步骤: 1. 确保包含必要的头文件。 2. 在append时显式将QVector2D转换为QVector3D,补充z值(如0.0f)。 3. 检查Qt版本是否影响构造函数的可用性,确保Qt 6.5.3支持这种转换方式。 此外,可能还需要考虑z值的默认值是否合理,根据具体应用场景决定是设为0还是其他值。如果没有特殊需求,通常可以设为0.0f。</think>在Qt 6.5.3中正确实现$QVector2D$到$QVector3D$的转换需要显式构造对象。以下是分步解决方案: 1. **包含头文件** 确保已添加必要头文件: ```cpp #include <QVector2D> #include <QVector3D> #include <QList> ``` 2. **构造$QVector3D$对象** 通过$QVector2D$的坐标值初始化$QVector3D$,并为z轴指定默认值(例如0.0f): ```cpp QVector2D vec2(1.0f, 2.0f); QVector3D vec3(vec2.x(), vec2.y(), 0.0f); // 显式构造三维向量 ``` 3. **调用append方法** 将构造好的$QVector3D$对象添加到列表中: ```cpp QList<QVector3D> pointList; pointList.append(vec3); ``` 4. **直接链式调用(可选)** 可在单行代码中完成转换添加: ```cpp pointList.append(QVector3D(vec2, 0.0f)); // 使用QVector3D的构造函数直接转换[^1] ``` **关键点**: - Qt 6中$QVector3D$提供接受$QVector2D$z值的构造函数,但需显式调用 - 若未指定z值,需根据应用场景选择合理默认值(如地形高度、投影平面等) - 类型不匹配错误通常由未执行显式转换导致,需避免直接传递$QVector2D$对象
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值