qt中QListView的用法和QModelIndex的使用
使用QTreeView,對于很多函數中針對item的唯一標識QModelIndex的使用,記錄下兩種對于QModelIdex的使用
1,樹形結構的item設置為選中
QModelIndex rootIndex;
QModelIndex robotsIndex;
QModelIndex nonMobileIndex;
rootIndex = treeView->model()->index(0, 0);//最頂層item的index
robotsIndex = treeView->model()->index(10, 0, rootIndex);//選中item父親的index
nonMobileIndex = treeView->model()->index(1, 0, robotsIndex);//選中item的index
treeView->setCurrentIndex(nonMobileIndex);//這種方法使用的絕對路徑,但暫時沒找到其他方式設置初始化時選中。
2,通過index讀取建立item時setData的數據
直接通過index讀取的數據是錯誤的一直顯示0,需要獲取建立QTreeView時的QStandardItemModel即treeView->setModel(itemModel)中的itemModel
QStandardItemModel * ? standardModel = static_cast < QStandardItemModel*>(itemModel);
QStandardItem * ? currentItem = standardModel->itemFromIndex(index);
QVariant data = currentItem->data();
data可轉換成任意格式。
/*****************
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); ?
2、根據用戶操作來添加數據
QStandardItem *item = new QStandardItem("item3"); ?
QStandardItemModel *model = dynamic_cast<QStandardItemModel*>(ui->listViewTask->model()); ?
model->appendRow(item); ?
3、刪除數據
QStandardItemModel *model = dynamic_cast<QStandardItemModel*>(ui->listViewTask->model()); ?
model->removeRow(ui->listViewTask->currentIndex().row());
4.獲取行數;
?int row_num = ui->listViewTask->model()->rowCount();
5.選中指定的行號
?QModelIndex qindex = m_listviewmodel_->index(index,0); ? //默認選中 index
?ui->listViewTask->setCurrentIndex(qindex);
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. ?
//設置為像素滾動;
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))); ?
} ?
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"));
?}
///
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);
或者這樣也行
QStringList strList;
strList<< “Item1”<<“Item2”<< “Item3”<<“Item4”;
this->addItems(strList);
/***** 刪除單個列表項 *****/
void MainWindow::deletebtn()
{
//獲取列表項的指針
QListWidgetItem *item = ui->listWidget->takeItem(ui->listWidget->currentRow());
delete item; ? ? ? ?//釋放指針所指向的列表項
}
/***** 刪除多個列表項 *****/
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;
}
}
/***** 添加多個列表項 *****/
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());
}
/************************
一:基本使用
? ? ? ? ? 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()<<"槽連接成功!!!";
? ? ? ? ? }
?
總結
以上是生活随笔為你收集整理的qt中QListView的用法和QModelIndex的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hue 查询 hbase 操作相关参考
- 下一篇: VSCode 汉化、设置为 中文语言显示