drawPixmap Problem [gelöst]

Alles rund um die Programmierung mit Qt
Antworten
dynamo2
Beiträge: 13
Registriert: 20. September 2007 09:43
Kontaktdaten:

drawPixmap Problem [gelöst]

Beitrag von dynamo2 »

Hallo!

ich möchte z.b. einen Kreis auf dem Bildschirm darstellen und ihn gleichzeitig in einem Puffer ablegen, damit falls was verdeckt wird, er später auch wieder da ist. nur leider hab ich keinen plan, was ich hier falsch mach. bitte helft mir :/

die klassen header:

Code: Alles auswählen

#include <QObject>
#include <QPixmap>
#ifndef CLASS_H
#define CLASS_H

class meinfenster : public QWidget {
public:
	meinfenster(QWidget * parent =0 );
};

class zeichenf : public QWidget {
Q_OBJECT
public:
	zeichenf(QWidget *parent = 0);

protected:
	virtual void paintEvent(QPaintEvent *);
public slots:
	void startstoprs232(void);
private:
QPixmap *offscreen;
};
#endif CLASS_H
und das hauptprogramm:

Code: Alles auswählen

#include <QApplication>
#include <QFont>
#include <QPushButton>
#include <QObject>
#include <QPainter>
//#include <QSlider>
//#include <QLCDNumber>
#include <QVBoxLayout>
#include <QPaintEvent>
#include <QFrame>
#include <QMenu>
#include <QPixmap>
#include "moc_class.cpp"

int onoff;

zeichenf::zeichenf(QWidget * parent) : QWidget(parent){
	offscreen = new QPixmap(800,800);
	offscreen->fill( Qt::white );
	update();
}

void zeichenf::startstoprs232(void){

	if(onoff)
		onoff=0;
	else
		onoff=1;
	update();
}

void zeichenf::paintEvent(QPaintEvent *){
	
	QPainter painter(offscreen);
	painter.begin( this );
	//QBrush brush( Qt::blue );
	painter.drawText(200, 100,tr("Angle = ") + QString::number(onoff));
	painter.setPen( Qt::blue );
	
	painter.drawText(200, 100,tr("Angle = ") + QString::number(20));
	painter.drawPoint(80,80);
	painter.drawEllipse(30,30,10,10);

	painter.drawPixmap(QPoint(0,0), offscreen);
	painter.end();

}

meinfenster::meinfenster(QWidget * parent):QWidget(parent){
	setFixedSize(800, 600);

	zeichenf * screen = new zeichenf;
	
	QPushButton * b1=new QPushButton("quit",this);
	connect(b1,SIGNAL(clicked()),qApp,SLOT(quit()));
	QPushButton * rs232 = new QPushButton ("Read", this);
	connect(rs232,SIGNAL(clicked()),screen,SLOT(startstoprs232()));

	

	QGridLayout *gridLayout = new QGridLayout;
	gridLayout->addWidget(b1, 0, 0);
	gridLayout->addWidget(rs232, 1, 0);
	gridLayout->addWidget(screen, 1, 1, 2, 1);
	gridLayout->setColumnStretch(1, 10);
	setLayout(gridLayout);

}

int main(int argc, char *argv[]){

	onoff = 0;
	QApplication app(argc, argv);
	meinfenster einfenster(0);
	einfenster.show();
	int result = app.exec();

	return result;
	

}
der fehler:

Code: Alles auswählen

In Datei, eingefügt von moc_class.cpp:10,
                 von main.cpp:13:
class.h:23:8: Warnung: mehrere Token am Ende der Direktive #endif
main.cpp: In member function »virtual void zeichenf::paintEvent(QPaintEvent*)«:
main.cpp:44: Fehler: keine passende Funktion für Aufruf von »QPainter::drawPixmap(QPoint, QPixmap*&)«
/usr/include/qt4/QtGui/qpainter.h:310: Anmerkung: Kandidaten sind: void QPainter::drawPixmap(const QRectF&, const QPixmap&, const QRectF&)
/usr/include/qt4/QtGui/qpainter.h:696: Anmerkung:                  void QPainter::drawPixmap(const QRect&, const QPixmap&, const QRect&)
/usr/include/qt4/QtGui/qpainter.h:727: Anmerkung:                  void QPainter::drawPixmap(int, int, int, int, const QPixmap&, int, int, int, int)
/usr/include/qt4/QtGui/qpainter.h:733: Anmerkung:                  void QPainter::drawPixmap(int, int, const QPixmap&, int, int, int, int)
/usr/include/qt4/QtGui/qpainter.h:738: Anmerkung:                  void QPainter::drawPixmap(const QPointF&, const QPixmap&, const QRectF&)
/usr/include/qt4/QtGui/qpainter.h:743: Anmerkung:                  void QPainter::drawPixmap(const QPoint&, const QPixmap&, const QRect&)
/usr/include/qt4/QtGui/qpainter.h:701: Anmerkung:                  void QPainter::drawPixmap(const QPointF&, const QPixmap&)
/usr/include/qt4/QtGui/qpainter.h:706: Anmerkung:                  void QPainter::drawPixmap(const QPoint&, const QPixmap&)
/usr/include/qt4/QtGui/qpainter.h:716: Anmerkung:                  void QPainter::drawPixmap(int, int, const QPixmap&)
/usr/include/qt4/QtGui/qpainter.h:711: Anmerkung:                  void QPainter::drawPixmap(const QRect&, const QPixmap&)
/usr/include/qt4/QtGui/qpainter.h:721: Anmerkung:                  void QPainter::drawPixmap(int, int, int, int, const QPixmap&)
make: *** [main.o] Fehler 1

bin für jede hilfe dankbar!

dnm
Zuletzt geändert von dynamo2 am 21. September 2007 12:19, insgesamt 1-mal geändert.
m0le
Beiträge: 11
Registriert: 7. September 2007 15:51

Beitrag von m0le »

Wenn ich das richtig seh, is dein "offscreen" ein Zeiger und du brauchst eine Referenz, also einfach derefenzieren und du solltest das Problem nicht mehr haben:

painter.drawPixmap(QPoint(0,0), *offscreen);
C_R
Beiträge: 129
Registriert: 25. April 2007 15:12

Beitrag von C_R »

versuchs mal mit

painter.drawPixmap(QPoint(0,0), *offscreen);

argh you are fast as schnitzel :)
dynamo2
Beiträge: 13
Registriert: 20. September 2007 09:43
Kontaktdaten:

Beitrag von dynamo2 »

hi!

jop! fast. programm lässt sich jetz kompilieren... nur leider seh ich nix :/
irgendwas stimmt also no ned....

dnm
C_R
Beiträge: 129
Registriert: 25. April 2007 15:12

Beitrag von C_R »

Mehr Infos bitte :)
Musst uns schon eine Richtung vorgeben, woran es liegen könnte? Was du schon ausprobiert hast (wenn nix ausprobiert, dann Versuch den Fehler durch Probieren etc ersteinmal festzunageln)..
dynamo2
Beiträge: 13
Registriert: 20. September 2007 09:43
Kontaktdaten:

Beitrag von dynamo2 »

hallo,

also ich habe nur die PaintEvent verändert, die sieht jetzt so aus:

Code: Alles auswählen

void zeichenf::paintEvent(QPaintEvent *){
	
	QPainter painter( this);
	painter.begin( offscreen);
	//QBrush brush( Qt::blue );
	painter.drawText( 200, 100,tr("Angle = ") + QString::number(onoff));
	painter.setPen( Qt::blue);
	
	painter.drawText( 200, 100, tr("Angle = ") + QString::number(20));
	painter.drawPoint( 80, 80);
	painter.drawEllipse( 30, 30, 10, 10);

	painter.drawPixmap(QPoint(0,0), *offscreen);
	painter.end();

}
(((habe painter(offscreen) in painter(this) geändert .bei painter(offscreen) tut sich gar nix)))

auf diese art, wird die oben initialisierte weiße offscreenfläche schön angezeigt, jedoch nicht der kreis oder sonstiges :/

dnm
C_R
Beiträge: 129
Registriert: 25. April 2007 15:12

Beitrag von C_R »

Wie siehts denn mit?

Code: Alles auswählen

QPainter painter(offscreen);
painter.initFrom(this);

aus?
dann aber ohne begin() und end()

Qt_API:
Note that most of the time, you can use one of the constructors instead of begin(), and that end() is automatically done at destruction.
dynamo2
Beiträge: 13
Registriert: 20. September 2007 09:43
Kontaktdaten:

Beitrag von dynamo2 »

ne, geht ned, zeigt dann ein leeres fenster an, also nicht mal die weiße ursprünglich initialisierte fläche

Code: Alles auswählen

void zeichenf::paintEvent(QPaintEvent *){
	
	//QPainter painter( this);
	//painter.begin( offscreen);
	QPainter painter(offscreen);
	painter.initFrom(this);
	//QBrush brush( Qt::blue );
	painter.drawText( 200, 100,tr("Angle = ") + QString::number(onoff));
	painter.setPen( Qt::blue);
	
	painter.drawText( 200, 100, tr("Angle = ") + QString::number(20));
	painter.drawPoint( 80, 80);
	painter.drawEllipse( 30, 30, 10, 10);

	painter.drawPixmap(QPoint(0,0), *offscreen);
	//painter.end();

}
dnm
m0le
Beiträge: 11
Registriert: 7. September 2007 15:51

Beitrag von m0le »

Wird dein PaintEvent überhaupt aufgerufen?
Also hast du an irgendeiner Stelle ein update() oder so, dass dafür sorgt?

Vielleicht mal Debugger anwerfen, Breakpoint auf den PaintEvent setzen und schaun, ob er da anhält, oder nicht...
dynamo2
Beiträge: 13
Registriert: 20. September 2007 09:43
Kontaktdaten:

Beitrag von dynamo2 »

PaintEvent wird sicher aufgerufen, ist ein update() drin, siehe oben
dynamo2
Beiträge: 13
Registriert: 20. September 2007 09:43
Kontaktdaten:

Beitrag von dynamo2 »

hilfe :cry:
dynamo2
Beiträge: 13
Registriert: 20. September 2007 09:43
Kontaktdaten:

Beitrag von dynamo2 »

hallo,

hab jetzt gemerkt, dass ich schon zeichne,... aber nicht auf dem offscreen, der aber auch dargestellt wird. ich zeichen quasi im fenster den offscreen und hinter oder unter dem liegen meine kreise... sonstwas. wie kann ich ihm weiß machen, dass er auf dem offscreen zeichnen soll?

Code: Alles auswählen

void zeichenf::paintEvent(QPaintEvent *){
	
	QPainter painter( this);
	painter.begin( offscreen);
	//QPainter painter(offscreen);
	//painter.initFrom(this);
	//QBrush brush( Qt::blue );
	painter.setPen( Qt::blue);
	
	painter.drawText( 200, 100, tr("Angle = ") + QString::number(20));
	painter.drawPoint( 80, 80);
	painter.drawEllipse( 30, 30, 10, 10);

	painter.drawPixmap(QPoint(0,0), *offscreen);
	painter.end();

}
dnm
dynamo2
Beiträge: 13
Registriert: 20. September 2007 09:43
Kontaktdaten:

Beitrag von dynamo2 »

Hallo, habs mit hilfe einer quelle letzendlich geschaft, mir is selbst noch nicht ganz klar, warum es jetzt geht, hab jetzt nicht von QWidget vererbt sondern von QFrame, was aber ansich nichts machen sollte. auf jeden fall, hab ich den quelltext hier verwendet:
http://www.pro-linux.de/work/qt4/qt4-teil1.html
unter 3.4. Zeichnen

was mir auch nicht klar war, ist, dass man erst einen qpainter(offscreen) erstellt, indem man zeichnet... dann einen zweiten qpainter(this) mit dem dann drapPixmap(...,offscreen) möglich ist. man muß also ZWEI verwenden und darf erst gar nicht erst versuchen das mit einem schaffen zu wollen.

vielen dank trotzdem!!

dnm2
Antworten