Seite 1 von 1

qt noob braucht hilfe, mit einem stackedwidget und Qpainter

Verfasst: 3. September 2010 14:01
von flasherle
hi leute wie schon geschrieben bräucht eich mal Hilfe. Ich hab vor 2 Tagen angefangen mir mal qt anzuschauen und bin bisher ganz begeistert, aber habe noch so eineige probleme.
Eins ist das ichin ein, über den designer eingefügtes stacked Widget, auf seite 3 ein paar sachen malen will.

malen klappt ganz gut nur überall und nicht nur aus seite 3 des stacked widgets. könnt ihr mir dabei vll helfen?

Ps.: ich arbeite mit VS2005 und qt 4.4.3.

Code: Alles auswählen

#include "taschenrechner.h"
#include "myAdd.h"
#include "mySub.h"
#include <qpainter.h>


Taschenrechner::Taschenrechner(QWidget *parent, Qt::WFlags flags)
	: QMainWindow(parent, flags)
{
	ui.setupUi(this);

	
	
	MyAdd *addWidget = new MyAdd(this);
	MySub *subWidget = new MySub(this);

	ui.InputA->insert ("0");
	ui.InputB->insert ("0");
	ui.InputA_2 -> setText("0");
	ui.InputB_2 -> setText("0");

	QPixmap bild("C:\\testbilder\\logo.jpg"); 
	ui.imglabel->setPixmap(bild);
	
	QPushButton *quit = new QPushButton(tr("Quit"), ui.page_3);
     quit->setGeometry(200,200,25,15);
     quit->setFont(QFont("Times", 10, QFont::Bold));	 	

     connect(quit, SIGNAL(clicked()), qApp, SLOT(quit()));

	connect(ui.calculate, SIGNAL(clicked()),addWidget, SLOT(addAB()));
	connect(ui.calculate_2, SIGNAL(clicked()),subWidget, SLOT(subAB()));
	connect(ui.actionQuit,SIGNAL (triggered()), this, SLOT(slotClose()));
	connect(ui.actionAdd, SIGNAL(triggered()), this, SLOT(showAdd()));
	connect(ui.actionSub, SIGNAL(triggered()), this, SLOT(showSub()));
	connect(ui.actionSpielwiese, SIGNAL(triggered()),this, SLOT(showSpielwiese()));

}

Taschenrechner::~Taschenrechner()
{

}

void Taschenrechner::paintEvent(QPaintEvent *e)
{
  QBrush b1( Qt::blue );
  QBrush b2( Qt::green, Qt::Dense6Pattern );       
  QBrush b3( Qt::NoBrush );                           
  QBrush b4( Qt::CrossPattern );   
	QPainter *paint = new QPainter();
		paint->begin(this);
	  paint->setPen( Qt::black );
  paint->setBrush( b1 );
  paint->drawRect( 50, 50, 200, 100 );
  paint->setBrush( b2 );
  paint->drawRoundRect( 50, 150, 200, 100, 20, 20 );
  paint->setBrush( b3 );
  paint->drawEllipse( 250, 50, 200, 100 );
  paint->setBrush( b4 );
  paint->drawPie( 250, 150, 200, 100, 45*16, 90*16 );
  paint->end();
	

}



void Taschenrechner::slotClose(){ 
	close();
}

void Taschenrechner::showAdd(){
	
	ui.stackedWidget -> setCurrentIndex(0);
}
 
void Taschenrechner::showSub(){
	ui.stackedWidget -> setCurrentIndex(1);
}

void Taschenrechner::showSpielwiese(){
	ui.stackedWidget -> setCurrentIndex(2);

}



PS.: ist auch noch anderer müll vom testen drin, aber das wichtigste denke ich sieht man raus.

Danke euch schon mal im Vorraus für ein paar denkanstöße und tipps. vielen dank.

Verfasst: 4. September 2010 00:12
von solarix
Ganz einfach: programmiere objektorientiert:

1. Schreibe ein eigenes Widget (abgeleitet von QWidget), welches im paintEvent den Kram zeichnet
2. Füge eine Instanz deines Widgets im Konstruktor von "Taschenrecher" in das Stackedwidget ein

fertig.

Verfasst: 7. September 2010 11:31
von flasherle
Danke für die Hilfe schon mal. ich hab das ganze mal umgesetzt aber irgendwie zeigt er mir das geschmiere net an :)

ich denke mal irgendein dummer fehler, oder ich hab alles falsch verstanden an deinerhilfestellung ;)

drive.h

Code: Alles auswählen

#ifndef DRIVE_H
#define DRIVE_H
 
#include <QWidget>
 
class QWidget;
 
class drive : public QWidget{
	Q_OBJECT
 
QWidget *myWidget;
 
public:
	drive (QWidget*);
	~drive();
private slots:
	
protected:
  virtual void paintEvent(QPaintEvent*);
};
 
#endif 
drive.cpp

Code: Alles auswählen

#include "drive.h"
#include <qpainter.h>
 
drive::drive(QWidget *wid){
	myWidget = wid; 
}
 
drive::~drive(){
}


	
void drive::paintEvent(QPaintEvent *e)
{
  QBrush b1( Qt::blue );
  QBrush b2( Qt::green, Qt::Dense6Pattern );       
  QBrush b3( Qt::NoBrush );                           
  QBrush b4( Qt::CrossPattern );   
	QPainter *paint = new QPainter();
		paint->begin(this);
	  paint->setPen( Qt::black );
  paint->setBrush( b1 );
  paint->drawRect( 50, 50, 200, 100 );
  paint->setBrush( b2 );
  paint->drawRoundRect( 50, 150, 200, 100, 20, 20 );
  paint->setBrush( b3 );
  paint->drawEllipse( 250, 50, 200, 100 );
  paint->setBrush( b4 );
  paint->drawPie( 250, 150, 200, 100, 45*16, 90*16 );
  paint->end();
	

}

ausschnitt aus taschenrechner.cpp

Code: Alles auswählen

aschenrechner::Taschenrechner(QWidget *parent, Qt::WFlags flags)
	: QMainWindow(parent, flags)
{
	ui.setupUi(this);
	
	MyAdd *addWidget = new MyAdd(this);
	MySub *subWidget = new MySub(this);
	drive *driveWidget = new drive (ui.page_3);
	

...
ich hoffe du kannst mir ahnungslosem noch mal ein klapps auf den hinterkopf geben ;)

danke schon mal...

Verfasst: 7. September 2010 13:11
von solarix
Viel fehlt da nicht mehr:

Code: Alles auswählen

  // 1. "myWidget" brauchst du nicht, aber dafür solltest du noch den korrekten Konstruktor aufrufen. Sonst plazierst du das Widget nicht auf dem Tab:
 drive::drive(QWidget *parent)
    : QWidget(parent)
 {
 } 


 ... 
  // 2. evt. noch Grösse festlegen:
 drive *driveWidget = new drive (ui.page_3);
 driveWidget->setGeometry(....);
 driveWidget->show(); // sicherheitshalber.. sollte eigentlich vom parent geregelt werden.

Überleg dir evt. noch ein System für Klassenbezeichner... wenn du schon ein "Taschenrechner" und ein "MyAdd" hast, solltest du auch "Drive" oder "DriveWidget" nehmen und nicht "drive"....

hth..

Verfasst: 7. September 2010 13:49
von flasherle
viel dank für deine hilfe, ich glaub jetzt hats "geschnackelt". danke.