QTableView 常用功能总结

5 篇文章 1 订阅


前言

        QTableView是最常用的控件之一,最近也用得比较多,这里主要是总结一下最常用的一些功能,主要包括插入、对齐、代理、移动、删除及右键菜单等基本功能。写博客的目的,也是做个记录,以后忘记了,可以回来复习,可以快速重新掌握,没有必要再从头开始,查找各种资料,费时费力。本博文只是实现了最基础的一些功能,把这些功能汇总,实现的界面如下:

在这里插入图片描述

一、QTableView和QStandardItemModel常用用法

1、插入表头

	student_table_model = new QStandardItemModel(this);
    QStringList table_header;
    table_header << tr("姓名") << tr("性别") << tr("年龄") << tr("备注");
    student_table_model->setHorizontalHeaderLabels(table_header);

2、QTableView基本设置

    //选中整行
    ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
    //只选一行
    ui->tableView->setSelectionMode(QAbstractItemView::SingleSelection);
    //拉伸最后一列
    ui->tableView->horizontalHeader()->setStretchLastSection(true);
    //可弹出右键菜单
    ui->tableView->setContextMenuPolicy(Qt::CustomContextMenu);
    //设置model
    ui->tableView->setModel(student_table_model);
    //设置代理
    ComboBoxDelegate* combo_box_delegate = new ComboBoxDelegate(this);
    ui->tableView->setItemDelegateForColumn(1, combo_box_delegate);

3、右键菜单的使用

    student_table_menu = new QMenu(this);
    student_table_menu->addAction(tr("上移"), this, SLOT(move_up()));
    student_table_menu->addAction(tr("下移"), this, SLOT(move_down()));
    student_table_menu->addAction(tr("删除"), this, SLOT(delete_one_row()));

    connect(ui->tableView, SIGNAL(customContextMenuRequested(QPoint)), this,     SLOT(on_right_button_memu(QPoint)));

4、QStandardItemModel插入行

设置单元格不可编辑、设置文本对齐方式、设置单元格背景色

for (int i = 0; i < 10; ++i) {
        int col = 0;
        student_table_model->setItem(i, col++, new QStandardItem(QString("student_%1").arg(i)));
        student_table_model->setItem(i, col++, new QStandardItem(i%2 == 0 ? tr("男") : tr("女")));
        student_table_model->setItem(i, col++, new QStandardItem(i%2 == 0 ? tr("6") : tr("5")));
        student_table_model->setItem(i, col++, new QStandardItem(""));

        //不可编辑
        student_table_model->item(i, 0)->setEditable(false);
        //居中对齐
        student_table_model->item(i, 0)->setTextAlignment(Qt::AlignCenter);
        student_table_model->item(i, 1)->setTextAlignment(Qt::AlignCenter);
        student_table_model->item(i, 2)->setTextAlignment(Qt::AlignCenter);
		//背景色
		student_table_model->item(i, 0)->setBackground(QBrush(QColor(0,0XFF,0)));
    }

5、QStandardItem的移动和删除

上移一行:

void MainWindow::move_up() {
    if (current_row > 0) {
        QList<QStandardItem*> row_items = student_table_model->takeRow(current_row);
        student_table_model->insertRow(current_row-1, row_items);
        ui->tableView->setCurrentIndex(student_table_model->index(current_row-1, 0));
    }
}

下移一行:

void MainWindow::move_down() {
    if (current_row < student_table_model->rowCount() - 1) {
        QList<QStandardItem*> row_items = student_table_model->takeRow(current_row);
        student_table_model->insertRow(current_row+1, row_items);
        ui->tableView->setCurrentIndex(student_table_model->index(current_row+1, 0));
    }
}

删除一行:

void MainWindow::delete_one_row() {
    student_table_model->removeRow(current_row);
}

6、弹出右键菜单的响应函数

void MainWindow::on_right_button_memu(const QPoint &pos) {
    QModelIndex current_index = ui->tableView->currentIndex();
    if (current_index.isValid()) {
        current_row = current_index.row();
        student_table_menu->exec(QCursor::pos());
    }
}

二、QComboBox代理实现

1.代理定义

自定义的控件代理须实现以下四个虚函数:
createEditor
setEditorData
setModelData
updateEditorGeometry

#include <qwidget.h>
#include <QComboBox>

#include <QStyledItemDelegate>

class ComboBoxDelegate : public QStyledItemDelegate
{
   Q_OBJECT


public:
    ComboBoxDelegate(QObject *parent = 0);

    QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;
    void setEditorData(QWidget *editor, const QModelIndex &index) const;
    void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;
    void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const;
};

2.代理实现

ComboBoxDelegate::ComboBoxDelegate(QObject *parent)
    : QStyledItemDelegate(parent) {
}

QWidget* ComboBoxDelegate::createEditor(QWidget *parent,  const QStyleOptionViewItem &option,
                                         const  QModelIndex &index)  const {
    Q_UNUSED(option);
    Q_UNUSED(index);

    QComboBox *editor =  new QComboBox(parent);
    editor->addItem(tr("男"));
    editor->addItem(tr("女"));
    editor->setCurrentIndex(0);

    return  editor;
}

void  ComboBoxDelegate::setEditorData(QWidget *editor,  const  QModelIndex &index)  const {
    QString text = index.model()->data(index, Qt::EditRole).toString();
    QComboBox *comboBox =  static_cast <QComboBox*>(editor);
    int  text_index = comboBox->findText(text);
    comboBox->setCurrentIndex(text_index);
}

void  ComboBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
                                      const  QModelIndex &index)  const {
    QComboBox *comboBox = static_cast<QComboBox*>(editor);
    QString text = comboBox->currentText();
    model->setData(index, text, Qt::EditRole);
}

void  ComboBoxDelegate::updateEditorGeometry(QWidget *editor,
                                              const  QStyleOptionViewItem &option,  const  QModelIndex &index) const {
    Q_UNUSED(index);
    editor->setGeometry(option.rect);
}

总结

        最近使用的qtableview确实比较多,每次编写代码,总是去翻看旧代码,有时候为了找一个功能,要找好几个工程的源码,或者上网查找各种资料,觉得非常浪费时间,所以,决定把常用的功能记录下来,写到这篇博客里,说不定以后需要了,可以直接过来复用代码。这里的代码以后还会不断更新,不断完善。
        这里实现的功能汇总:
1、qtableview插入一行;
2、qtableview设置文本对齐;
3、qtableview设置单元格是否可以编辑;
4、qtableview右键菜单的实现;
5、qtableview使用代理;
6、qcombobox代理的实现;
7、qtableview移动:向上移动一行、向下移动一行;
8、qtableview删除一行;
9、qtableview选择整行、只选一行;
10、qtableview最后一列自动伸缩。
11、qtableview设置背景色。
功能都很常用,以后还会不断添加新的功能点。
  • 3
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值