#include "vraiLogin.h" #include "vraiWorksheet.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; vraiMainWindowWorksheet::vraiMainWindowWorksheet() { setupUi(this); //Création de la table QStringList entetes; tableWidgetResultat->setColumnCount(3); entetes<<"Nom"<<"Prénom"<<"Date de Naissance"; tableWidgetResultat->setHorizontalHeaderLabels(entetes); connect(pushButtonQuitter,SIGNAL(clicked()),this,SLOT(pushButtonQuitterClicked())); connect(pushButtonImprimer,SIGNAL(clicked()),this,SLOT(pushButtonImprimerClicked())); connect(pushButtonConnexion,SIGNAL(clicked()),this,SLOT(afficheDialLogin())); connect(pushButtonOK,SIGNAL(clicked()),this,SLOT(executeRequete())); } void vraiMainWindowWorksheet::pushButtonQuitterClicked() { close(); } void vraiMainWindowWorksheet::pushButtonImprimerClicked() { //createRapport(tableWidgetResultat); imprimerClassique(); } void vraiMainWindowWorksheet::afficheDialLogin() { //Affichage de la fenetre de login qDebug("vraiMainWindowWorksheet::afficheDialLogin()"); vraiDialogLogin fenLogin(this); fenLogin.exec(); } void vraiMainWindowWorksheet::executeRequete() { qDebug("vraiMainWindowWorksheet::executeRequete()"); QSqlQuery query; QString requeteSaisi(lineEditRequete->text()); if(query.exec(requeteSaisi)) { //nbligne tableWidgetResultat->setRowCount(query.size()); //nb col tableWidgetResultat->setColumnCount(query.record().count()); //entêtes for(int noChamp=0;noChampsetHorizontalHeaderItem(noChamp,entete); } //Lecture des résultats et affichage dans la tableWidget int ligne=0; while (query.next()) { for(int noChamp=0;noChampsetItem(ligne,noChamp,nouveau); } ligne++; } } else { QMessageBox::critical(this,"Sqlworksheet","Erreur dans la requête:\n"+query.lastError().text()); } } void vraiMainWindowWorksheet::createRapport(QTableWidget * QTWresultat) { QTextEdit *editor = new QTextEdit; QTextCursor cursor(editor->textCursor()); cursor.movePosition(QTextCursor::Start); QTextFrame *topFrame = cursor.currentFrame(); QTextFrameFormat topFrameFormat = topFrame->frameFormat(); topFrameFormat.setPadding(16); topFrame->setFrameFormat(topFrameFormat); QTextCharFormat textFormat; QTextCharFormat boldFormat; boldFormat.setFontWeight(QFont::Bold); QTextFrameFormat referenceFrameFormat; referenceFrameFormat.setBorder(1); referenceFrameFormat.setPadding(8); referenceFrameFormat.setPosition(QTextFrameFormat::FloatRight); referenceFrameFormat.setWidth(QTextLength(QTextLength::PercentageLength, 40)); cursor.insertFrame(referenceFrameFormat); cursor.insertText("SqlWorksheet", boldFormat); cursor.insertBlock(); cursor.insertText("Par les étudiants du BTS Info Gap"); cursor.setPosition(topFrame->lastPosition()); QDate date = QDate::currentDate(); cursor.insertText(tr("Date: %1").arg(date.toString("d MMMM yyyy")), textFormat); cursor.insertBlock(); QTextFrameFormat bodyFrameFormat; bodyFrameFormat.setWidth(QTextLength(QTextLength::PercentageLength, 100)); cursor.insertFrame(bodyFrameFormat); cursor.insertText("Votre requête: "+lineEditRequete->text(), textFormat); cursor.insertBlock(); cursor.insertBlock(); cursor.insertBlock(); QTextTableFormat resultatTableFormat; resultatTableFormat.setAlignment(Qt::AlignHCenter); //resultatTableFormat.setBorderStyle(); int nbLignes=QTWresultat->rowCount(); int nbCols=QTWresultat->columnCount(); QTextTable *resultatTable = cursor.insertTable(nbLignes+1, nbCols, resultatTableFormat); QTextFrameFormat resultatFrameFormat = cursor.currentFrame()->frameFormat(); resultatFrameFormat.setBorder(1); cursor.currentFrame()->setFrameFormat(resultatFrameFormat); //entêtes for(int noChamp=0;noChampcellAt(0, noChamp).firstCursorPosition(); cursor.insertText(tableWidgetResultat->horizontalHeaderItem ( noChamp )->text(), boldFormat); } //contenu for (int noLigne = 0; noLigne < nbLignes; noLigne++) { for(int noChamp=0;noChampcellAt(noLigne+1,noChamp).firstCursorPosition(); cursor.insertText(tableWidgetResultat->item(noLigne,noChamp)->text(), textFormat); } } QPrinter printer; QPrintDialog *dialog = new QPrintDialog(&printer, this); if (dialog->exec() != QDialog::Accepted) return; editor->document()->print(&printer); } void vraiMainWindowWorksheet::imprimerClassique() { QPrinter *printer=new QPrinter; //mon imprimante QPrintDialog *dialog = new QPrintDialog(printer, this); //le printdialog if ( dialog->exec()== QDialog::Accepted) { // execution boite de dialogue d'impression QPainter p; if( !p.begin( printer ) ) // le painter est associé à l'imprimante en cas de soucis on sort return; //affichage du logo QImage logo("logoBtsig.png"); p.drawImage(0,0,logo); //création des différentes fontes à utiliser QFont fontNormale("Times", 12); QFont fontGras("Times", 12, QFont::Bold); //je récupère les géométries des deux fontes QFontMetrics fmGras(fontGras); QFontMetrics fmNormale(fontNormale); //je vais afficher la requête p.setFont( fontNormale); //sélection de la police //calcul de l'ordonnée int yPos=logo.height()+fmNormale.lineSpacing(); qDebug("coucou"); QString textVotreRequete="Votre requête: "; p.drawText(20,yPos,textVotreRequete); qDebug("coucou"); //et maintenant la requête int leXDeLaRequete=20+fmNormale.width("Votre requête: "); //elle est en gras p.setFont( fontGras); p.drawText(leXDeLaRequete,yPos,lineEditRequete->text()); //je vais aller écrire le tableau yPos+=fmGras.lineSpacing()*2; //on saute deux lignes //mémo posy du haut du tableau int yHautTableau=yPos-(int)(fmGras.height()/2); //recherche des largeurs des colonnes vector vectLargeurs; for(uint noColonne=0;noColonnecolumnCount();noColonne++) { int largeurColonne = fmGras.width(tableWidgetResultat->horizontalHeaderItem(noColonne)->text()); for(uint noLigne=0;noLignerowCount(); noLigne++ ) { uint lTexte=fmNormale.width(tableWidgetResultat->item(noLigne,noColonne)->text()); if(lTexte>largeurColonne)largeurColonne=lTexte; } vectLargeurs.push_back(largeurColonne); } //obtention de la zone d'impression QRect zone=printer->pageRect(); //obtention des coordonées de la zone d'impression int x1,y1,x2,y2; zone.getCoords(&x1,&y1,&x2,&y2); int largeurImpression=x2-x1; int hauterImpression=y2-y1; //calcul du x1 du tableau //calcul de la largeur du tableau entier int largeurTableau=0; for(uint noCol=0;noColcolumnCount();noCol++) { largeurTableau+=vectLargeurs[noCol]; } //ajout des intervalles entre colonnes 2 intervalles par colonne * le nb de colonne largeurTableau+=2*10*tableWidgetResultat->columnCount(); //on doit centrer le tableau dans la page uint x1Tableau=(int)((largeurImpression-largeurTableau)/2); //on remplit un tableau des x pour chaque colonne vector vectXCol; vectXCol.push_back(x1Tableau+10); for (uint noC=1;noCcolumnCount();noC++) { vectXCol.push_back(vectXCol[noC-1]+vectLargeurs[noC-1]+(2*10)); } //impression des noms des champs p.setFont(fontGras); //gras for( int noChamp = 0 ; noChamp < tableWidgetResultat->columnCount() ; noChamp++) { p.drawText(vectXCol[noChamp] ,yPos,tableWidgetResultat->horizontalHeaderItem(noChamp)->text()); } //impression d'une ligne horizontale au-dessus des noms des champs QPen penNormal=p.pen(); QPen penEpais(Qt::black, 3); // red solid line, 2 pixels wide p.setPen(penEpais); p.drawLine(x1Tableau,yHautTableau,x1Tableau+largeurTableau,yHautTableau); //incrément de l'ordonnée courante Hauteur de la ligne écrite + espace vertical entre deux lignes yPos+=fmGras.height()+fmGras.lineSpacing(); //et en dessous p.drawLine(x1Tableau,yPos-(int)(fmGras.height()/2),x1Tableau+largeurTableau,yPos-(int)(fmGras.height()/2)); p.setPen(penNormal); p.setFont(fontNormale);//le contenu du tableau est en font normale //impression des chiffres du tableau for( int noLigne = 0 ; noLigne < tableWidgetResultat->rowCount(); noLigne++ ) { for (int noChamp = 0 ; noChamp < tableWidgetResultat->columnCount() ; noChamp++) { p.drawText( vectXCol[noChamp], yPos,tableWidgetResultat->item(noLigne,noChamp)->text() ); } if(noLigne==tableWidgetResultat->rowCount()-1)p.setPen(penEpais); p.drawLine(x1Tableau,yPos+fmNormale.height()+(int)(fmNormale.lineSpacing()/2), x1Tableau+largeurTableau,yPos+fmNormale.height()+(int)(fmNormale.lineSpacing()/2)); // on trace une ligne au dessous du texte if(noLigne!=tableWidgetResultat->rowCount()-1)yPos+= fmNormale.lineSpacing()+fmNormale.height(); // si on n'est pas à la dernière ligne augmentation de l'ordonnée } int yBasTableau=yPos+fmNormale.height()+(int)(fmNormale.lineSpacing()/2); // boucle pour tracer chaque ligne verticale du tableau p.setPen(penEpais); for (int noChamp=0;noChampcolumnCount();noChamp++) { p.drawLine(vectXCol[noChamp]-10,yHautTableau,vectXCol[noChamp]-10,yBasTableau); } //dernière ligne verticale de droite p.drawLine(x1Tableau+largeurTableau,yHautTableau,x1Tableau+largeurTableau,yBasTableau); p.end(); // Envoie du document à l'imprimante } } void vraiMainWindowWorksheet::closeEvent(QCloseEvent* evenement) { if(QMessageBox::warning(this,"SQLWorksheet l'appli qu'il vous faut","Etes vous sûr de vouloir quitter ?","&Oui","&Non",0,1)==0) evenement->accept(); else evenement->ignore(); }