table设置可拉升_Qt ModelView教程——设置表头与可编辑Table

2bbcc6c4b7a037da17d7001c0cf92aa0.png

这篇文章是在高铁上写的。

这次继续和大家分享Qt Model/View的一些使用方法。Qt帮助文档的整体目录如下:

142eb2a481e2afee1563818801d355b8.png
  1. 设置Table的行和列表头

只需在只读表的基础上加上

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

并重新实现即可。

QVariant MyModel::headerData(int section, Qt::Orientation orientation, int role) const

{

if (role == Qt::DisplayRole)

{

if (orientation == Qt::Horizontal)

{

switch (section)

{

case 0:

return QString("first");

case 1:

return QString("second");

case 2:

return QString("third");

}

}

if (orientation == Qt::Vertical)

{

switch (section)

{

case 0:

return QString("first");

case 1:

return QString("second");

}

}

}

return QVariant();

}

效果如下:

56eee1c5ed1c784124289be24b4cba33.png
  1. 可编辑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);

}

效果如下:

fe5044d79dc0393d987013d54037d374.png

02b6a842c99b7dd0aeba019fcb423a8d.png
  1. 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);

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值