?? tableview.cpp
字號(hào):
#include "tableview.h"
#include "mysqltablemodel.h"
#include <QtSql>
MyDelegate::MyDelegate(QWidget *parent)
:QSqlRelationalDelegate(parent)
{
}
MyDelegate::~MyDelegate()
{
}
QWidget *MyDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem& item,
const QModelIndex &index) const
{
QWidget *editor=0;
MySqlTableModel *model=qobject_cast<MySqlTableModel *>((QAbstractItemModel * )index.model());
QList<QPair<QString, QString> > list;
QPair<QString, QString> pair;
list=model->mapValues.value(index.column());
if(list.size()>0)
{
DataComboBox *comboBox = new DataComboBox(parent);
if(comboBox)
{
foreach(pair,list)
{
//qWarning("%s\t%s",pair.first.toLatin1().data(),pair.second.toLatin1().data());
comboBox->addItem(pair.second,pair.first);
}
editor=comboBox;
}
}
else
{
editor=QSqlRelationalDelegate::createEditor(parent, item,index);
if(editor && model)
{
QLineEdit *edit = qobject_cast<QLineEdit *>(editor);
TableView *tv=qobject_cast<TableView *>(this->parent());
if(edit && tv && tv->isPasswordColumn(model->record().field(index.column()).name()))
edit->setEchoMode(QLineEdit::Password);
}
}
return editor;
}
void MyDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
QSqlRelationalDelegate::setEditorData(editor,index);
QString text=index.model()->data(index).toString().trimmed();
MySqlTableModel *model=qobject_cast<MySqlTableModel *>((QAbstractItemModel * )index.model());
DataComboBox *comboBox=qobject_cast<DataComboBox *>(editor);
if(comboBox && model)
{
comboBox->setCurrentIndex(comboBox->findData(QVariant(text)));
}
int nAlign=index.model()->headerData(index.column(),Qt::Horizontal,Qt::UserRole).toInt();
QLineEdit *edit = qobject_cast<QLineEdit *>(editor);
if (edit)
{
edit->setText(text);
if(nAlign&Qt::AlignRight)
edit->setAlignment(Qt::AlignRight);
}
}
void MyDelegate::setModelData ( QWidget * editor, QAbstractItemModel * model, const QModelIndex & index ) const
{
MySqlTableModel *tableModel=qobject_cast<MySqlTableModel *>((QAbstractItemModel * )model);
DataComboBox *comboBox=qobject_cast<DataComboBox *>(editor);
if(comboBox && tableModel)
{
QString text=comboBox->itemData(comboBox->currentIndex()).toString();
tableModel->setData(index,QVariant(text));
}
else
QSqlRelationalDelegate::setModelData(editor,model,index);
}
QSize MyDelegate::sizeHint(const QStyleOptionViewItem &option,
const QModelIndex &index) const
{
MySqlTableModel *model=qobject_cast<MySqlTableModel *>((QAbstractItemModel * )index.model());
//DataComboBox *comboBox=qobject_cast<DataComboBox *>(editor);
if(model)
{
QList<QPair<QString, QString> > list;
QPair<QString, QString> pair;
list=model->mapValues.value(index.column());
QString text = index.data(Qt::DisplayRole).toString();
foreach(pair,list)
{
if(text==pair.first)
{
text=pair.second;
break;
}
}
QFont font(option.font);
font.setPointSize(QFontInfo(font).pointSize() * 3/2);
QFontMetrics fontMetrics(font);
return QSize(fontMetrics.width(text), fontMetrics.lineSpacing());
}
else
return(QSqlRelationalDelegate::sizeHint(option,index));
}
void MyDelegate::paint ( QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index ) const
{
MySqlTableModel *model=qobject_cast<MySqlTableModel *>((QAbstractItemModel * )index.model());
TableView *tv=qobject_cast<TableView *>(this->parent());
painter->save();
const QRect rect=option.rect;
const QPalette palette=option.palette;
//qWarning(index.model()->headerData(index.column(),Qt::Horizontal).toString().toLatin1().data());
if(tv && tv->isPasswordColumn(index.model()->headerData(index.column(),Qt::Horizontal).toString()))
{
QString password=index.data().toString();
QString star;
star.fill('*',8);
if(option.state & QStyle::State_Selected )
{
QPen pen=QPen(palette.highlightedText().color());
painter->setPen(pen);
painter->fillRect(rect,palette.highlight());
}
QRect r=rect;
r.setLeft(r.left()+2);
painter->drawText(r,star,Qt::AlignVCenter|Qt::AlignCenter);
}
else if(model)
{
QString text;//=index.data(Qt::ToolTipRole).toString();
//if(text.isNull() || text.isEmpty() || text.length()==0)
text=index.data().toString();
QIcon icon=qVariantValue<QIcon>(index.model()->headerData(index.column(),Qt::Horizontal,Qt::DecorationRole));
int fieldType=index.model()->headerData(index.column(),Qt::Horizontal,Qt::ToolTipRole).toInt();
if(option.state & QStyle::State_Selected )
{
QPen pen=QPen(palette.highlightedText().color());
painter->setPen(pen);
painter->fillRect(rect,palette.highlight());
}
else
{
if(fieldType==1) //key列
{
QFont font=option.font;
font.setBold(true);
QPen pen=QPen(QColor(0,0,250));
painter->setPen(pen);
//painter->setFont(font);
}
}
int nAlign=index.model()->headerData(index.column(),Qt::Horizontal,Qt::UserRole).toInt();
QVariant::Type t = static_cast<QVariant::Type>(index.data(Qt::EditRole).userType());
QRect r=rect;
//顯示關(guān)系表的關(guān)系列
QString str="(NULL)";
QList<QPair<QString, QString> > list;
QPair<QString, QString> pair;
list=model->mapValues.value(index.column());
if(list.size()>0)
{
foreach(pair,list)
{
if(pair.first==text)
{
str=pair.second;
break;
}
}
r.setLeft(r.left()+2);
painter->drawText(r,str,Qt::AlignLeft | Qt::AlignVCenter);
}
else
{
if(nAlign&Qt::AlignRight ||t==QVariant::Double||t==QVariant::Int||t==QVariant::UInt||t==QVariant::LongLong||t==QVariant::ULongLong)
{
r.setRight(r.right()-2);
if(text.toDouble()<0)
{
QPen pen=QPen(QColor(250,0,0));
painter->setPen(pen);
}
}
else
r.setLeft(r.left()+2);
painter->drawText(r,text,(Qt::Alignment)nAlign | Qt::AlignVCenter);
}
}
else
QSqlRelationalDelegate::paint(painter,option,index);
if(option.state & QStyle::State_HasFocus )
drawFocus(painter,option,rect);
painter->restore();
}
TableView::TableView(QWidget *parent )
:QTableView(parent)
{
filterDlg=0;
findDlg=0;
setAlternatingRowColors(true);
setContextMenuPolicy(Qt::ActionsContextMenu);
setMinimumWidth(400);
QSettings settings(qApp->applicationName(), "dbmanager");
QString text = settings.value("xh", "password,passwd,mm,口令,密碼").toString();
passwordColumnList=text.split(",");
actCommit = new QAction(tr("保存"),this);
actCommit->setIcon(QIcon(":/image/save.png"));
connect(actCommit,SIGNAL(triggered()),this,SLOT(commit()));
actDeleteRow = new QAction(tr("刪除行"),this);
actDeleteRow->setIcon(QIcon(":/image/delete.png"));
connect(actDeleteRow,SIGNAL(triggered()),this,SLOT(deleteRow()));
actInsertRow = new QAction("插入行",this);
actInsertRow->setIcon(QIcon(":/image/insert.png"));
connect(actInsertRow,SIGNAL(triggered()),this,SLOT(insertRow()));
actAppendRow = new QAction("追加行",this);
actAppendRow->setIcon(QIcon(":/image/append.png"));
connect(actAppendRow,SIGNAL(triggered()),this,SLOT(appendRow()));
actRollback = new QAction ("撤消",this);
actRollback->setIcon(QIcon(":/image/rollback.png"));
connect(actRollback,SIGNAL(triggered()),this,SLOT(rollback()));
actFilter=new QAction(QIcon(":/image/filter.png"),"設(shè)置過(guò)濾條件...",this);
connect(actFilter,SIGNAL(triggered()),this,SLOT(setFilter()));
actFind=new QAction(QIcon(":/image/find.png"),"查找...",this);
actFind->setEnabled(false);
actFind->setShortcut(QKeySequence::Find);
connect(actFind,SIGNAL(triggered()),this,SLOT(showFind()));
actClose=new QAction(QIcon(":/image/close.png"),"關(guān)閉當(dāng)前表",this);
actClose->setEnabled(false);
connect(actClose,SIGNAL(triggered()),this,SLOT(closeTable()));
actRetrieveAll=new QAction(QIcon(":/image/retrieveall.png"),"檢索所有記錄",this);
connect(actRetrieveAll,SIGNAL(triggered()),this,SLOT(retrieveAll()));
actCopy=new QAction(QIcon(":/image/copy.png"),"復(fù)制選中內(nèi)容",this);
actCopy->setShortcut(QKeySequence::Copy);
connect(actCopy,SIGNAL(triggered()),this,SLOT(copy()));
actSave=new QAction(QIcon(":/image/savefile.png"),"保存選中內(nèi)容為文件...",this);
actSave->setShortcut(tr("Ctrl+S"));
connect(actSave,SIGNAL(triggered()),this,SLOT(save()));
actPrint=new QAction(QIcon(":/image/printer.png"),"打印...",this);
actPrint->setShortcut(tr("Ctrl+P"));
connect(actPrint,SIGNAL(triggered()),this,SLOT(print()));
QAction *action=new QAction(this);
action->setSeparator(true);
addAction(actRetrieveAll);
addAction(actClose);
addAction(action);
addAction(actSave);
addAction(actCopy);
action=new QAction(this);
action->setSeparator(true);
addAction(action);
addAction(actInsertRow);
addAction(actAppendRow);
addAction(actDeleteRow);
action=new QAction(this);
action->setSeparator(true);
addAction(action);
addAction(actCommit);
addAction(actRollback);
action=new QAction(this);
action->setSeparator(true);
addAction(action);
addAction(actFilter);
addAction(actFind);
addAction(actPrint);
enableAction(false);
horizontalHeader()->setSortIndicatorShown(true);
connect(this->horizontalHeader(),SIGNAL(sortIndicatorChanged (int, Qt::SortOrder)),this,SLOT(onSortIndicatorChanged ( int, Qt::SortOrder)));
MyDelegate *delegate=new MyDelegate(this);
setItemDelegate(delegate);
}
TableView::~TableView()
{
QAbstractItemModel * m=model();
MySqlTableModel *model=qobject_cast<MySqlTableModel *>(m);
if(!model)
return;
if(model)
{
try
{
model->save();
delete model;
}
catch(...){}
//closeTable();
}
}
void TableView::deleteRow()
{
if(!model())
return;
QAbstractItemModel * m=model();
MySqlTableModel *model=qobject_cast<MySqlTableModel *>(m);
if(!model)
return;
int ret = QMessageBox::question(this, tr("數(shù)據(jù)庫(kù)管理"),
tr("是否確定要?jiǎng)h除此行?.\n"),
QMessageBox::Yes | QMessageBox::No);
QModelIndexList currentSelection = selectionModel()->selectedIndexes();
if (ret == QMessageBox::Yes)
{
QModelIndexList currentSelection = selectionModel()->selectedIndexes();
QMap <int,QModelIndex> map;
foreach (QModelIndex index,currentSelection)
map[index.row()]=index;
QList <int > listRows=map.keys();
qSort(listRows.begin(), listRows.end(), qGreater<int>());
foreach(int row,listRows)
model->removeRow(row);
model->save();
resizeColumnsToContents ();
resizeRowsToContents ();
}
}
void TableView::insertRow()
{
if(!model())
return;
QAbstractItemModel * m=model();
MySqlTableModel *model=qobject_cast<MySqlTableModel *>(m);
if(!model)
return;
QModelIndex insertIndex = currentIndex();
int row = insertIndex.row() == -1 ? 0 : insertIndex.row();
model->insertRow(row);
insertIndex = model->index(row, 0);
setCurrentIndex(insertIndex);
edit(insertIndex);
}
void TableView::appendRow()
{
if(!model())
return;
QAbstractItemModel * m=model();
MySqlTableModel *model=qobject_cast<MySqlTableModel *>(m);
if(!model)
return;
model->insertRow(model->rowCount());
QModelIndex insertIndex = model->index(model->rowCount()-1, 0);
setCurrentIndex(insertIndex);
edit(insertIndex);
}
void TableView::rollback()
{
if(!model())
return;
QAbstractItemModel * m=model();
MySqlTableModel *model=qobject_cast<MySqlTableModel *>(m);
if(!model)
return;
model->cancel();
if(model->database().driver() && model->database().driver()->hasFeature(QSqlDriver::Transactions))
{
model->database().rollback();
model->database().transaction();
}
resizeColumnsToContents ();
resizeRowsToContents ();
}
void TableView::commit()
{
if(!model())
return;
QAbstractItemModel * m=model();
MySqlTableModel *model=qobject_cast<MySqlTableModel *>(m);
if(!model)
return;
if(!model->save())
QMessageBox::warning(this,"錯(cuò)誤",model->lastError().text());
else
{
if(model->database().driver() && model->database().driver()->hasFeature(QSqlDriver::Transactions))
{
model->database().commit();
model->database().transaction();
}
}
resizeColumnsToContents ();
resizeRowsToContents ();
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -