QT5學習 QStringListModel

huffscan發表於2017-09-27

QStringListModel是最簡單的模型類,具備向檢視提供字串資料的能力。QStringListModel是一個可編輯的模型,可以為元件提供一系列字串作為資料。我們可以將其看作是封裝了QStringList的模型。QStringList是一種很常用的資料型別,實際上是一個字串列表(也就是QList<QString>)。既然是列表,它也就是線性的資料結構,因此,QStringListModel很多時候都會作為QListView或者QComboBox這種只有一列的檢視元件的資料模型。

》.h檔案 

#pragma once
#include <QDialog>
#include <QStringListModel>
#include <QListView>
#include <QDialogButtonBox> 

class MyListView : public QDialog
{
Q_OBJECT
public:
MyListView(const QStringList &leaders, QWidget *parent = 0);
MyListView();
~MyListView();


private slots:

void insertData();
void showData();
void deleteData();
//bool insertRows(int row, int count, const QModelIndex &parent = QModelIndex());
private:
QStringListModel* model;
QListView* listView;
QDialogButtonBox *buttonBox;
};


》.cpp 檔案 

#include "MyListView.h"
#include <QVBoxLayout>
#include <QWidget>
#include <QPushButton>
#include <QDebug>
#include <QEvent> 
#include <QObject>
#include <QMessageBox>
#include <QInputDialog>

MyListView::MyListView(const QStringList &leaders, QWidget *parent)
: QDialog(parent)
{
model = new QStringListModel(this);
model->setStringList(leaders);


listView = new QListView;
listView->setModel(model);
listView->setEditTriggers(QAbstractItemView::AnyKeyPressed
| QAbstractItemView::DoubleClicked);

buttonBox = new QDialogButtonBox;

QPushButton *insertButton = buttonBox->addButton(
tr("&Insert"), QDialogButtonBox::ActionRole);
QPushButton *deleteButton = buttonBox->addButton(
tr("&Delete"), QDialogButtonBox::ActionRole);
QPushButton *showButton = buttonBox->addButton(
tr("&show"), QDialogButtonBox::ActionRole);

buttonBox->addButton(QDialogButtonBox::Ok);
buttonBox->addButton(QDialogButtonBox::Cancel);

connect(insertButton, SIGNAL(clicked()), this, SLOT(insert()));
connect(showButton, SIGNAL(clicked()), this, SLOT(showData()));  
connect(deleteButton, SIGNAL(clicked()), this, SLOT(del()));

connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept()));
connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject()));

QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(listView);
layout->addWidget(buttonBox);
setLayout(layout);

setWindowTitle(tr("QStringListModel"));
}


MyListView::MyListView()
{
QStringList data;
data << "Letter A" << "Letter B" << "Letter C";

model = new QStringListModel(this);
model->setStringList(data);

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

QHBoxLayout *btnLayout = new QHBoxLayout;
QPushButton *insertBtn = new QPushButton(tr("insert"), this);
connect(insertBtn, SIGNAL(clicked()), this, SLOT(insertData()));
QPushButton *delBtn = new QPushButton(tr("Delete"), this);
connect(delBtn, SIGNAL(clicked()), this, SLOT(deleteData()));
QPushButton *showBtn = new QPushButton(tr("Show"), this);
connect(showBtn, SIGNAL(clicked()), this, SLOT(showData()));
btnLayout->addWidget(insertBtn);
btnLayout->addWidget(delBtn);
btnLayout->addWidget(showBtn);

QVBoxLayout *mainLayout = new QVBoxLayout(this);
mainLayout->addWidget(listView);
mainLayout->addLayout(btnLayout);
setLayout(mainLayout);
}

MyListView::~MyListView()
{
}

void MyListView::insertData()
{
bool isOK;
QString text = QInputDialog::getText(this, "Insert",
"Please input new data:",
QLineEdit::Normal,
"You are inserting new data.",
&isOK);
if (isOK) {
int row = listView->currentIndex().row();
model->insertRows(row, 1);
QModelIndex index = model->index(row);
model->setData(index, text);
listView->setCurrentIndex(index);
listView->edit(index);
}


void MyListView::deleteData()
{
if (model->rowCount() > 1) {
model->removeRows(listView->currentIndex().row(), 1);
}


void MyListView::showData()
{
QStringList data = model->stringList();
QString str;
foreach(QString s, data) {
str += s + "\n";
}
QMessageBox::information(this, "Data", str);
}

首先是insertData()函式。我們使用QInputDialog::getText()函式要求使用者輸入資料。這是 Qt 的標準對話方塊,用於獲取使用者輸入的字串。這部分在前面的章節中已經講解過。當使用者點選了 OK 按鈕,我們使用listView->currentIndex()函式,獲取QListView當前行。這個函式的返回值是一個QModelIndex型別。我們會在後面的章節詳細講解這個類,現在只要知道這個類儲存了三個重要的資料:行索引、列索引以及該資料屬於哪一個模型。我們呼叫其row()函式獲得行索引,該返回值是一個 int,也就是當前是第幾行。然後我們向模型插入新的一行。insertRows()函式簽名如下:


使用模型的removeRows()函式可以輕鬆完成這個操作。這個函式同前面所說的insertRows()很類似,這裡不再贅述。需要注意的是,我們用rowCount()函式判斷了一下,要求最終始終保留 1 行。這是因為我們寫的簡單地插入操作所限制,如果把資料全部刪除,就不能再插入資料了。所以,前面所說的插入操作實際上還需要再詳細考慮才可以解決這一問題。


main 函式檔案 

int main(int argc, char *argv[])
{
QApplication   app(argc, argv);

QStringList list;
list << QObject::tr("hello")
<< QObject::tr("hello2")
<< QObject::tr("hello3")
<< QObject::tr("5")
<< QObject::tr("6");
// MyListView w(list);
MyListView w;
w.show();

return app.exec();
}

相關文章