qt noob braucht hilfe, mit einem stackedwidget und Qpainter

Verschiedenes zu Qt
Antworten
flasherle
Beiträge: 3
Registriert: 3. September 2010 12:00

qt noob braucht hilfe, mit einem stackedwidget und Qpainter

Beitrag 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.
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag 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.
flasherle
Beiträge: 3
Registriert: 3. September 2010 12:00

Beitrag 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...
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag 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..
flasherle
Beiträge: 3
Registriert: 3. September 2010 12:00

Beitrag von flasherle »

viel dank für deine hilfe, ich glaub jetzt hats "geschnackelt". danke.
Antworten