Qt ModelView教程——設置表頭與可編輯Table

點擊上方藍字可直接關注!方便下次閱讀。如果對你有幫助,可以點個在看,讓它可以幫助到更多老鐵~

這篇文章是在高鐵上寫的。

 

這次繼續和大家分享Qt Model/View的一些使用方法。Qt幫助文檔的整體目錄如下:

format,png

一、設置Table的行和列表頭

 

只需在只讀表的基礎上加上

QVariant headerData(int p, Qt::Orientation orientation, int role) const Q_DECL_OVERRIDE;

並重新實現即可。

QVariant MyModel::headerData(int p, Qt::Orientation orientation, int role) const
{
    if (role == Qt::DisplayRole)
    {
        if (orientation == Qt::Horizontal)
        {
            switch (p)
            {
            case 0:
                return QString("first");
            case 1:
                return QString("second");
            case 2:
                return QString("third");
            }
        }


        if (orientation == Qt::Vertical)
        {
            switch (p)
            {
            case 0:
                return QString("first");
            case 1:
                return QString("second");
            }
        }
    }


    return QVariant();
}

效果如下:

format,png

二、可編輯Table的實現

 

爲了讓之前只讀表具備可編輯的功能,需要重新實現兩個虛方法setData() and flags()

 

使用一個QString類型的二維數組來存儲數據,並且當編輯完單元格內容時,向window title 發送文本信息,使得window title 隨着單元格內容改變而改變。

#include <QAbstractTableModel>
#include <QString>


const int COLS= 3;
const int ROWS= 2;




class MyModel : public QAbstractTableModel
{
    Q_OBJECT
public:
    MyModel(QObject *parent);
    int rowCount(const QModelIndex &parent = QModelIndex()) const Q_DECL_OVERRIDE ;
    int columnCount(const QModelIndex &parent = QModelIndex()) const Q_DECL_OVERRIDE;
    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const Q_DECL_OVERRIDE;


    bool setData(const QModelIndex & index, const QVariant & value, int role = Qt::EditRole) Q_DECL_OVERRIDE;
    Qt::ItemFlags flags(const QModelIndex & index) const Q_DECL_OVERRIDE ;


private:
    QString m_gridData[ROWS][COLS];  //holds text entered into QTableView
signals:
    void editCompleted(const QString &);
};

每次編輯單元格的時候setData()就會被調用。index參數會告訴我們具體哪個單元格被編輯、value參數可以讓我們獲得單元格內具體的內容

bool MyModel::setData(const QModelIndex & index, const QVariant & value, int role)
{
    if (role == Qt::EditRole)
    {
        //save value from editor to member m_gridData
        m_gridData[index.row()][index.column()] = value.toString();
        //for presentation purposes only: build and emit a joined string
        QString result;
        for (int row= 0; row < ROWS; row++)
        {
            for(int col= 0; col < COLS; col++)
            {
                result += m_gridData[row][col] + " ";
            }
        }


        emit editCompleted( result );
    }
    return true;
}

各種屬性在flags()函數中調整。這兩個屬性Qt::ItemIsSelectable | Qt::ItemIsEditable足夠我們這次使用了。

Qt::ItemFlags MyModel::flags(const QModelIndex &index) const
{
    qDebug() << index.row() << index.column();


    return Qt::ItemIsEditable | QAbstractTableModel::flags(index);


}

效果如下:

format,png

format,png

三、MainWindow中的設置

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    tableView = new QTableView(this);
    setCentralWidget(tableView);
    QAbstractTableModel *myModel = new MyModel(this);
    tableView->setModel(myModel);


    //transfer changes to the model to the window title
    connect(myModel, SIGNAL(editCompleted(const QString &)), this, SLOT(setWindowTitle(const QString &)));
}


void MainWindow::showWindowTitle(const QString & title)
{
setWindowTitle(title);
}

最後,學不可以已!

format,png

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章