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 + -
显示快捷键?