Seite 1 von 1

(solved)Drucken von bestimmten Seiten (PrintPageRange)

Verfasst: 6. Januar 2012 13:11
von JackieN
Das Drucken klappt eigentlich so wie gewünscht. Leider werden aber immer alle Seite gedruckt. Man kan zwar im QPrintDialog
die Seite festlegen aber dies hat kein Effekt.
Ich habe leider zu diesem Thema nichts gefunden selbst Qt-Bücher haben keine brauchbaren Infos zu diesem Thema.
Entweder ist das Problem zu trivial oder ich suche nicht richtig.
Hier mein Quellcode. Vielleicht kann mir einer da helfen.

Code: Alles auswählen

bool pdf = false;
	QPrinter printer;

	if (!pdf)
	{
		QPrintDialog dialog = QPrintDialog(&printer, this);
		dialog.setWindowTitle(tr("Produktübersicht drucken"));
		dialog.addEnabledOption(QAbstractPrintDialog::PrintSelection);
		dialog.addEnabledOption(QAbstractPrintDialog::PrintToFile);
		dialog.addEnabledOption(QAbstractPrintDialog::PrintPageRange);
		dialog.addEnabledOption(QAbstractPrintDialog::PrintShowPageSize);
		dialog.addEnabledOption(QAbstractPrintDialog::PrintCollateCopies);		
		

		if(dialog.exec() == QDialog::Accepted)
		{
			double border_x = 80.0;
			double border_y = 60.0; //60
			double cellpadding_x = 10.0;
			double xpos = border_x;
			double ypos = border_y;
			double y_offset = 120.0; //Zellenhöhe 80
			double x_offset = 100.0; //
			QSize iconsize(120,90); 

			QRect qrect = printer.pageRect();			
			qrect = printer.paperRect ();
			
			int num_rows = m_image_table->rowCount();
			int num_cols = m_image_table->columnCount();

			vector<int> col_widths;
			col_widths.push_back(30);
			//Die Breite der Wagerechten Linie wird berechnet
			int totalwidth = 0; // 30
			for(int i=0; i<num_cols; i++)
			{
				col_widths.push_back(m_image_table->columnWidth(i));
				totalwidth += m_image_table->columnWidth(i);		
			}
			//addiert die Iconbreite hinzu deswegen muss wieder Spaltenbreite des Icons abgezogen werden
			totalwidth += iconsize.width() - m_image_table->columnWidth(num_cols);
			
			QPainter painter;
			painter.begin(&printer);

			//Title and header on the first page
			//TabellenHeader
			QFont font;
			font.setFamily("Arial");
			font.setWeight(QFont::Bold);
			font.setPointSize(12);
			//Title
			QFont title_font;
			title_font.setFamily("Arial");
			title_font.setWeight(QFont::Bold);
			title_font.setPointSize(16);
			
			//Datum
			QDate date = QDate::currentDate();

			double title_xpos = border_x - 10;
			double title_ypos = border_y;
			double first_page_header_xpos = border_x;
			double first_page_header_ypos = title_ypos + 40;
			double header_xpos = border_x;
			double header_ypos = border_y;
			
			painter.setFont(title_font);
			painter.drawText(QPointF(title_xpos, title_ypos),
							"Übersicht der eingelernten Säcke, " + date.toString("dd.MM.yyyy") );
			painter.setFont(font);
			painter.drawText(QPointF(first_page_header_xpos, first_page_header_ypos), "Nr.");
			first_page_header_xpos += col_widths[0];
			painter.drawText(QPointF(first_page_header_xpos, first_page_header_ypos), "Produkt-ID");
			first_page_header_xpos += col_widths[1];
			painter.drawText(QPointF(first_page_header_xpos, first_page_header_ypos), "Produktname");
			first_page_header_xpos += col_widths[2];
			painter.drawText(QPointF(first_page_header_xpos, first_page_header_ypos), "Datum");
			first_page_header_xpos += col_widths[3] - 20 + iconsize.width() / 2;
			painter.drawText(QPointF(first_page_header_xpos, first_page_header_ypos), "Bild");
			
			//Font zurücksetzen
			font.setWeight(QFont::Normal);
			font.setPointSize(8);
			painter.setFont(font);

			
			//Tabelleninhalt
			bool new_page = false;
			bool with_title = true;
			int page_count = 0;

			//Zeilen erzeugen
			for(int i=0; i<num_rows; i++)
			{
				xpos = border_x;

				//Tables offset because of the title on the first page
				if (with_title)
				{
					ypos+= first_page_header_ypos + 4  ;
				}			

				if(i==0 || new_page)
				{
					//horizontale Linie
					painter.drawLine(border_x - cellpadding_x, ypos - y_offset/2.0, border_x + totalwidth,  ypos - y_offset/2.0);
					//pageCount
					page_count++;
					painter.drawText(qrect.width() - 90, qrect.height() - 70, QString::number(page_count) );
					new_page = false;
				}
				QString product_id = "";
				QString product_name = "";
				QString datum = "";
				QString pic_path = ""; 
				//Zeile erzeugen mit 5 Spalten
				for(int j=0; j<num_cols; j++)
				{
					QPointF point(xpos, ypos + 5 );
					switch (j) 
					{
						case 0 :
						{
							//Nummerierung drucken
							QString row = toString(i + 1).c_str();
							painter.drawText(point, row);
							break;
						}
						case 1:
						{
							//product_id
							product_id = m_image_table->item(i,j-1)->text();
							painter.drawText(point, product_id);
							break;
						}
						case 2:
						{
							//product_name
							product_name = m_image_table->item(i,j-1)->text();
							painter.drawText(point, product_name);
							break;
						}
						case 3:
						{
							//date
							QString datum = m_image_table->item(i,j-1)->text();
							painter.drawText(point, datum);
							break;
						}
						case 4:
						{																			
							pic_path = m_image_table->item(i, 4)->text();
							QPixmap pixmap(m_config.m_image_path.c_str()+ pic_path);
							pixmap = pixmap.scaled(iconsize, Qt::KeepAspectRatio, Qt::SmoothTransformation);
							point.setY(ypos - iconsize.height()/2.0);
							painter.drawPixmap(point, pixmap);					
							break;
						}
					}				
						//Senkrechte Linie	
						painter.drawLine(xpos-cellpadding_x, ypos-y_offset/2.0, xpos-cellpadding_x, ypos + y_offset/2.0);
						
						//Die letzte senkrechte Linie
						if(j == num_cols-1)
							painter.drawLine(totalwidth + border_x, ypos-y_offset/2.0, totalwidth + border_x, ypos + y_offset/2.0);
							//painter.drawLine(xpos+col_widths[j] + iconsize.width(), ypos-y_offset/2.0, xpos+col_widths[j] + iconsize.width(), ypos + y_offset/2.0);
						
						xpos += col_widths[j];								
				}

				//Waagerechte Linie
				painter.drawLine(border_x - cellpadding_x, ypos + y_offset/2.0, border_x + totalwidth,  ypos+y_offset/2.0);
				ypos += y_offset;
					
				//Untere Seitenrand ist erreicht, neue Seite beginnen
				if(ypos >= qrect.height() - border_y -40)
				{
					printer.newPage();
					ypos = header_ypos + 65;
					new_page = true;	
				
					font.setFamily("Arial");
					font.setWeight(QFont::Bold);
					font.setPointSize(12);
						
					header_xpos = border_x;
					painter.setFont(font);
					painter.drawText(QPointF(header_xpos, header_ypos), "Nr.");
					header_xpos += col_widths[0];
					painter.drawText(QPointF(header_xpos, header_ypos), "Produkt-ID");
					header_xpos += col_widths[1];
					painter.drawText(QPointF(header_xpos, header_ypos), "Produktname");
					header_xpos += col_widths[2];
					painter.drawText(QPointF(header_xpos, header_ypos), "Datum");
					header_xpos += col_widths[3] - 20 + iconsize.width() / 2;
					painter.drawText(QPointF(header_xpos, header_ypos), "Bild");
					
					font.setWeight(QFont::Normal);
					font.setPointSize(8);
					painter.setFont(font);
				}
				with_title = false;			
			}
			painter.end();
		}					
	}
(Solved) Ich habe zum Drucken QTextDocument benutzt was aber zu anderen Problemen führt.