Seite 1 von 1
[gelöst] QPrinter newPage() ...
Verfasst: 23. Mai 2005 11:59
von wem
Hallo,
ich hab ein Problem mit der Printer Klasse (Qt 3.3.4 mit WinXP).
Ich zeichne über einen QPainter (drunter QPrinter). Auf der ersten Seite erscheint alles so wie erwartet. Auf der zweiten Seite nicht mehr (nach dem Aufruft von newPage().
Ich zeichne Rechecke die grau gefüllt werden und darüber einen Text! Dies erscheint auf der ersten Seite so wie es soll - auf der zweiten Seite jedoch wird der Hintergrund vom Text weiß ausgemahlt.
Weiters ist der Seitenrand anders.
Kennt jemand das Problem?
Danke
Werner
Verfasst: 23. Mai 2005 12:02
von FlorianBecker
Hallo Werner,
poste doch bitte einmal deinen bisherigen Code, nach deiner Ausführung kann ich nur daraus schließen, dass du auf der 2. Seite einfach deinen Header nicht mit ausgibst, aber nicht sicher sagen, wo jetzt das Problem liegt. Ich nehme einmal an, du kennst das Beispiel aus der Dokumentation?
Verfasst: 23. Mai 2005 12:52
von wem
Hallo,
die Beispiele aus der Dokumentation kenne ich. Das was mich vor allem wundert ist, daß es auf der 1. Seite so ist wie es sein sollte. Das das eigentliche Zeichen nicht das Problem ist seh ich auch, da ich die selben Routinen verwende um auf den Bildschirm (QWidget) zu zeichen und das ebenfalls richtig gezeichnet wird.
Also das Problem muß wohl mit dem QPrinter bzw. newPage() zu tun haben,
Mit dem Code ist es so ein Problem, da sich das Zeichen über 20 Objekte hinwegzieht. Aber kurz das Prinzip.
Habe zeichenbare Elemente (Objekte), mit einer Position (x, y) und einer Breite und einer Höhe die sich mit Hilfe Ihrer paint(QPainter *) Routine die auf den "painter" zeichen. In dieser Zeichenroutine wird zugleich wenn nötig der Zeichenstift, Brush, ... gewechselt.
Solche Elemente werden in Listen verwaltet (eine Liste pro Seite). Das zu druckende Dokument ist also eine Liste(Seitenliste) von Listen mit Elementen (Elementliste).
Die eigentliche Druck-routine muß jetzt nur noch die Seitenliste durchgehen und die paint() Routine jedes Elementes auf der jeweiligen Seite aufrufen.
Zwischen den Seiten wird ein newPage() aufgerufen.
Die Druck Routine schaut wie folgt aus:
QMRLayoutElementListPage *prelpLastPage = m_lplPageList.last();
QMRLayoutElementListPage *prelpPage = NULL;
for (prelpPage = m_lplPageList.first(); prelpPage; prelpPage = m_lplPageList.next()) {
// Paint the elements
for (preElement = prelpPage->first(); preElement; preElement = prelpPage->next()) {
preElement->paint(ppPainter);
}
if ((ppPrinter != NULL) && (prelpPage != prelpLastPage)) {
// make a new page
ppPrinter->newPage();
// restore the defaults
if (m_prdDefaults != NULL) {
ppPainter->setBrush(*m_prdDefaults->getActBrush());
ppPainter->setFont(*m_prdDefaults->getActFont());
ppPainter->setPen(*m_prdDefaults->getActPen());
}
}
}
Die Paint Routine des Rechtecks:
// if the paitner is valid
if (ppPainter != NULL) {
if (m_prdDefaults->getActBrush() != m_pbBrush) {
/** if The Brush not set then set the default Brush
*/
if (m_pbBrush != NULL) {
ppPainter->setBrush(*m_pbBrush);
m_prdDefaults->setActBrush(m_pbBrush);
} else {
ppPainter->setBrush(*m_prdDefaults->getBrushList().getFirst());
m_prdDefaults->setActBrush(m_prdDefaults->getBrushList().getFirst());
}
}
if (m_prdDefaults->getActPen() != m_ppPen) {
/** If Pen ist not set then set the default
*/
if (m_ppPen != NULL) {
ppPainter->setPen(*m_ppPen);
m_prdDefaults->setActPen(m_ppPen);
} else {
ppPainter->setPen(*m_prdDefaults->getPenList().getFirst());
m_prdDefaults->setActPen(m_prdDefaults->getPenList().getFirst());
}
}
unsigned int uiShiftSize = (unsigned int) (m_prdDefaults->getActPen()->width())/2;
if (m_prdDefaults->getActPen()->width() == 1)
uiShiftSize = 1;
QRect rRect(m_uix, m_uiy, m_uiWidth + uiShiftSize, m_uiHeight + uiShiftSize);
ppPainter->drawRect(rRect);
}
Der Painter auf den QPrinter wird außerhalb erzeugt und der Druckroutine übergeben.
Danke
Werner
Verfasst: 23. Mai 2005 15:35
von wem
Hi,
der Teil mit dem Text und dem weißen Hintergrund ist gelöst, anscheinend setzt newPage() die Option backgroundmode auf OpaqueMode und nicht wie es sein solte auf TransparentMode!
Werner