QTableView常用功能总结
前言
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设置背景色。
功能都很常用,以后还会不断添加新的功能点。