Qt工作笔记-两种方法从容器中筛选出父类和子类(继承法、typeid法)
两种方法程序运行界面效果都一样!
程序运行截图如下:
这个图随便看看就可以了,没啥用!
代码如下:
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法)相关推荐
- C/C++|Qt工作笔记-4种方法判断当前对象(类)名或标识(继承发,typeid法,元对象className()法,Q_CLASSINFO法)
回想起3个月前,刚刚参加工作也做过类似的笔记,但只有2种方法,估计刚毕业没有什么墨水,经过3个月时间又多了2种方法: 这些方法都可用于RTTI 第一个方法是继承发(C++中很推荐用这个,感觉用这个结构 ...
- 两种方法:在 PowerPoint 中插入视频
为追求更完美效果,在Powerpoint中通过shockwave Flash Object控件插入SWF格式动画已是家常便饭.但很多情况下,演示文档还需要视频做辅助,下面我们介绍在PowerPoint ...
- Qt工作笔记-三种方式解决Qt5中文编码问题
目录 前言 方式一 方式二 方式三 三种方式解决Qt5中文编码问题 前言 这里不谈原理,只说如何去做! 这里本人自己总结下,今天遇到了新的编码问题,在此记录下,方面以后快速调用. 把这三种方法顺序试下 ...
- ROS☞通过两种方法提取.bag中的图像数据
以下两种环境均在Ubuntu16.04环境下测试成功. 第一种方法 ROS-从rosbag中提取图像(by launch文件) 1.新建launch文件(文件在哪无所谓,可以在catkin_ws的根目 ...
- python程序中结束while循环的两种方法是_Python中while循环
一.while 简介 Python 的循环有 for 和 while 两种,while 为条件控制循环,通过条件表达式控制循环结束. 流程图如下: Python 中 while 语句的格式如下: wh ...
- 两种方法用宏定义写出swap(x,y)
问题引出: 如何将a,b交换,且不使用任何中间变量? 方法一:算术运算法 a=a+b; b=a-b; a=a-b; 方法二:逻辑运算法 a=a^b; b=a^b; a=a^b; 若采用宏定义完成此功能 ...
- Qt|Http笔记-两种方式发送http协议数据,获取服务器数据(GET方法)
目录 背景 演示 搭建Java Web环境 QTcpSocket获取服务器数据 QNetworkAccessManager获取服务器数据 背景 Qt中有2个方式可以实现HTTP协议的发送,一个是使用Q ...
- Qt|Linux工作笔记-第二种方式读取Linux中top命令(直接读取,非重定向)
第一种方式的链接如下: https://mp.csdn.net/postedit/84067805 第一种方式是重定向到文件,然后读取, 第二种方式不重定向到文件,直接读取! 利用QProcess的特 ...
- C++工作笔记-3种方法对数据类型进行拆分(可用于各种协议)
比如用Long Long存3个数据的内容. 这里要知道大小端的知识点. 方法一是用位运算: 方法二是用指针: 方法三是结构体(本质上也是指针): 运行截图如下: 源码如下: main.cpp #inc ...
最新文章
- 清华大学大数据能力提升项目三名学生斩获2017年中国高校SAS数据分析大赛亚军
- VS2017中C++无法将参数1从const char [8] 转换为char[]
- C#在循环中使用Random时生成的随机数相同的解决办法
- vscode函数跳转插件_人生苦短,我们为 Cocos Creator 开发的插件和工具
- @vue/cli 3 运行支持报错 socket
- python自动发邮件附件_python自动发送带附件的邮件(163邮箱,亲测可用)
- net core体系-web应用程序-4asp.net core2.0 项目实战(CMS)-第二章 入门篇-快速入门ASP.NET Core看这篇就够了...
- MATLAB 图像处理工具箱 一种简单的基于图像处理交通信号灯识别算法
- Oracle 中文排序 Oracle 中文字段排序
- 小米手机 开启 开发者模式
- Hi3519AV100 适配IMX347
- Ensemble查看基因的外显子信息,并根据染色体位点判断是第几号外显子
- [Python]TempConvert.py(温度转换)解释拓展
- Docker可视化管理工具DockerUI
- DELLEMC VxRail POC 注意点
- 教你用iTOL轻松绘制高颜值系统进化树
- 写给还在迷茫中的朋友,一名6年程序员的工作感悟!!!
- SQL之HAVING
- 如何在 Facebook 上实现高效社交营销
- Python 词云分析周杰伦新歌《说好不哭》