29、QStringListModel 和 QListView---------Model/View模型视图

QStringListModel 和 QListView

QStringListModel 是处理字符串列表的模型类,其实例可以作为 QListView 组件的数据模型。 结合使用这两个类,就可以在界面上显示和编辑字符串列表, 使用需包含<QStringListModel>和<QListView>

效果如下图

思路

我们点击AddItem,会弹出提示框提示用户输入,然后将输入的内容插入到listview中。

弹出提示框可以用QInputDialog的静态函数getText

cpp 复制代码
static QString getText(QWidget *parent, const QString &title, const QString &label,
                           QLineEdit::EchoMode echo = QLineEdit::Normal,
                           const QString &text = QString(), bool *ok = nullptr,
                           Qt::WindowFlags flags = Qt::WindowFlags(),
                           Qt::InputMethodHints inputMethodHints = Qt::ImhNone);

parent表示创建的提示框的父窗口

title表示提示框的标题

label表示提示框显示的内容

echo时提示框输入模式,用默认的就好

ok为true表示点击确认,否则表示取消

后面flags和inputMethodHints表示模式,用默认的就好。

点击删除Remove Item按钮,会判断当前项是否有效,有效则删除

同学们先看我完成这个案例后自己重做一遍,作为理解。

开发讲解

1 添加一个StringListView类,继承自QWidget

cpp 复制代码
class StringListView : public QWidget
{
    Q_OBJECT
public:
    explicit StringListView(QWidget *parent = nullptr);

signals:

public slots:
};

2 StringListView类新增私有成员model和view, 并且添加增加和删减条目的槽函数

cpp 复制代码
public slots:
    void addItem();
    void removeItem();
private:
    QStringListModel * model;
    QListView * listView;

3 实现StringListView的构造函数,通过布局管理列表显示和按钮,链接按钮点击信号实现增删条目的逻辑

cpp 复制代码
StringListView::StringListView(QWidget *parent) : QWidget(parent)
{
    // 创建 QStringListModel
    model = new QStringListModel(this);
    QStringList stringList;
    stringList << "Item 1" << "Item 2" << "Item 3";
    model->setStringList(stringList);

    // 创建 QListView
    listView = new QListView(this);
    listView->setModel(model);

    // 创建添加和删除按钮
    QPushButton *addButton = new QPushButton("Add Item", this);
    QPushButton *removeButton = new QPushButton("Remove Item", this);

    // 连接信号和槽
    connect(addButton, &QPushButton::clicked, this, &StringListView::addItem);
    connect(removeButton, &QPushButton::clicked, this, &StringListView::removeItem);

    // 布局
    QVBoxLayout *layout = new QVBoxLayout(this);
    layout->addWidget(listView);
    layout->addWidget(addButton);
    layout->addWidget(removeButton);
    setLayout(layout);
}

4 添加条目和删除条目逻辑

cpp 复制代码
//添加条目
void StringListView::addItem()
{
    bool ok;
    //弹出一个输入框,接受用户输入
    QString text = QInputDialog::getText(this, tr("Add Item"),
                                          tr("Item name:"), QLineEdit::Normal,
                                          "", &ok);
    //判断文本是否为空,不为空则更新列表
    if (ok && !text.isEmpty()) {
        QStringList currentList = model->stringList();
        currentList << text; // 添加新项
        model->setStringList(currentList); // 更新模型
    }
}

//删除item
void StringListView::removeItem()
{
    //根据当前索引,删除当前项
    QModelIndex index = listView->currentIndex();
    if (index.isValid()) {
        QStringList currentList = model->stringList();
             currentList.removeAt(index.row()); // 移除选中项
              model->setStringList(currentList); // 更新模型
    }
}

在main.cpp中添加listview的展示

cpp 复制代码
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    StringListView listview;
    listview.show();

    return a.exec();
}
相关推荐
Liuchang09111 小时前
洛谷 P2670 [NOIP 2015 普及组] 扫雷游戏
c++·算法·游戏
扶尔魔ocy1 小时前
【qt openGL入门笔记】坐标系统和摄像机
qt·opengl
顶点多余1 小时前
C/C++常见面试题
开发语言·c++
HugoStudio_SWAN1 小时前
洛谷 B4575 [GESP202609 二级] 直角三角形——临场定义理解与边界质疑
c++·学习·程序人生·算法
(Charon)2 小时前
【C++面试】右值引用与移动语义:std::move到底做了什么
开发语言·c++
红豆诗人2 小时前
C++二叉搜索树:查找、插入和删除为什么这样写
数据结构·c++·算法
夏天的清晨2 小时前
C++入门学习
开发语言·c++·学习
汉克老师2 小时前
GESP2026年9月认证C++七级( 第二部分判断题(1~10题)精讲
c++·gesp·小学生·学c++编程
Dream it possible!2 小时前
蓝桥杯_翻转_C++
c++·算法·蓝桥杯
牵猫散步的鱼儿2 小时前
C 和 C++ 区别
c++