QTableView 例四(基于 QSqlTableModel)

22 篇文章 2 订阅

1、 checkbox 代理

将checkbox处理成单选的效果

#ifndef CHECKBOXDELEGATE_H
#define CHECKBOXDELEGATE_H
#include <QStyledItemDelegate>
#include <QCheckBox>
class CheckBoxDelegate : public QStyledItemDelegate
{
    Q_OBJECT
public:
    CheckBoxDelegate(QObject *parent = NULL);
      ~CheckBoxDelegate();
public:
    void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;
    bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index);
signals:
    void signalClicked(const QModelIndex &index);
};
#endif // CHECKBOXDELEGATE_H
#include "my-checkboxdelegate.h"
#include <QApplication>
#include <QMouseEvent>
#include <QDebug>

//只处理第五列
#define CHECK_BOX_COLUMN 5

CheckBoxDelegate::CheckBoxDelegate(QObject *parent)
    : QStyledItemDelegate(parent)
{

}

CheckBoxDelegate::~CheckBoxDelegate()
{

}
// 绘制复选框
void CheckBoxDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    QStyleOptionViewItem viewOption(option);
    initStyleOption(&viewOption, index);
    if (option.state.testFlag(QStyle::State_HasFocus))
        viewOption.state = viewOption.state ^ QStyle::State_HasFocus;

    QStyledItemDelegate::paint(painter, viewOption, index);

    if (index.column() == CHECK_BOX_COLUMN)
    {
        QString data = index.model()->data(index).toString();

        QStyleOptionButton checkBoxStyle;
        checkBoxStyle.state = data.toUInt()== 1 ? QStyle::State_On : QStyle::State_Off;
        checkBoxStyle.state |= QStyle::State_Enabled;
        checkBoxStyle.iconSize = QSize(20, 20);
        checkBoxStyle.rect = option.rect;

        // 画checkbox
        QCheckBox checkBox;
        QApplication::style()->drawPrimitive(QStyle::PE_IndicatorCheckBox, &checkBoxStyle, painter, &checkBox);
    }
}
// 响应鼠标事件,更新数据
bool CheckBoxDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)
{
    QRect decorationRect = option.rect;
    QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);
    if (event->type() == QEvent::MouseButtonPress && decorationRect.contains(mouseEvent->pos()))
    {
        if (index.column() == CHECK_BOX_COLUMN)
        {
            int data = model->data(index).toString().toUInt();
            QString other;
            // 互斥处理 ,处理成单选的功能 
            if(data == 1)
            {
                model->setData(index,QString("0"));
                other = QString("1");
            }
            else
            {
                model->setData(index, QString("1"));

                other = QString("0");
                int row = index.row();

                for(int i  =0 ; i< model->rowCount();i++)
                {
                    if(i != row)
                    {
                        QModelIndex temp = model->index(i,CHECK_BOX_COLUMN);
                        model->setData(temp,other);
                    }
                }
                emit signalClicked(index);
            }
        }
    }
    return QStyledItemDelegate::editorEvent(event, model, option, index);
}

2、SqlTable 继承

让显示居中

#include <QtSql>
#include <QModelIndex>
#include "my-editablesqlmodel.h"
EditableSqlModel::EditableSqlModel(QObject *parent, QSqlDatabase db)
    : QSqlTableModel(parent,db)
{
}

QVariant EditableSqlModel::data(const QModelIndex & index, int role) const
{
    QVariant value  = QSqlTableModel::data(index,role);
    if(role == Qt::TextAlignmentRole)
    {
        value = Qt::AlignCenter; // 居中显示
        return value;
    }
    return value;
}

3、 Tableview

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "my-checkboxdelegate.h"
#include "my-editablesqlmodel.h"

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void on_pushButton_3_clicked();

    void on_pushButton_2_clicked();

    void on_pushButton_clicked();

    void on_comboBox_home_currentTextChanged(const QString &arg1);

    void on_comboBox_dep_currentTextChanged(const QString &arg1);

    void on_pushButton_4_clicked();

private:
    Ui::MainWindow *ui;

    EditableSqlModel *model;
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QApplication>
#include <QSqlTableModel>
#include <QTableView>
#include <QDebug>
#include <QMessageBox>
#include <QSqlQuery>
#include <QComboBox>
#include <QHeaderView>
#include <QObject>
#include <QSqlRecord>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QSqlDatabase database = QSqlDatabase::addDatabase("QSQLITE");
    database.setDatabaseName("./tableview-deom.db");
    if(database.open())
    {
        qDebug()<<"open db";
    }
    else
    {
        QMessageBox msgBox;
        msgBox.setText("db open failed.");
        msgBox.exec();
    }

    ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
    ui->tableView->setSelectionMode(QAbstractItemView::SelectionMode::MultiSelection);
    ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
	ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);//根据内容调整列宽度
    model = new EditableSqlModel(this,database);
    model->setTable("user");
    model->setEditStrategy(QSqlTableModel::OnManualSubmit);
    model->select();
    model->setHeaderData(0, Qt::Horizontal, QObject::tr("ID_hiden"));
    model->setHeaderData(1, Qt::Horizontal, QObject::tr("用户名"));
    model->setHeaderData(2, Qt::Horizontal, QObject::tr("电话号码"));
    model->setHeaderData(3, Qt::Horizontal, QObject::tr("PW_hiden"));
    model->setHeaderData(4, Qt::Horizontal, QObject::tr("家乡"));
    model->setHeaderData(5, Qt::Horizontal, QObject::tr("默认用户"));
    model->setHeaderData(6, Qt::Horizontal, QObject::tr("部门"));

    ui->tableView->setModel(model);

    ui->tableView->horizontalHeader()->setStyleSheet("QHeaderView::section {"
                                                           "color: black;padding-left: 4px;border: 1px solid #6c6c6c;}");
    ui->tableView->verticalHeader()->setStyleSheet("QHeaderView::section {"
                                                           "color: black;padding-left: 4px;border: 1px solid #6c6c6c;}");

    ui->tableView->verticalHeader()->setDefaultSectionSize(60);
    ui->tableView->horizontalHeader()->setDefaultSectionSize(30);
    ui->tableView->horizontalHeader()->setStretchLastSection(true);

    ui->tableView->setColumnWidth(0,10);
    ui->tableView->setColumnWidth(1,150);
    ui->tableView->setColumnWidth(2,200);
    ui->tableView->setColumnWidth(3,10);
    ui->tableView->setColumnWidth(4,120);
    ui->tableView->setColumnWidth(5,80);
    ui->tableView->setColumnWidth(6,200);

    ui->tableView->setColumnHidden(0,true);
    ui->tableView->setColumnHidden(3,true);

    CheckBoxDelegate *checkboxdelegate = new CheckBoxDelegate;
    ui->tableView->setItemDelegate(checkboxdelegate);

    QObject::connect(checkboxdelegate,&CheckBoxDelegate::signalClicked,this ,[this](QModelIndex index){
        bool ok ;
        ui->tableView->model()->index(index.row(),5).data().toUInt(&ok);
        qDebug()<<"第 "<<index.row()+1<<"行"<<"被选中";

        QAbstractItemModel *models  = ui->tableView->model();
        QSqlTableModel* sqlmodel = qobject_cast<QSqlTableModel*>(models);

        if(sqlmodel)
        {
            sqlmodel->submitAll();
            sqlmodel->select();
        }
    });

    int row = model->rowCount();
    QSet<QString> hometowm;
    QSet<QString> department;
    for(int i = 0;i <row; i++)
    {
        QModelIndex index1 = model->index(i,4);
        QModelIndex index2 = model->index(i,6);
        hometowm<<index1.data().toString();
        department<<index2.data().toString();
    }

    QStringList list1 = hometowm.toList();
    list1.prepend(QString(" "));
    ui->comboBox_home->addItems(list1);

    QStringList list2 = department.toList();
    list2.prepend(QString(" "));
    ui->comboBox_dep->addItems(list2);

}

MainWindow::~MainWindow()
{
    delete ui;
}

//add
void MainWindow::on_pushButton_3_clicked()
{
    QAbstractItemModel *models  = ui->tableView->model();
    QSqlTableModel* sqlmodel = qobject_cast<QSqlTableModel*>(models);

    QSqlRecord record  =  sqlmodel->record();
    record.setValue(1,"Jrodan");
    record.setValue(2,"13022324455");
    record.setValue(3,"123321");
    record.setValue(4,"USA");
    record.setValue(5,0);
    record.setValue(6,"Sport");
    sqlmodel->insertRecord(sqlmodel->rowCount(), record);
    sqlmodel->submitAll();
    sqlmodel->select();
}

//update
void MainWindow::on_pushButton_2_clicked()
{
    QAbstractItemModel *models  = ui->tableView->model();
    QSqlTableModel* sqlmodel = qobject_cast<QSqlTableModel*>(models);

    int row = 2;
    QSqlRecord record  = sqlmodel->record(row);

    record.setValue("Name",record.value("Name").toString()+"add");


    sqlmodel->setRecord(row,record);

    sqlmodel->submitAll();
    sqlmodel->select();

}

//delete 选中的
void MainWindow::on_pushButton_clicked()
{
    QItemSelectionModel *selections =  ui->tableView->selectionModel();
    QModelIndexList selected = selections->selectedIndexes();

    QSet<int> rowset;
    for (QModelIndex index: selected)
    {
        if(index.column() == 0)
        {
            rowset<<index.row();
        }
    }

    QAbstractItemModel *models  = ui->tableView->model();
    QSqlTableModel* sqlmodel = qobject_cast<QSqlTableModel*>(models);

    for(int row: rowset)
    {
         sqlmodel->removeRow(row);
    }

     sqlmodel->submitAll();
     sqlmodel->select();
}

//筛选家乡
void MainWindow::on_comboBox_home_currentTextChanged(const QString &txt)
{
    if(txt == QString(" ")) return;
    QAbstractItemModel *models  = ui->tableView->model();
    QSqlTableModel* sqlmodel = qobject_cast<QSqlTableModel*>(models);
    QString sql = QString("Home='%1'").arg(txt);
    sqlmodel->setFilter(sql);
    sqlmodel->select();
}
//筛选部门
void MainWindow::on_comboBox_dep_currentTextChanged(const QString &txt)
{
    if(txt == QString(" ")) return;
    QAbstractItemModel *models  = ui->tableView->model();
    QSqlTableModel* sqlmodel = qobject_cast<QSqlTableModel*>(models);

    QString sql = QString("Department='%1'").arg(txt);

    sqlmodel->setFilter(sql);
    sqlmodel->select();
}


// display all
void MainWindow::on_pushButton_4_clicked()
{
    QAbstractItemModel *models  = ui->tableView->model();
    QSqlTableModel* sqlmodel = qobject_cast<QSqlTableModel*>(models);

    sqlmodel->setFilter("");
    sqlmodel->select();
}

4、 显示

在这里插入图片描述

5、工程

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值