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();
}