两种方法程序运行界面效果都一样!

程序运行截图如下:

这个图随便看看就可以了,没啥用!

代码如下:

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QListWidgetItem>
#include <QVector>namespace Ui {
class Widget;
}class MyListWidgetItem:public QListWidgetItem{
public:bool isVisited; //在此编译器中,这个值默认是false
};class Widget : public QWidget
{Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();public slots:void selectBtnClicked();private:Ui::Widget *ui;QVector<QListWidgetItem*> m_data;
};#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"#include <QDebug>
#include <QTime>
#include <QTimer>
#include <typeinfo>Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));for(int i=0;i<10000;i++){if(i>=0&&i<999){int randData=qrand()%100000+100;QString msg="对方发出"+QString::number(randData)+"未处理!";QListWidgetItem *listData=new QListWidgetItem;listData->setText(msg);m_data.append(listData);}else{int randData=qrand()%100000+100;QString msg="对方发出"+QString::number(randData)+"未处理!";MyListWidgetItem *listData=new MyListWidgetItem;listData->setText(msg);m_data.append(listData);}}connect(ui->pushButton,&QPushButton::clicked,this,&Widget::selectBtnClicked);
}Widget::~Widget()
{for(int i=0;i<m_data.size();i++){delete m_data[i];}delete ui;
}void Widget::selectBtnClicked()
{//方法一:利用typeinfoQVector<QListWidgetItem*>::iterator it=m_data.begin();while(it!=m_data.end()){if(QString(typeid(**it).name()).contains("MyListWidgetItem")){ui->listWidget->insertItem(0,(*it));}it++;}
}

main.cpp

#include "widget.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}

这里的方法为typeid

void Widget::selectBtnClicked()
{//方法一:利用typeinfoQVector<QListWidgetItem*>::iterator it=m_data.begin();while(it!=m_data.end()){if(QString(typeid(**it).name()).contains("MyListWidgetItem")){ui->listWidget->insertItem(0,(*it));}it++;}
}

获取类名,看看有没有包含MyListWidgetItem这个字符串。

这里要用到**it

第二种是继承法,得把m_data的数据类型改变,这个方法是很传统的方法。

代码如下:

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QListWidgetItem>
#include <QVector>namespace Ui {
class Widget;
}class MyListWidgetItem:public QListWidgetItem{
public:bool isVisited; //在此编译器中,这个值默认是false
};class Widget : public QWidget
{Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();public slots:void selectBtnClicked();private:Ui::Widget *ui;QVector<MyListWidgetItem*> m_data;
};#endif // WIDGET_H

main.cpp

#include "widget.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}

widget.cpp

#include "widget.h"
#include "ui_widget.h"#include <QDebug>
#include <QTime>
#include <QTimer>
#include <typeinfo>Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));for(int i=0;i<10000;i++){if(i>=0&&i<999){int randData=qrand()%100000+100;QString msg="对方发出"+QString::number(randData)+"未处理!";MyListWidgetItem *listData=new MyListWidgetItem;listData->isVisited=true;listData->setText(msg);m_data.append(listData);}else{int randData=qrand()%100000+100;QString msg="对方发出"+QString::number(randData)+"未处理!";MyListWidgetItem *listData=new MyListWidgetItem;listData->setText(msg);m_data.append(listData);}}connect(ui->pushButton,&QPushButton::clicked,this,&Widget::selectBtnClicked);
}Widget::~Widget()
{for(int i=0;i<m_data.size();i++){delete m_data[i];}delete ui;
}void Widget::selectBtnClicked()
{//方法一:利用typeinfo
//    QVector<QListWidgetItem*>::iterator it=m_data.begin();
//    while(it!=m_data.end()){
//        if(QString(typeid(**it).name()).contains("MyListWidgetItem")){
//            ui->listWidget->insertItem(0,(*it));
//        }
//        it++;
//    }//方法二,继承for(int i=0;i<m_data.size();i++){if(!m_data[i]->isVisited){ui->listWidget->insertItem(0,m_data[i]);}}}

Qt工作笔记-两种方法从容器中筛选出父类和子类(继承法、typeid法)相关推荐

  1. C/C++|Qt工作笔记-4种方法判断当前对象(类)名或标识(继承发,typeid法,元对象className()法,Q_CLASSINFO法)

    回想起3个月前,刚刚参加工作也做过类似的笔记,但只有2种方法,估计刚毕业没有什么墨水,经过3个月时间又多了2种方法: 这些方法都可用于RTTI 第一个方法是继承发(C++中很推荐用这个,感觉用这个结构 ...

  2. 两种方法:在 PowerPoint 中插入视频

    为追求更完美效果,在Powerpoint中通过shockwave Flash Object控件插入SWF格式动画已是家常便饭.但很多情况下,演示文档还需要视频做辅助,下面我们介绍在PowerPoint ...

  3. Qt工作笔记-三种方式解决Qt5中文编码问题

    目录 前言 方式一 方式二 方式三 三种方式解决Qt5中文编码问题 前言 这里不谈原理,只说如何去做! 这里本人自己总结下,今天遇到了新的编码问题,在此记录下,方面以后快速调用. 把这三种方法顺序试下 ...

  4. ROS☞通过两种方法提取.bag中的图像数据

    以下两种环境均在Ubuntu16.04环境下测试成功. 第一种方法 ROS-从rosbag中提取图像(by launch文件) 1.新建launch文件(文件在哪无所谓,可以在catkin_ws的根目 ...

  5. python程序中结束while循环的两种方法是_Python中while循环

    一.while 简介 Python 的循环有 for 和 while 两种,while 为条件控制循环,通过条件表达式控制循环结束. 流程图如下: Python 中 while 语句的格式如下: wh ...

  6. 两种方法用宏定义写出swap(x,y)

    问题引出: 如何将a,b交换,且不使用任何中间变量? 方法一:算术运算法 a=a+b; b=a-b; a=a-b; 方法二:逻辑运算法 a=a^b; b=a^b; a=a^b; 若采用宏定义完成此功能 ...

  7. Qt|Http笔记-两种方式发送http协议数据,获取服务器数据(GET方法)

    目录 背景 演示 搭建Java Web环境 QTcpSocket获取服务器数据 QNetworkAccessManager获取服务器数据 背景 Qt中有2个方式可以实现HTTP协议的发送,一个是使用Q ...

  8. Qt|Linux工作笔记-第二种方式读取Linux中top命令(直接读取,非重定向)

    第一种方式的链接如下: https://mp.csdn.net/postedit/84067805 第一种方式是重定向到文件,然后读取, 第二种方式不重定向到文件,直接读取! 利用QProcess的特 ...

  9. C++工作笔记-3种方法对数据类型进行拆分(可用于各种协议)

    比如用Long Long存3个数据的内容. 这里要知道大小端的知识点. 方法一是用位运算: 方法二是用指针: 方法三是结构体(本质上也是指针): 运行截图如下: 源码如下: main.cpp #inc ...

最新文章

  1. 清华大学大数据能力提升项目三名学生斩获2017年中国高校SAS数据分析大赛亚军
  2. VS2017中C++无法将参数1从const char [8] 转换为char[]
  3. C#在循环中使用Random时生成的随机数相同的解决办法
  4. vscode函数跳转插件_人生苦短,我们为 Cocos Creator 开发的插件和工具
  5. @vue/cli 3 运行支持报错 socket
  6. python自动发邮件附件_python自动发送带附件的邮件(163邮箱,亲测可用)
  7. net core体系-web应用程序-4asp.net core2.0 项目实战(CMS)-第二章 入门篇-快速入门ASP.NET Core看这篇就够了...
  8. MATLAB 图像处理工具箱 一种简单的基于图像处理交通信号灯识别算法
  9. Oracle 中文排序 Oracle 中文字段排序
  10. 小米手机 开启 开发者模式
  11. Hi3519AV100 适配IMX347
  12. Ensemble查看基因的外显子信息,并根据染色体位点判断是第几号外显子
  13. [Python]TempConvert.py(温度转换)解释拓展
  14. Docker可视化管理工具DockerUI
  15. DELLEMC VxRail POC 注意点
  16. 教你用iTOL轻松绘制高颜值系统进化树
  17. 写给还在迷茫中的朋友,一名6年程序员的工作感悟!!!
  18. SQL之HAVING
  19. 如何在 Facebook 上实现高效社交营销
  20. Python 词云分析周杰伦新歌《说好不哭》

热门文章

  1. 在车上偶遇一位阿里大佬
  2. 编程萌新注意:别再这样问问题了!学会这样快速定位错误内容
  3. 【转载】我只是随便说说的即时通讯
  4. 飞鸽传书写每行都认认真真
  5. 飞秋(FeiQ)仍然痛感hongjin2的计算机基础理论不好
  6. 抱歉,程序员的工作不能用时间来衡量
  7. mysql dp.cal 显示汉子_计算1到N中各个数字出现的次数 --数位DP
  8. 太省事了!高分SCI全套优质模板下载
  9. PCR之父凯利·穆利斯:有才,真的可以为所欲为
  10. R 学习 - 富集分析泡泡图回应