qtableview 实现筛选功能 model为QSqlTableModel

开发修理登记软件时,需要在tableview中的表头实现筛选功能
代码如下:
第一步重写 QHeaderView,网上有一种方法也是重写,然后在paintSection函数中指定位置大小,非常方便,不需要跟着状态进行改变。但是不能根据列数进行创建。
因为在创建之前不清楚总共有多少列,找了一个折中的办法,就是创建时指定有多少列,也存在一个问题,tableView中列数可以配置,程序初建了一个最多的,当列数减少之后,多余的隐藏,同时在改变大小等情况下,都需要重新指定筛选按钮的位置。

#include <QWidget>
#include <QSqlTableModel>
#include <QSqlQuery>
#include "databaseconnection.h"   //连接数据库文件
#include <QtDebug>

#include <QMenu>
#include <QMessageBox>

#include <QHeaderView>
#include <QComboBox>
#include <QCheckBox>
#include <QPushButton>

#include "dialog_shaix.h"  //筛选界面



class CustomHeaderView:public QHeaderView
{
    Q_OBJECT

public:
    // 默认水平方向
    CustomHeaderView(Qt::Orientation ori = Qt::Horizontal, QWidget*parent = 0,int i=1);
    int number=1;
    //自定义头部,主要实现这个函数
    //protected:
    // void paintSection(QPainter *painter, const QRect &rect, int logicalIndex) const;
    void paintSection(QPainter *painter, const QRect &rect, int logicalIndex) const;
    //QPushButton *pt;

public slots:
    void slt_checkbox_click();
    void slt_combox_item_click(QString);
    void chuandicanshu();  //创建筛选按钮

private:


signals:
    void send_point(QPoint);  //发送按钮所在的第几列

};

.cpp文件:


CustomHeaderView::CustomHeaderView(Qt::Orientation ori, QWidget *parent,int i)
    :QHeaderView(ori,parent)
{
    //m_checkbox = new QCheckBox(this);
   // m_combox = new QComboBox(this);
    //pt = new QPushButton(this);
   // m_combox->addItem("item1");
    //m_combox->addItem("item2");

  // pt = new QPushButton(this);
   QIcon icon(":/image/play.png");

   for (int k=0;k<i;k++) {
       QPushButton *bt = new QPushButton(this);
       bt->setIcon(icon);
       connect(bt,SIGNAL(clicked()),this, SLOT(slt_checkbox_click()));
   }

// connect(pt,SIGNAL(clicked()),this, SLOT(slt_checkbox_click()));
    number=i;
   // connect(m_combox, SIGNAL(currentIndexChanged(QString)),this,SLOT(slt_combox_item_click(QString)));
   // qDebug()<<"当前数量"<<this->count()<<i;


}

void CustomHeaderView::paintSection(QPainter *painter, const QRect &rect, int logicalIndex) const
{
    QHeaderView::paintSection(painter,rect,logicalIndex);

    //QRect rect(this->sectionPosition(j),0,this->sectionSize(j),this->sectionSizeFromContents(j).height());
   // this->
}

void CustomHeaderView::slt_checkbox_click()
{
   //按钮按下的反应
   QPushButton *pt=  qobject_cast<QPushButton *>(sender());//得到发送的按钮
  // qDebug()<<pt->geometry()<<pt->parent()<<pt->pos();
  // qDebug()<<this->model()->data(this->model()->index(0,0));
   QPoint point = pt->pos()+QPoint(0, 50);;
   //qDebug()<<this->indexAt().data();
   emit send_point(point);
}

void CustomHeaderView::slt_combox_item_click(QString itemstr)
{
  //  qDebug() << "slt_combox_item_click" << itemstr;
    //此处可以自定义信号
}

void CustomHeaderView::chuandicanshu()
{
    //qDebug()<<this->number<<this->count();
    QList<QPushButton *> bt = this->findChildren<QPushButton *>();
    for (int j=0;j<this->number;j++) {

        QRect rect(this->sectionPosition(j),0,this->sectionSize(j),this->sectionSizeFromContents(j).height());
        QRect tmp;
        tmp.setSize(QSize(30,32));

        tmp.moveTopRight(rect.topRight());
        if(j<this->count()){
           bt.at(j)->setGeometry(tmp);  //多出来的要隐藏
           bt.at(j)->show();  //多出来的要隐藏
        }
        else
        {
            bt.at(j)->hide();//将多出来的隐藏
        }
    }

    //  pt->setGeometry(tmp);
}

里边实现了通过按下的位置找到当前列,

    //qDebug()<<"得到列数"<< ui->tableView->indexAt(point).column();
    //dialog_shaix->setGeometry(point.x(),point.y(),dialog_shaix->size());
    dialog_shaix->show();
    dialog_shaix->raise();
    // qDebug()<<"得到列数2"<< ui->tableView->indexAt(point).column()
      //       <<info_model->headerData(ui->tableView->indexAt(point).column(),Qt::Horizontal);
     QString head_name = info_model->headerData(ui->tableView->indexAt(point).column(),Qt::Horizontal).toString();
     dialog_shaix->get_name(head_name);//调用该函数得到单机按钮所在列的列明,重新初始化类
     // qDebug()<<i<<ui->Page1_tableView->model()->headerData(i,Qt::Horizontal).toString();
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_45247650

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值