📄 tableviewfilter.cpp
字号:
#include <QtSql>
#include <QtDebug>
#include "tableviewfilter.h"
#include "tableview.h"
SpreadSheetDelegate::SpreadSheetDelegate(QObject *parent)
: QItemDelegate(parent)
{
}
/*
功能:将QSqlTableModel里的数据全部读入mapValue中,按列存放
*/
void SpreadSheetDelegate::readValue()
{
QMap <QString,int> map;
TableView *tv=qobject_cast<TableView *>(parentWidget);
mapValue.clear();
for(int i=0;i<globalModel->record().count();i++)
{
if(tv && tv->isPasswordColumn(globalModel->record().field(i).name()))
{
QStringList list;
mapValue.insert(i,list);
}
else{
map.clear();
for(int j=0;j<globalModel->rowCount();j++)
{
QString str=globalModel->data(globalModel->index(j,i)).toString();
//qDebug()<<i<<j<<str;
if(str.length())
{
map.insert(str,0);
}
}
mapValue.insert(i,map.keys());
}
}
}
QWidget *SpreadSheetDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem&,
const QModelIndex &index) const
{
QComboBox *editor = new QComboBox(parent);
if(globalModel && editor)
{
editor->addItem("(全部)","");
editor->addItem("(空值)","is null");
editor->addItem("(非空值)","is not null");
QStringList list=mapValue.value(index.column());
foreach(QString str,list)
{
editor->addItem(str,str);
}
}
connect(editor, SIGNAL(currentIndexChanged ( const QString &)), this, SLOT(commitAndCloseEditor( const QString &)));
return editor;
}
void SpreadSheetDelegate::commitAndCloseEditor( const QString &)
{
QLineEdit *editor = qobject_cast<QLineEdit *>(sender());
emit commitData(editor);
emit closeEditor(editor);
}
void SpreadSheetDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
QComboBox *edit = qobject_cast<QComboBox *>(editor);
if (edit)
{
int i=edit->findText(index.model()->data(index, Qt::EditRole).toString());
edit->setCurrentIndex(i);
}
}
void SpreadSheetDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
const QModelIndex &index) const
{
QComboBox *edit = qobject_cast<QComboBox *>(editor);
if (edit)
{
model->setData(index, edit->currentText());
}
}
TableViewFilter::TableViewFilter(QWidget *parent ,QSqlTableModel *modelparm):QDialog(parent)
{
globalModel=0;
delegate=0;
tableWidget=new QTableWidget(this);
connect(tableWidget,SIGNAL(itemChanged ( QTableWidgetItem *)),this,SLOT(tableChanged ( QTableWidgetItem *)));
connect(tableWidget,SIGNAL(currentItemChanged ( QTableWidgetItem * , QTableWidgetItem * )),this,SLOT(itemChanged ( QTableWidgetItem * , QTableWidgetItem * )));
QVBoxLayout *layout=new QVBoxLayout(this);
layout->addWidget(tableWidget);
setLayout(layout);
layout->setContentsMargins(0,0,0,0);
tableWidget->insertRow(0);
if(modelparm)
{
globalModel=modelparm;
for(int i=0;i<globalModel->record().count();i++)
{
tableWidget->insertColumn(i);
QString strItem=globalModel->headerData(i,Qt::Horizontal).toString();
mapField.insert(i,strItem);
mapFieldName.insert(i,globalModel->record().field(i).name());
tableWidget->setHorizontalHeaderItem(i, new QTableWidgetItem(strItem));
//tableWidget->setItem(0,i,new QTableWidgetItem());
}
delegate=new SpreadSheetDelegate(tableWidget);
delegate->globalModel=globalModel;
delegate->parentWidget=parent;
tableWidget->setItemDelegate(delegate);
delegate->readValue();
}
setWindowFlags(Qt::Tool);
setMinimumWidth(600);
setMinimumHeight(100);
setWindowTitle("设置过滤条件");
}
TableViewFilter::~TableViewFilter()
{
}
void TableViewFilter::tableChanged ( QTableWidgetItem *curitem)
{
QTableWidgetItem *item=curitem;
QString filter;
for(int c=0;c<tableWidget->columnCount();c++)
{
item=tableWidget->item(0,c);
if(item)
{
QString s=item->text().trimmed();
if(s=="(全部)")
s="";
if(!s.isNull() && s.length()>0)
{
if(s=="(空值)")
filter.append(mapFieldName.value(c) + tr(" is null ") );
else if(s=="(非空值)")
filter.append(mapFieldName.value(c) + tr(" is not null ") );
else
filter.append(mapFieldName.value(c) + tr("='%1'").arg(s) );
}
if(filter.right(5)!=" AND ")
filter.append(" AND ");
}
}
if(filter.left(5)==" AND ")
filter=filter.mid(5);
if(filter.right(5)==" AND ")
filter=filter.mid(0,filter.length()-5);
if(filter.length()==0)
filter="1=1";
qDebug()<<filter;
if(globalModel )
{
globalModel->setFilter(filter);
globalModel->select();
TableView *tv=qobject_cast<TableView *>(this->parent());
if(tv)
{
tv->resizeColumnsToContents ();
tv->resizeRowsToContents ();
}
}
}
void TableViewFilter::itemChanged ( QTableWidgetItem * cur, QTableWidgetItem * pre)
{
tableWidget->editItem( cur);
}
void TableViewFilter::setType(int nType)
{
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -