Qt學習:項視圖類之QStringListModel和QListView


    QListView是不顯示表頭和表框的,如果要顯示,可以使用QTreeView來

    view的顯示屬性分為列表list顯示和icon圖標顯示,使用
    QListView::setViewMode()來設置,默認為list型的

    QListView::setModel ()用來設置view所關聯的model

    獲取view中當前的位置,QListView::currentIndex(),返回的是QModelIndex類型的
    設置當前行使用QListView::setCurrentIndex(QModelIndex),
    設置某行可以編輯,使用QListView::edit(QModelIndex)

    當某個QModelIndex被移動時候,信號indexesMoved(QModelIndexList)被發射
    當雙擊某項時候,信號doubleClicked(QModelIndex)被發射
    當大幾某項時候,信號clicked(QModelIndex)被發射

    QStringListModel就是封裝了QStringList的model。QStringList是一種很常用的數據類型,它實際上是一個字符串列表。我們可以想象,對於一個list來說,如果提供一個字符串列表形式的數據,就應該能夠把這個數據展示出來。因為二者是一致的:QStringList是線性的,而list也是線性的。所以,QStringListModel很多時候都會作為QListView的model。
    model使用insertRows,insertRow來添加多行或一行,使用setData()來設置該行的數據
    rowCount()用來獲改model的行數
    removeRows()和removeRow()用來刪除model中的一行或多行,詳見API手冊。 

    下邊給出例子,照例,我們先給出效果:

 

 

    整個例子用了一個QListView,一個QStirngListModel和一個QDialogButtonBox,構造函數接收一個存儲着QString的QStringList用來初始化QStringListModel,然后用QListView的setModel()函數把數據和model聯系起來。這里我們可以很清楚的看到MVC架構的各個部分是如何關聯起來的:QStringListModel是一組數據集,存儲的是一系列字符串數據;QListView是視圖類,是一個窗口部件,用來觀察這組數據;一些和它關聯的操作,我們統稱為控制(insert,delete等) 。下面給出代碼:

//teamleadersdialog.h
#ifndef TEAMLEADERSDIALOG_H
#define TEAMLEADERSDIALOG_H

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

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

private slots:
    void insert();
    void del();

private:
    QStringListModel *model;
    QListView *listView;
    QDialogButtonBox *buttonBox;
};

#endif // TEAMLEADERSDIALOG_H

//teamleadersdialog.cpp
#include <QPushButton>
#include <QVBoxLayout>

#include "teamleadersdialog.h"

TeamLeadersDialog::TeamLeadersDialog(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);
    buttonBox->addButton(QDialogButtonBox::Ok);
    buttonBox->addButton(QDialogButtonBox::Cancel);

    connect(insertButton, SIGNAL(clicked()), this, SLOT(insert()));
    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"));
}

void TeamLeadersDialog::insert()
{
    int row = listView->currentIndex().row();
    model->insertRows(row, 1);

    QModelIndex index = model->index(row);
    listView->setCurrentIndex(index);
    listView->edit(index);
}

void TeamLeadersDialog::del()
{
    model->removeRows(listView->currentIndex().row(), 1);
}

TeamLeadersDialog::~TeamLeadersDialog()
{   
}

//main.cpp
#include "teamleadersdialog.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QStringList list;
    list << QObject::tr("xianziyu")
         << QObject::tr("yangwangming")
         << QObject::tr("yinshixin")
         << QObject::tr("baichengshuang")
         << QObject::tr("zhangzurui");
    TeamLeadersDialog w(list);
    w.show();
    
    return a.exec();
}


 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM