2015-08-28 223 views
-1

我需要将QListView中的选定项目名称作为QString。我试图谷歌,但我没有发现任何有用的。如何从QT中的QListView中获取选定项目的文本?

QListViewModel和填充它是如下的方法:

QString setting_path = QDesktopServices::storageLocation(QDesktopServices::DataLocation); 

QStandardItemModel *model2=new QStandardItemModel(); 

QFile file(setting_path+"history.txt"); 
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) 
    return; 

QTextStream in(&file); 

while(!in.atEnd()) { 
QString line = in.readLine(); 
QList<QStandardItem *> items; 
QStringList fields = line.split(">"); 
QStringList fields3 = fields.filter(""); 

foreach (QString text, fields3) 
{ 
    items.append(new QStandardItem((QString)text)); 
} 

if(items.length() > 0) 
{ 
    model2->appendRow(items); 
} 
} 
ui->listView->setModel(model2); 
} 

回答

0

用下面的代码解决:

void hist::on_listView_clicked(const QModelIndex &index) { 
    QModelIndexList templatelist = ui->listView->selectionModel()->selectedIndexes(); 
    QStringList stringlist; 
    foreach (const QModelIndex &index, templatelist){ 
    stringlist.append(index.data(Qt::DisplayRole).toString()); 
    } 
    qDebug() << stringlist.join(","); 
    } 

enter image description here

谢谢大家!

3

我认为,你可以使用selectedIndexes()这个

QModelIndexList QListView::selectedIndexes() const; 

所以,当你需要的物品 - 只需调用此方法,并通过您的访问器获取模型中的项目,或者通过将数据(索引)用于您的/ system角色,或者通过任何方式获取按行和列的索引来获取项目。

例如,这是如何得到第一个项目:

void MyListView::somethingIsSelected() { 
    const auto selectedIdxs = selectedIndexes(); 
    if (!selectedIdxs.isEmpty()) { 
     const QVariant var = model()->data(selectedIdxs.first()); 
     // next you need to convert your `var` from `QVariant` to something that you show from your data with default (`Qt::DisplayRole`) role, usually it is a `QString`: 
     const QString selectedItemString = var.toString(); 

     // or you also may do this by using `QStandardItemModel::itemFromIndex()` method: 
     const QStandardItem* selectedItem = dynamic_cast<QStandardItemModel*>(model())->itemFromIndex(selectedIdxs.first()); 
     // use your `QStandardItem` 
    } 
} 
相关问题