tableview.cpp

来自「跨平台,多数据库查看编辑和查询工具,平台支持windows,linux,数据库支」· C++ 代码 · 共 917 行 · 第 1/2 页

CPP
917
字号
void TableView::setTableModel(MySqlTableModel *model)
{
	if(filterDlg)
	{
		filterDlg->close();
		delete filterDlg;
		filterDlg=0;
	}
	if(findDlg)
		findDlg->hide();
	
	if(!model)
	{
		enableAction(false);
		actFind->setEnabled(false);
		actClose->setEnabled(false);
		
		return;
	}
	//closeTable();
	actFind->setEnabled(true);
	actClose->setEnabled(true);
	model->selectResult();
	setModel(model);



	resizeColumnsToContents ();
	resizeRowsToContents ();
	enableAction(true);
	//horizontalHeader()->setResizeMode(QHeaderView::ResizeToContents);
 	//verticalHeader()->setResizeMode(QHeaderView::ResizeToContents);
}

void TableView::onSortIndicatorChanged ( int idx, Qt::SortOrder order)
{
		if(!model())
		return;
    QAbstractItemModel * m=model();
		MySqlTableModel *model=qobject_cast<MySqlTableModel *>(m);
		if(!model)
			return;
	model->setSort(idx,order);
	model->selectResult();
  resizeColumnsToContents ();
	resizeRowsToContents ();
}
void TableView::enableAction(bool bEnabled)
{
	 actInsertRow->setEnabled(bEnabled);
	 actAppendRow->setEnabled(bEnabled);
	 actDeleteRow->setEnabled(bEnabled);
	 actCommit->setEnabled(bEnabled);
	 actRollback->setEnabled(bEnabled);
	 actFilter->setEnabled(bEnabled);
}

void TableView::closeFilter()
{
		if(filterDlg)
	{
		filterDlg->close();
		delete filterDlg;
		filterDlg=0;
	}

}
void TableView::setFilter()
{
	
	if(!model())
		return;
  QAbstractItemModel * m=model();
	MySqlTableModel *model=qobject_cast<MySqlTableModel *>(m);
	if(!model)
			return;

	if(filterDlg)
	{
		filterDlg->close();
		delete filterDlg;
		filterDlg=0;
	}

	if(model->filter().length()>0)
	{
		model->setFilter(QString());
		model->selectResult();
  	resizeColumnsToContents ();
	  resizeRowsToContents ();
	}
	
	while(model->canFetchMore())
	   model->fetchMore();


	filterDlg=new TableViewFilter(this,model);
	filterDlg->show();
	
}
//QItemSelectionModel::SelectionFlags TableView::selectionCommand ( const QModelIndex & index, const QEvent * event ) const
void TableView::setSelection ( const QRect & rect, QItemSelectionModel::SelectionFlags flags )
{
	//QItemSelectionModel::SelectionFlags flags=QTableView::selectionCommand ( index, event);
	QTableView::setSelection ( rect, flags );
	QModelIndexList selections = selectionModel()->selectedIndexes();	
	double value=0;
	if(selections.size()>1)
	{
	  foreach(QModelIndex index,selections)
		  value+=index.data().toDouble();  
	}
	
	emit onSum(value);
	
	
}
void TableView::showFind()
{
	if(!findDlg)
		findDlg=new FindDialog(this);

	findDlg->setFindMode();
	findDlg->show();
}

void TableView::closeTable()
{
	try{
	if(filterDlg)
	{
		delete filterDlg;
		filterDlg=0;
	}
	if(findDlg)
	{
		delete findDlg;
		findDlg=0;
	}

	if(!model())
		return;

	QAbstractItemModel * m=model();
	MySqlTableModel *model=qobject_cast<MySqlTableModel *>(m);
	if(!model)
			return;
	model->save();
	

	
	setTableModel(NULL);
	setModel(NULL);	
	
	delete model;
	model=0;

	actFind->setEnabled(false);
	actClose->setEnabled(false);
	setTableModel(NULL);
	setModel(NULL);	
  }
  catch(...){}
	emit onCloseTable(this->winId());
}

QString TableView::getSelectedTableText()
{
	QList<QPair<QString, QString> > list;
  QPair<QString, QString> pair;
  
	if(!model())
		return QString();
	
  QAbstractItemModel * m=model();
	MySqlTableModel *model=qobject_cast<MySqlTableModel *>(m);
	if(!model)
			return QString();

   QString string;
   QString split="\t";
   
   QModelIndexList selection = selectionModel()->selectedIndexes();	
   if(selection.size()<=0)
      return QString();
   
   int startCol=0,endCol=0,startRow=0,endRow=0;
   startCol=selection.at(0).column();
   endCol=selection.at(selection.size()-1).column();
   startRow=selection.at(0).row();
   endRow=selection.at(selection.size()-1).row();
   
   if(startCol<endCol)
   {
   	for(int j=startCol;j<=endCol;j++)
   	{
   		string.append(model->headerData(j,Qt::Horizontal).toString());
   		string.append(split);
   	}
   	string=string.left(string.length()-split.length());     
   	string.append("\n");
   }

   for(int i=startRow;i<=endRow;i++)
   {
   	 for(int j=startCol;j<=endCol;j++)
   	 {
   	 	  QString cell=model->index(i,j).data().toString();
   	 	  list=model->mapValues.value(j);
   	 	  if(list.size())
   	 	  {
   	 	  	foreach(pair,list)
   	 	  	{
   	 	  		if(pair.first==cell)
   	 	  		{
   	 	  			cell=pair.second;
   	 	  			break;
   	 	  		}
   	 	  	}
   	 	  }
   	 	  QString fname=model->headerData(j,Qt::Horizontal).toString().toUpper();
   	 	  if(isPasswordColumn(fname))
   	 	  {
   	 	  	cell=cell.fill('*',8);
   	 	  }
     	 	string.append(cell);
   	 	  string.append(split);
     }
     string=string.left(string.length()-split.length());     
     string.append("\n");
   }
   return string;
}


QString TableView::getSelectedText()
{
	QString string;
	string=getSelectedTableText();
	if(string.length())
		return string;
		
	if(!model())
		return QString();
	
  QAbstractItemModel * m=model();
	QSqlQueryModel *model=qobject_cast<QSqlQueryModel *>(m);
	if(!model)
			return QString();

   
   QString split="\t";
   
   QModelIndexList selection = selectionModel()->selectedIndexes();	
   if(selection.size()<=0)
      return QString();
   
   int startCol=0,endCol=0,startRow=0,endRow=0;
   startCol=selection.at(0).column();
   endCol=selection.at(selection.size()-1).column();
   startRow=selection.at(0).row();
   endRow=selection.at(selection.size()-1).row();
   
   if(startCol<endCol)
   {
   	for(int j=startCol;j<=endCol;j++)
   	{
   		string.append(model->headerData(j,Qt::Horizontal).toString());
   		string.append(split);
   	}
   	string=string.left(string.length()-split.length());     
   	string.append("\n");
   }

   for(int i=startRow;i<=endRow;i++)
   {
   	 for(int j=startCol;j<=endCol;j++)
   	 {
   	 	  QString cell=model->index(i,j).data().toString();
   	 	  QString fname=model->headerData(j,Qt::Horizontal).toString().toUpper();
   	 	  if(isPasswordColumn(fname))
   	 	  {
   	 	  	cell=cell.fill('*',8);
   	 	  }
     	 	string.append(cell);
        string.append(split);
     }
     string=string.left(string.length()-split.length());     
     string.append("\n");
   }
   return string;
}

void TableView::copy()
{
   QClipboard *clipboard = QApplication::clipboard();
   QString str=getSelectedText();
   //qWarning(str.toLatin1().data());
   clipboard->setText(str);

}    

bool TableView::saveFile(const QString & fileName)
{
    QFile file(fileName);
    if (!file.open(QFile::WriteOnly | QFile::Text)) {
        QMessageBox::warning(this, qApp->applicationName(),
                             tr("Cannot write file %1:\n%2.")
                             .arg(fileName)
                             .arg(file.errorString()));
        return false;
    }

    QTextStream out(&file);
    QApplication::setOverrideCursor(Qt::WaitCursor);
    out<<getSelectedText();
    file.close();
    QApplication::restoreOverrideCursor();        
    return true;
}

void TableView::save()
{
		QString fileName = QFileDialog::getSaveFileName(this,
                                    tr(""),
                                    tr(""),
                                    tr("Text Files (*.txt);;Sql Files (*.sql);;All Files (*)"));
        if (fileName.isEmpty())
        	return;
        QFileInfo info(fileName);
        if(info.suffix().isEmpty() || info.suffix().length()==0)
        	fileName=fileName+".txt";
        saveFile(fileName);	

} 

void TableView::retrieveAll()
{
	if(!model())
		return ;
	
  QAbstractItemModel * m=model();
	QSqlQueryModel *model=qobject_cast<QSqlQueryModel *>(m);
	if(!model)
			return ;

  QApplication::setOverrideCursor(Qt::WaitCursor);
  while(  model->canFetchMore())
  {
	  qApp->processEvents();
    model->fetchMore();
  }
	resizeColumnsToContents ();
  resizeRowsToContents ();		
  QApplication::restoreOverrideCursor();


}
bool TableView::isPasswordColumn(QString columnName)
{
	bool bret=false;
	foreach(QString str,passwordColumnList)
	{
		if(str.toUpper().trimmed()==columnName.toUpper().trimmed())
		{
			bret=true;
			break;
		}
	}
	return bret;

}

void TableView::print()
{
	QWidget *pw=qobject_cast<QWidget *>(parent());
	while(pw && pw->parent())
	   pw=qobject_cast<QWidget *>(pw->parent());
	QPrinter printer(QPrinter::HighResolution);
	QPrintPreviewDialog dlg(&printer,this);
	dlg.move(pw->x(),pw->y());
	dlg.resize(pw->size());
	dlg.setWindowState(pw->windowState());
	connect(&dlg, SIGNAL(paintRequested(QPrinter *)), SLOT(printPreview(QPrinter *)));
	dlg.exec();
	
}
extern int qt_defaultDpiX();
extern int qt_defaultDpiY();
extern int qt_defaultDpi();

void TableView::printPreview(QPrinter *printer)
{
	QPainter p(printer);
	if (!p.isActive())
        return;
  p.save();
  
        qreal sourceDpiX = qt_defaultDpiX();
        qreal sourceDpiY = qt_defaultDpiY();

        const qreal dpiScaleX = qreal(printer->logicalDpiX()) / sourceDpiX;
        const qreal dpiScaleY = qreal(printer->logicalDpiY()) / sourceDpiY;

        // scale to dpi
        p.scale(dpiScaleX, dpiScaleY);

        QSizeF scaledPageSize = printer->paperSize(QPrinter::Point);
        QRectF pageRect=printer->pageRect(QPrinter::Point);
        qDebug()<<pageRect.width()<<pageRect.height()<<dpiScaleX<<dpiScaleY;
        scaledPageSize.rwidth() /= dpiScaleX;
        scaledPageSize.rheight() /= dpiScaleY;
        
        //p.scale(dpiScaleX, dpiScaleY);
        
        const QSizeF printerPageSize(printer->pageRect().size());

        // scale to page
        //p.scale( scaledPageSize.width(), scaledPageSize.height());
        //p.scale(printerPageSize.width() / scaledPageSize.width(),printerPageSize.height() / scaledPageSize.height());

  
	printer->setPageMargins(10,20,10,20,QPrinter::Millimeter);
	QFont font=p.font();
	font.setPixelSize(12);
	p.setFont(font);


	//qDebug()<<printer->heightMM();
    
  for(int i=0;i<4;i++)
  {
  	  qreal y1=0;
  	  qreal y2=0;

  	for(int j=0;j<20;j++)
  	{
  	  //p.drawText(0, j*50, tr("测试行Test text page:%1  line:%2").arg(i+1).arg(j+1));
  	  
  	  for(int k=0;k<30;k++)
  	  {
  	  	QRect rect(k*100,j*50,100,50);
  	  	QString str=tr("%1*%2").arg(j+1).arg(k+1);
  	  	p.drawText(rect,Qt::AlignCenter|Qt::AlignVCenter,str);
  	  	p.drawRoundedRect(rect,0,0);
  	  	
  	  	
  	  }
    }
    if(i<3)
    printer->newPage();
  }
  p.restore();
  p.end();
  
}

⌨️ 快捷键说明

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