⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tableview.cpp

📁 跨平台,多数据库查看编辑和查询工具,平台支持windows,linux,数据库支持oracle,odbc,mysql,slite等
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#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;
    
    
    //显示关系表的关系列
    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"),"设置过滤条件...",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"),"关闭当前表",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"),"复制选中内容",this);	
	actCopy->setShortcut(QKeySequence::Copy);
	connect(actCopy,SIGNAL(triggered()),this,SLOT(copy()));	

	actSave=new QAction(QIcon(":/image/savefile.png"),"保存选中内容为文件...",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("数据库管理"),
		tr("是否确定要删除此行?.\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,"错误",model->lastError().text());  	
	else
	{
		if(model->database().driver() && model->database().driver()->hasFeature(QSqlDriver::Transactions))
		{
		model->database().commit();
		model->database().transaction();
		}
		
	}
	resizeColumnsToContents ();
	resizeRowsToContents ();

}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -