一生一世学坛

 找回密码
 立即注册
搜索
查看: 6363|回复: 2
打印 上一主题 下一主题

QListView使用方法

[复制链接]

334

主题

385

帖子

6816

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
6816
跳转到指定楼层
楼主
发表于 2021-1-25 15:45:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. 一:基本使用
  2.           QListView * listView = new QListView;     //创建对象

  3.           listView->setEditTriggers(QAbstractItemView::NoEditTriggers);     //设置 listView不可编辑

  4.           QStringList num;

  5.           num<<"1"<<"2"<<"3";     //放入3个字符串

  6.      QStringListModel *model = new QStringListModel(num);     //创建对象,并用字符串队列初始化
  7.      listView->setModel(model);     //设置listView的moderl
  8. 二:获取某一项数据
  9.           由刚才添加model可以知道,若想获取某一项的数据,那就将刚才的操作反过来做一遍就好了

  10.           即:

  11.           QString str = listView->model()->data(index).toString();

  12.          注:index为QModelIndex类型;data()的返回值为QVariant类型,它可以被转换为其他类型,我这里用了toString()函数进行了转换

  13. 三:槽的连接
  14.           connect(listView,SIGNAL(doubleClicked(const QModelIndex &)),this,

  15.                    SLOT(setText1(const QModelIndex &));     //这里的意思是双击listView的某一项后,会在控制台打印出一串字符

  16.           setText1(const QModelIndex &index)

  17.           {
  18.                   qDebug()<<"槽连接成功!!!";

  19.           }
复制代码


回复

使用道具 举报

334

主题

385

帖子

6816

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
6816
沙发
 楼主| 发表于 2021-1-25 15:45:57 | 只看该作者
  1. QListView的使用

  2. QListView与QTreeView一样,也是采取的mvc模式,添加数据时,用相应的模式
  3. 1、初始化时添加数据

  4. QStandardItemModel *model = new QStandardItemModel(this); //可以把这行放到头文件里面
  5. 1
  6. QStandardItem *item = new QStandardItem("item1");  
  7. model->appendRow(item);  
  8. item = new QStandardItem("item2");  
  9. model->appendRow(item);  
  10. ui->listViewTask->setModel(model);  
  11. 1
  12. 2
  13. 3
  14. 4
  15. 5
  16. 2、根据用户操作来添加数据

  17. QStandardItem *item = new QStandardItem("item3");  
  18. QStandardItemModel *model = dynamic_cast<QStandardItemModel*>(ui->listViewTask->model());  

  19. model->appendRow(item);  
  20. 1
  21. 2
  22. 3
  23. 4
  24. 3、删除数据

  25. QStandardItemModel *model = dynamic_cast<QStandardItemModel*>(ui->listViewTask->model());  
  26. model->removeRow(ui->listViewTask->currentIndex().row());
  27. 1
  28. 2
  29. 4.获取行数;

  30. int row_num = ui->listViewTask->model()->rowCount();
  31. 1
  32. 5.选中指定的行号

  33. QModelIndex qindex = m_listviewmodel_->index(index,0);   //默认选中 index
  34. ui->listViewTask->setCurrentIndex(qindex);
  35. 1
  36. 2
  37. 6.设置滚动方式

  38. enum QAbstractItemView::ScrollMode  
  39. Constant    Value   Description  
  40. QAbstractItemView::ScrollPerItem    0   The view will scroll the contents one item at a time.  
  41. QAbstractItemView::ScrollPerPixel   1   The view will scroll the contents one pixel at a time.  
  42. 1
  43. 2
  44. 3
  45. 4
  46. //设置为像素滚动;
  47. setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);

  48. 7.初始化并设置隔行彩色显示;

  49. standardItemModel = new QStandardItemModel(this);  
  50.   
  51.     QStringList strList;  
  52.     strList.append("string1");  
  53.     strList.append("string2");  
  54.     strList.append("string3");  
  55.     strList.append("string4");  
  56.     strList.append("string5");  
  57.     strList.append("string6");  
  58.     strList.append("string7");  
  59.     strList << "string8";  
  60.     strList += "string9";  
  61.     int nCount = strList.size();  
  62.     for(int i = 0; i < nCount; i++)  
  63.     {  
  64.         QString string = static_cast<QString>(strList.at(i));  
  65.         QStandardItem *item = new QStandardItem(string);  
  66.         if(i % 2 == 1)  
  67.         {  
  68.             QLinearGradient linearGrad(QPointF(0, 0), QPointF(200, 200));  
  69.             linearGrad.setColorAt(0, Qt::darkGreen);  
  70.             linearGrad.setColorAt(1, Qt::yellow);  
  71.             QBrush brush(linearGrad);  
  72.             item->setBackground(brush);  
  73.         }  
  74.         standardItemModel->appendRow(item);  
  75.     }  
  76.     listView->setModel(standardItemModel);  
  77.     listView->setFixedSize(200,300);  
  78.     connect(listView,SIGNAL(clicked(QModelIndex)),this,SLOT(itemClicked(QModelIndex)));  
  79. }  
  80. 1
  81. 2
  82. 3
  83. 4
  84. 5
  85. 6
  86. 7
  87. 8
  88. 9
  89. 10
  90. 11
  91. 12
  92. 13
  93. 14
  94. 15
  95. 16
  96. 17
  97. 18
  98. 19
  99. 20
  100. 21
  101. 22
  102. 23
  103. 24
  104. 25
  105. 26
  106. 27
  107. 28
  108. 29
  109. 30
  110. 31
  111. 8。更新某一行;

  112. int row=listview->currentIndex().row();
  113. if(row!=-1)
  114. {
  115.   QModelIndex index=listmodel->index(row);
  116.   QString str=listmodel->data(index,Qt::DisplayRole).toString();//get data
  117.   bool ok;
  118.   QString text = QInputDialog::getText(this, tr("edit item"),
  119.           tr("please edit item"), QLineEdit::Normal,
  120.           str, &ok);
  121.   if (ok && !text.isEmpty())
  122.   {
  123.    listmodel->setData(index,text,Qt::EditRole);
  124.    listview->setCurrentIndex(index);
  125.   }
  126.   
  127. }
  128. else
  129. {
  130.   QMessageBox::information(NULL,tr("information"),tr("please select a item"));
  131. }
  132. 1
  133. 2
  134. 3
  135. 4
  136. 5
  137. 6
  138. 7
  139. 8
  140. 9
  141. 10
  142. 11
  143. 12
  144. 13
  145. 14
  146. 15
  147. 16
  148. 17
  149. 18
  150. 19
  151. 20
  152. ///

  153. QListWidget 是派生于QListView的。有了QListWidget ,QListView便是废了;因为QListWidget 能完成所有QListView的。没有必要再用listview

  154. ///

  155. 添加

  156. QString strInput = XGlobal::mGetInputString(“请输入任务名称,比如上传省局节点机”);

  157. if(strInput.isEmpty())   
  158. 1
  159. {
  160. return;

  161. }

  162. QListWidgetItem *pItem = new QListWidgetItem();

  163. pItem->setText(strInput);

  164. ui->listViewTask->addItem(pItem);
  165. 1
  166. 2
  167. 3
  168. 4
  169. 5
  170. 6
  171. 7
  172. 或者这样也行

  173. QStringList strList;
  174. strList<< “Item1”<<“Item2”<< “Item3”<<“Item4”;

  175. this->addItems(strList);

  176. /***** 删除单个列表项 *****/

  177. void MainWindow::deletebtn()

  178. {
  179. //获取列表项的指针

  180. QListWidgetItem *item = ui->listWidget->takeItem(ui->listWidget->currentRow());

  181. delete item;        //释放指针所指向的列表项
  182. 1
  183. 2
  184. 3
  185. 4
  186. 5
  187. }

  188. /***** 删除多个列表项 *****/

  189. void MainWindow::delallbtn()

  190. {
  191. int num = ui->listWidget->count();  //获取列表项的总数目

  192. ui->listWidget->setFocus(); //将光标设置到列表框上,若注释该语句,则删除时,要手动将焦点设置到列表框,即点击列表项

  193. for(int i=0;i<num;i++)

  194. {   //逐个获取列表项的指针,并删除

  195.     QListWidgetItem *item = ui->listWidget->takeItem(ui->listWidget->currentRow());

  196.     delete item;

  197. }
  198. 1
  199. 2
  200. 3
  201. 4
  202. 5
  203. 6
  204. 7
  205. 8
  206. 9
  207. 10
  208. 11
  209. 12
  210. 13
  211. }

  212. /***** 添加多个列表项 *****/

  213. void MainWindow::addallbtn()

  214. {
  215. QStringList FileNames = QFileDialog::getOpenFileNames(this,"打开",QDir::currentPath(),"所有文件(*.*);;文本文档(*.txt)");

  216. //方法1  整体添加
  217. 1
  218. 2
  219. 3
  220. // ui->listWidget->addItems(FileNames);

  221. //方法2  逐个添加

  222. int index=0,count=0;
  223. 1
  224. 2
  225. 3
  226. // QListWidgetItem *item = new QListWidgetItem; //…………注释1

  227. count = FileNames.count();              //获取打开文件的总数目
  228. 1
  229. // for(index = 0;index<count;index++) //这样会报错,无法先取出栈底元素 //注释2

  230. for(index=count-1;index>=0;index--)     //QList<QString>的数据结构是栈,只能从栈顶取元素
  231. 1
  232. {
  233.     QListWidgetItem *item = new QListWidgetItem;

  234.     item->setText(FileNames.takeAt(index)); //逐个设置列表项的文本
  235. 1
  236. 2
  237. 3
  238. // qDebug()<<FileNames.takeAt(index); //…………注释3

  239.     ui->listWidget->addItem(item);      //加载列表项到列表框
  240. 1
  241. }

  242. }

  243. /***** 列表项单击操作 /
  244. void MainWindow::singleclicked(QListWidgetItem item)
  245. {
  246. QMessageBox::information(this,“单击消息”,“单击”+item->text());
  247. }
  248. /* 列表项双击操作 ****/
  249. void MainWindow::doubleclicked(QListWidgetItem item)
  250. {
  251. QMessageBox::information(this,“双击消息”,“双击”+item->text());
  252. }
复制代码
回复

使用道具 举报

334

主题

385

帖子

6816

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
6816
板凳
 楼主| 发表于 2021-1-25 16:55:13 | 只看该作者
添加右键菜单:
  1. #include "widget.h"
  2. #include "ui_widget.h"
  3. #include <QCursor>
  4. #include <QDebug>
  5. #include <QListView>
  6. #include <QStringList>
  7. #include <QStringListModel>
  8. #include <QPoint>
  9. #include <QMenu>
  10. #include <QListWidgetItem>

  11. Widget::Widget(QWidget *parent) :
  12.     QWidget(parent),
  13.     ui(new Ui::Widget)
  14. {
  15.     ui->setupUi(this);
  16.     listview =new QListView(this);
  17.     QStringList num;
  18.     num<<"1"<<"2"<<"3"<<"4";
  19.     QStringListModel *model=new QStringListModel(num);
  20.     listview->setModel(model);
  21.     listview->setContextMenuPolicy(Qt::CustomContextMenu);
  22.     connect(listview, SIGNAL(customContextMenuRequested(const QPoint&)),
  23.             this, SLOT(show_contextmenu1(const QPoint&)));
  24.     //删除测试
  25.     //全部删除
  26.     //model->removeRows(0,model->rowCount());
  27.     //删除第几个,一共删除多少个
  28.     //model->removeRows(0,3);
  29. }

  30. Widget::~Widget()
  31. {
  32.     delete ui;
  33. }

  34. void Widget::show_contextmenu1(const QPoint& pos)
  35. {
  36.     // if(cmenu)//保证同时只存在一个menu,及时释放内存
  37.     // {
  38.     // delete cmenu;
  39.     // cmenu = NULL;
  40.     // }
  41.     qDebug()<<"show_contextmenu1";
  42.     QMenu *cmenu = new QMenu(listview);
  43.     QAction *ascendSortAction = cmenu->addAction("升序");
  44.     QAction *descendSortAction = cmenu->addAction("降序");
  45.     QAction *filterAction = cmenu->addAction("过滤");
  46.     QAction *reshowAction = cmenu->addAction("重载");
  47.     connect(ascendSortAction, SIGNAL(triggered(bool)), this, SLOT(edit_menu1()));
  48.     connect(descendSortAction, SIGNAL(triggered(bool)), this, SLOT(edit_menu2()));
  49.     connect(filterAction, SIGNAL(triggered(bool)), this, SLOT(edit_menu3()));
  50.     connect(reshowAction, SIGNAL(triggered(bool)), this, SLOT(edit_menu4()));
  51.     cmenu->exec(QCursor::pos());//在当前鼠标位置显示
  52.     //cmenu->exec(pos)是在viewport显示
  53. }





  54. //点击空白错将不错出现菜单
  55.     if(!((listview->selectionModel()->selectedIndexes()).empty()))
  56.     {

  57.         qDebug()<<"show_contextmenu1";
  58.         QMenu *cmenu = new QMenu(listview);
  59.         QAction *ascendSortAction = cmenu->addAction("升序");
  60.         QAction *descendSortAction = cmenu->addAction("降序");
  61.         QAction *filterAction = cmenu->addAction("过滤");
  62.         QAction *reshowAction = cmenu->addAction("重载");
  63.         connect(ascendSortAction, SIGNAL(triggered(bool)), this, SLOT(edit_menu1()));
  64.         connect(descendSortAction, SIGNAL(triggered(bool)), this, SLOT(edit_menu2()));
  65.         connect(filterAction, SIGNAL(triggered(bool)), this, SLOT(edit_menu3()));
  66.         connect(reshowAction, SIGNAL(triggered(bool)), this, SLOT(edit_menu4()));
  67.         cmenu->exec(QCursor::pos());//在当前鼠标位置显示
  68.         //cmenu->exec(pos)是在viewport显示

  69.         //把选中的清楚
  70.         listview->selectionModel()->clear();
  71.     }
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|分享学习  

GMT+8, 2024-5-2 14:26 , Processed in 0.046840 second(s), 5 queries , File On.

声明:本站严禁任何人以任何形式发表违法言论!

本站内容由网友原创或转载,如果侵犯了您的合法权益,请及时联系处理!© 2017 zamxqun@163.com

皖公网安备 34010402700634号

皖ICP备17017002号-1

快速回复 返回顶部 返回列表