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

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用Qt中的QTableView和QSortFilterProxyModel实现多列筛选的例子: 首先,在Qt Creator中创建一个Qt Widgets应用程序,并添加一个QTableView,然后在MainWindow类的构造函数中添加以下代码: ```cpp QStandardItemModel *model = new QStandardItemModel(4, 2, this); // 创建模型 model->setHeaderData(0, Qt::Horizontal, tr("Name")); // 设置表头 model->setHeaderData(1, Qt::Horizontal, tr("Age")); for (int row = 0; row < 4; ++row) { for (int column = 0; column < 2; ++column) { QString data = QString("row %1, column %2").arg(row + 1).arg(column + 1); QStandardItem *item = new QStandardItem(data); // 创建Item model->setItem(row, column, item); // 将Item添加到模型中 } } QSortFilterProxyModel *proxyModel = new QSortFilterProxyModel(this); // 创建代理模型 proxyModel->setSourceModel(model); // 设置源模型 ui->tableView->setModel(proxyModel); // 将代理模型设置TableView的模型 ``` 以上代码创建了一个包含两列的表格,每列有四行数据,然后将QStandardItemModel和QSortFilterProxyModelQTableView关联。接下来,我们需要添加多列筛选功能。 在MainWindow类中添加以下槽函数: ```cpp void MainWindow::on_filterLineEdit_textChanged(const QString &text) { QRegExp regExp(text, Qt::CaseInsensitive, QRegExp::FixedString); // 创建正则表达式 QSortFilterProxyModel *proxyModel = qobject_cast<QSortFilterProxyModel*>(ui->tableView->model()); // 获取代理模型 proxyModel->setFilterRegExp(regExp); // 设置筛选条件 } ``` 该槽函数会在QLineEdit中输入文本时被调用,我们可以在其中获取输入的文本,创建一个正则表达式,并将其设置为筛选条件。接下来,我们需要在UI中添加一个QLineEdit,并将其与该槽函数关联。在MainWindow类的构造函数中添加以下代码: ```cpp connect(ui->filterLineEdit, &QLineEdit::textChanged, this, &MainWindow::on_filterLineEdit_textChanged); ``` 现在,我们可以在UI中看到一个QLineEdit,输入文本后,表格中的数据将会按照多列筛选的条件进行过滤。例如,我们可以输入“row 1”来过滤出包含“row 1”的行。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值