本节主要内容如下:
- 文章列表添加收藏标志
- QStandItem的Role含义,data,setData,setItem方法
- c++ static静态变量应用
对于一些较好的文章,我们希望能做收藏标记,以便后续能回过来好好看一下。因而考虑将之前单列的文章列表新增一列为收藏列。
在qrc文件中添加收藏与取消收藏图片(starOn,starOff)
这一部分为寻常的Qt添加资源文件的方法,跳过。
在newsmodel的表头和内容第一列添加收藏图标
void newsModel::creatHeadr(){ setHorizontalHeaderItem(0,new QStandardItem(QIcon(":/images/starOff.png"),"")); setHorizontalHeaderItem(1,new QStandardItem("文章标题"));}void newsModel::addItem(QString title,QString link){ QList list; QStandardItem *star = new QStandardItem(QIcon(":/images/starOff.png"),""); star->setData(false,Qt::UserRole+1); QStandardItem *titleitem=new QStandardItem(title); titleitem->setData(link); list<
![da87dc6b942feae4ab1459d365a1fc69.png](https://img-blog.csdnimg.cn/img_convert/da87dc6b942feae4ab1459d365a1fc69.png)
收藏图标
添加收藏与取消收藏的图标事件响应逻辑(部分完成)
目前仅加入了图标切换和收藏状态切换,设计好了外壳,接下来有待加入不同状态的响应函数,以实现具体的功能。
void newsModel::starOnOff(const QModelIndex &index){ if(this->data(index,Qt::UserRole+1).toBool()){ this->setData(index,false,Qt::UserRole+1); this->setData(index,QIcon(":/images/starOff.png"),Qt::DecorationRole); }else{ this->setData(index,true,Qt::UserRole+1); this->setData(index,QIcon(":/images/starOn.png"),Qt::DecorationRole); }}
![fa05ffb59f41e0b42408824ba3a7c11a.png](https://img-blog.csdnimg.cn/img_convert/fa05ffb59f41e0b42408824ba3a7c11a.png)
收藏/取消收藏
修改tvNewsList的响应槽函数
void MainWindow::on_tvNewsList_clicked(const QModelIndex &index){ static QUrl link; switch (index.column()) { case 0: { newsmodel->starOnOff(index); break; } case 1: { link=QUrl(newsmodel->data(index,Qt::UserRole+1).toString()); webview->load(link); webview->show(); break; } default: { } }}
完成这些功能之前,被QStandItem的Role困惑了好久,最终才理清楚其含义。
![2249e4138ca7dcaa5d2860c1db713d7f.png](https://img-blog.csdnimg.cn/img_convert/2249e4138ca7dcaa5d2860c1db713d7f.png)
Role
QStandItem对应于列表的某个单元格,其可以有多个属性,比如可以有图片,可以有背景颜色,字体颜色,鼠标悬浮时提示字,是否可以拖动,是否可以修改,以及支持自定义操作。而在我们初始化的时候,通过调用不同初始化函数,可以赋予不同的特征。
QStandardItem(QIcon(":/images/starOff.png"),"");
比如上面,通过QIcon的方式初始化,则会自动将其角色分配给Qt::DecorationRole.
同时,也可以通过setData方法修改其他属性,但是这里需要指定Role。构造函数中因为已经声明了参数类型,因而向QIcon这类的变量可以自动赋予角色。但是setData中数据参数为QVariant类型,无法自动检查,因而需要在后面指定Role.
对于用户想要自定义的属性,可以通过UserRole+n的形式追加。
star->setData(false,Qt::UserRole+1);
比如这里,我需要标记收藏图标的状态,即收藏/未收藏,因而为该item设置bool属性,同时指定自定义角色Qt::UserRole+1.
后续再切换收藏状态时,切换该属性,并更改该item显示的图片。
this->setData(index,false,Qt::UserRole+1);this->setData(index,QIcon(":/images/starOff.png"),Qt::DecorationRole);
再次强调,调用setData需要指定Role参数,否则会调用默认角色,常常输错。
类似地,data方法则用来取出item的数据,通过指定Role来获得对应的属性。
c++ static 静态变量设置
静态变量的设置用于将变量的作用域提升。函数内设置静态变量可以用于保存函数运行的上一次状态参数,方便追溯。
static QUrl link;
能够保存每一次访问link的记录。
项目演示视频
项目地址: