Qt工作笔记-两种方法从容器中筛选出父类和子类(继承法、typeid法)
生活随笔
收集整理的這篇文章主要介紹了
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_Hwidget.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_Hmain.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++工作笔记-结构体与类的进一步探究(