點擊上方藍字可直接關注!方便下次閱讀。如果對你有幫助,可以點個在看,讓它可以幫助到更多老鐵~
這篇文章是在高鐵上寫的。
這次繼續和大家分享Qt Model/View的一些使用方法。Qt幫助文檔的整體目錄如下:
一、設置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();
}
效果如下:
二、可編輯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);
}
效果如下:
三、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);
}
最後,學不可以已!