开发修理登记软件时,需要在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();