【问题标题】:How to remove an Item from a List View?如何从列表视图中删除项目?
【发布时间】:2012-09-23 11:20:26
【问题描述】:

我有一个 QLineEdit、2 个 QPushButtons(添加和删除按钮)和一个 QListView。 单击添加按钮时,我想将 QLineEdit 文本添加到 QListView。同样,如果单击删除按钮,我必须从 QListView 中删除一个项目。 我正在使用 QStringListModelQLineEdit 文本添加到 QListView。但我不知道如何删除 QListView 项。我怎样才能做到这一点?请帮助.. 提前致谢。

#ifndef  EXAMPLE_H
#define  EXAMPLE_H
#include <QWidget>
#include <QStringList>
#include <QStringListModel>


class EXAMPLE : public QWidget
{
    Q_OBJECT

 public:
     explicit EXAMPLE(QWidget *parent = 0);
     ~EXAMPLE();

 private slots:
      void on_addButton_released();
      void on_removeButon_released();

 private:
      Ui::EXAMPLE *ui;
      QStringList  stringList;
 };

 #endif // EXAMPLE_H


    EXAMPLE.CPP

    #include "EXAMPLE.h"
    #include <QStringListModel>


    EXAMPLE::EXAMPLE(QWidget *parent) :
        QWidget(parent),
        ui(new Ui::EXAMPLE)
    {
        ui->setupUi(this);
        ui->listView->setModel(new QStringListModel(stringList));
    }

    EXAMPLE::~EXAMPLE()
    {
        delete ui;
    }

    void EXAMPLE::on_addButton_released()
    {
        stringList.append(ui->lineEdit->text());
        ((QStringListModel*) ui->listView->model())->setStringList(stringList);
        ui->lineEdit->clear();
    }

    void EXAMPLE::on_removeButon_released()
    {

    }

【问题讨论】:

  • 当按下删除按钮时,您要删除当前选中的一项,最后一项,还是其他一项?
  • 我要删除当前选中的项目。

标签: qt qt4.7 qlistview qlineedit


【解决方案1】:

如果您的列表视图仅使用单选,则以下方法将起作用:

void EXAMPLE::on_removeButton_released()
{
   QModelIndexList selected = ui->listView->selectionModel()->selectedIndexes();
   if (!selected.isEmpty())
   {
      stringList.removeAt(selected.first().row()-i);
      ((QStringListModel*) ui->listView->model())->setStringList(stringList);
   }
}

如果您的列表视图允许选择多个项目,那么您需要稍微复杂一些的东西:

void EXAMPLE::on_removeButton_released()
{
   QModelIndexList selected = ui->listView->selectionModel()->selectedIndexes();
   if (!selected.isEmpty())
   {
      qSort(selected);
      for (int i=0; i<selected.count(); ++i)
      {
         stringList.removeAt(selected.at(i).row()-i);
      }
      ((QStringListModel*) ui->listView->model())->setStringList(stringList);
   }
}

还有一种方法可以直接从项目模型中删除项目(而不是将其从字符串列表中删除,然后在模型上设置字符串列表)。请参阅QAbstractItemModel::removeRow 的文档。如果你走这条路,你添加项目的方法也需要改变。

【讨论】:

  • 非常感谢。我尝试使用 QAbstractItemModel::removeRow() 并且效果很好。再次感谢。这是我的编码.. model->removeRow(ui->listView->currentIndex().row());
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-04
  • 1970-01-01
  • 1970-01-01
  • 2016-09-21
相关资源
最近更新 更多