两种方法程序运行界面效果都一样!
程序运行截图如下:
这个图随便看看就可以了,没啥用!
代码如下:
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_OBJECT
public:
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()
{
//方法一:利用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++;
}
}
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()
{
//方法一:利用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++;
}
}
获取类名,看看有没有包含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_OBJECT
public:
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]);
}
}
}