分享学习
标题:
QListView使用方法
[打印本页]
作者:
admin
时间:
2021-1-25 15:45
标题:
QListView使用方法
一:基本使用
QListView * listView = new QListView; //创建对象
listView->setEditTriggers(QAbstractItemView::NoEditTriggers); //设置 listView不可编辑
QStringList num;
num<<"1"<<"2"<<"3"; //放入3个字符串
QStringListModel *model = new QStringListModel(num); //创建对象,并用字符串队列初始化
listView->setModel(model); //设置listView的moderl
二:获取某一项数据
由刚才添加model可以知道,若想获取某一项的数据,那就将刚才的操作反过来做一遍就好了
即:
QString str = listView->model()->data(index).toString();
注:index为QModelIndex类型;data()的返回值为QVariant类型,它可以被转换为其他类型,我这里用了toString()函数进行了转换
三:槽的连接
connect(listView,SIGNAL(doubleClicked(const QModelIndex &)),this,
SLOT(setText1(const QModelIndex &)); //这里的意思是双击listView的某一项后,会在控制台打印出一串字符
setText1(const QModelIndex &index)
{
qDebug()<<"槽连接成功!!!";
}
复制代码
作者:
admin
时间:
2021-1-25 15:45
QListView的使用
QListView与QTreeView一样,也是采取的mvc模式,添加数据时,用相应的模式
1、初始化时添加数据
QStandardItemModel *model = new QStandardItemModel(this); //可以把这行放到头文件里面
1
QStandardItem *item = new QStandardItem("item1");
model->appendRow(item);
item = new QStandardItem("item2");
model->appendRow(item);
ui->listViewTask->setModel(model);
1
2
3
4
5
2、根据用户操作来添加数据
QStandardItem *item = new QStandardItem("item3");
QStandardItemModel *model = dynamic_cast<QStandardItemModel*>(ui->listViewTask->model());
model->appendRow(item);
1
2
3
4
3、删除数据
QStandardItemModel *model = dynamic_cast<QStandardItemModel*>(ui->listViewTask->model());
model->removeRow(ui->listViewTask->currentIndex().row());
1
2
4.获取行数;
int row_num = ui->listViewTask->model()->rowCount();
1
5.选中指定的行号
QModelIndex qindex = m_listviewmodel_->index(index,0); //默认选中 index
ui->listViewTask->setCurrentIndex(qindex);
1
2
6.设置滚动方式
enum QAbstractItemView::ScrollMode
Constant Value Description
QAbstractItemView::ScrollPerItem 0 The view will scroll the contents one item at a time.
QAbstractItemView::ScrollPerPixel 1 The view will scroll the contents one pixel at a time.
1
2
3
4
//设置为像素滚动;
setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);
7.初始化并设置隔行彩色显示;
standardItemModel = new QStandardItemModel(this);
QStringList strList;
strList.append("string1");
strList.append("string2");
strList.append("string3");
strList.append("string4");
strList.append("string5");
strList.append("string6");
strList.append("string7");
strList << "string8";
strList += "string9";
int nCount = strList.size();
for(int i = 0; i < nCount; i++)
{
QString string = static_cast<QString>(strList.at(i));
QStandardItem *item = new QStandardItem(string);
if(i % 2 == 1)
{
QLinearGradient linearGrad(QPointF(0, 0), QPointF(200, 200));
linearGrad.setColorAt(0, Qt::darkGreen);
linearGrad.setColorAt(1, Qt::yellow);
QBrush brush(linearGrad);
item->setBackground(brush);
}
standardItemModel->appendRow(item);
}
listView->setModel(standardItemModel);
listView->setFixedSize(200,300);
connect(listView,SIGNAL(clicked(QModelIndex)),this,SLOT(itemClicked(QModelIndex)));
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
8。更新某一行;
int row=listview->currentIndex().row();
if(row!=-1)
{
QModelIndex index=listmodel->index(row);
QString str=listmodel->data(index,Qt::DisplayRole).toString();//get data
bool ok;
QString text = QInputDialog::getText(this, tr("edit item"),
tr("please edit item"), QLineEdit::Normal,
str, &ok);
if (ok && !text.isEmpty())
{
listmodel->setData(index,text,Qt::EditRole);
listview->setCurrentIndex(index);
}
}
else
{
QMessageBox::information(NULL,tr("information"),tr("please select a item"));
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
///
QListWidget 是派生于QListView的。有了QListWidget ,QListView便是废了;因为QListWidget 能完成所有QListView的。没有必要再用listview
///
添加
QString strInput = XGlobal::mGetInputString(“请输入任务名称,比如上传省局节点机”);
if(strInput.isEmpty())
1
{
return;
}
QListWidgetItem *pItem = new QListWidgetItem();
pItem->setText(strInput);
ui->listViewTask->addItem(pItem);
1
2
3
4
5
6
7
或者这样也行
QStringList strList;
strList<< “Item1”<<“Item2”<< “Item3”<<“Item4”;
this->addItems(strList);
/***** 删除单个列表项 *****/
void MainWindow::deletebtn()
{
//获取列表项的指针
QListWidgetItem *item = ui->listWidget->takeItem(ui->listWidget->currentRow());
delete item; //释放指针所指向的列表项
1
2
3
4
5
}
/***** 删除多个列表项 *****/
void MainWindow::delallbtn()
{
int num = ui->listWidget->count(); //获取列表项的总数目
ui->listWidget->setFocus(); //将光标设置到列表框上,若注释该语句,则删除时,要手动将焦点设置到列表框,即点击列表项
for(int i=0;i<num;i++)
{ //逐个获取列表项的指针,并删除
QListWidgetItem *item = ui->listWidget->takeItem(ui->listWidget->currentRow());
delete item;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
}
/***** 添加多个列表项 *****/
void MainWindow::addallbtn()
{
QStringList FileNames = QFileDialog::getOpenFileNames(this,"打开",QDir::currentPath(),"所有文件(*.*);;文本文档(*.txt)");
//方法1 整体添加
1
2
3
// ui->listWidget->addItems(FileNames);
//方法2 逐个添加
int index=0,count=0;
1
2
3
// QListWidgetItem *item = new QListWidgetItem; //…………注释1
count = FileNames.count(); //获取打开文件的总数目
1
// for(index = 0;index<count;index++) //这样会报错,无法先取出栈底元素 //注释2
for(index=count-1;index>=0;index--) //QList<QString>的数据结构是栈,只能从栈顶取元素
1
{
QListWidgetItem *item = new QListWidgetItem;
item->setText(FileNames.takeAt(index)); //逐个设置列表项的文本
1
2
3
// qDebug()<<FileNames.takeAt(index); //…………注释3
ui->listWidget->addItem(item); //加载列表项到列表框
1
}
}
/***** 列表项单击操作 /
void MainWindow::singleclicked(QListWidgetItem item)
{
QMessageBox::information(this,“单击消息”,“单击”+item->text());
}
/* 列表项双击操作 ****/
void MainWindow::doubleclicked(QListWidgetItem item)
{
QMessageBox::information(this,“双击消息”,“双击”+item->text());
}
复制代码
作者:
admin
时间:
2021-1-25 16:55
添加右键菜单:
#include "widget.h"
#include "ui_widget.h"
#include <QCursor>
#include <QDebug>
#include <QListView>
#include <QStringList>
#include <QStringListModel>
#include <QPoint>
#include <QMenu>
#include <QListWidgetItem>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
listview =new QListView(this);
QStringList num;
num<<"1"<<"2"<<"3"<<"4";
QStringListModel *model=new QStringListModel(num);
listview->setModel(model);
listview->setContextMenuPolicy(Qt::CustomContextMenu);
connect(listview, SIGNAL(customContextMenuRequested(const QPoint&)),
this, SLOT(show_contextmenu1(const QPoint&)));
//删除测试
//全部删除
//model->removeRows(0,model->rowCount());
//删除第几个,一共删除多少个
//model->removeRows(0,3);
}
Widget::~Widget()
{
delete ui;
}
void Widget::show_contextmenu1(const QPoint& pos)
{
// if(cmenu)//保证同时只存在一个menu,及时释放内存
// {
// delete cmenu;
// cmenu = NULL;
// }
qDebug()<<"show_contextmenu1";
QMenu *cmenu = new QMenu(listview);
QAction *ascendSortAction = cmenu->addAction("升序");
QAction *descendSortAction = cmenu->addAction("降序");
QAction *filterAction = cmenu->addAction("过滤");
QAction *reshowAction = cmenu->addAction("重载");
connect(ascendSortAction, SIGNAL(triggered(bool)), this, SLOT(edit_menu1()));
connect(descendSortAction, SIGNAL(triggered(bool)), this, SLOT(edit_menu2()));
connect(filterAction, SIGNAL(triggered(bool)), this, SLOT(edit_menu3()));
connect(reshowAction, SIGNAL(triggered(bool)), this, SLOT(edit_menu4()));
cmenu->exec(QCursor::pos());//在当前鼠标位置显示
//cmenu->exec(pos)是在viewport显示
}
//点击空白错将不错出现菜单
if(!((listview->selectionModel()->selectedIndexes()).empty()))
{
qDebug()<<"show_contextmenu1";
QMenu *cmenu = new QMenu(listview);
QAction *ascendSortAction = cmenu->addAction("升序");
QAction *descendSortAction = cmenu->addAction("降序");
QAction *filterAction = cmenu->addAction("过滤");
QAction *reshowAction = cmenu->addAction("重载");
connect(ascendSortAction, SIGNAL(triggered(bool)), this, SLOT(edit_menu1()));
connect(descendSortAction, SIGNAL(triggered(bool)), this, SLOT(edit_menu2()));
connect(filterAction, SIGNAL(triggered(bool)), this, SLOT(edit_menu3()));
connect(reshowAction, SIGNAL(triggered(bool)), this, SLOT(edit_menu4()));
cmenu->exec(QCursor::pos());//在当前鼠标位置显示
//cmenu->exec(pos)是在viewport显示
//把选中的清楚
listview->selectionModel()->clear();
}
复制代码
欢迎光临 分享学习 (http://1314xuexi.com/)
Powered by Discuz! X3.3