QT5學習 QStringListModel
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();
}
相關文章
- QT5學習 QFileSystemModelQT
- QT學習(1):QT5 7+VS2013開發環境搭建QT開發環境
- qt5亂碼QT
- QT5容器遍歷QT
- QT5中如何使用SQLiteQTSQLite
- QT5中引入GMSSL庫QT
- 樹莓派安裝QT5樹莓派QT
- GO QT5 水平垂直佈局GoQT
- Qt5:視窗居中顯示QT
- Qt5 中常用的模組列表:QT
- 《Qt5:訊號和槽使用示例》QT
- 學習學習再學習
- Qt5的訊號和槽函式QT函式
- 深度學習——學習目錄——學習中……深度學習
- Qt5雙緩衝機制與例項QT
- 深度學習(一)深度學習學習資料深度學習
- 深度學習學習框架深度學習框架
- 強化學習-學習筆記3 | 策略學習強化學習筆記
- 學習產品快報09 | “CSDN學習”:增加學習提醒,提示學習不忘記
- 【強化學習】強化學習/增強學習/再勵學習介紹強化學習
- 學習ThinkPHP,學習OneThinkPHP
- 前端學習之Bootstrap學習前端boot
- 學而習之,成就學習
- 前端週刊第62期:學習學習再學習前端
- 深度學習+深度強化學習+遷移學習【研修】深度學習強化學習遷移學習
- 強化學習-學習筆記2 | 價值學習強化學習筆記
- 單例模式入門講解C++和Qt5單例模式C++QT
- Golang 學習——interface 介面學習(一)Golang
- Golang 學習——interface 介面學習(二)Golang
- 深度學習學習7步驟深度學習
- 《JAVA學習指南》學習筆記Java筆記
- Go學習【二】學習資料Go
- java學習之道 --- 如何學習java?Java
- 免殺學習-基礎學習
- 強化學習10——迭代學習強化學習
- 程式設計學習MarkDown學習程式設計
- this學習
- 學習