Seite 1 von 1

Mit Painter erzeugte LED in QWIdget öfters verwenden

Verfasst: 27. Juli 2008 16:46
von insertcoin
Hallo miteinander,

ich bins schon wieder ..
ich hab mir nun ne LED mit Beschriftung in ein QWidget gemalt .. dieses Bild möchte ich in meiner GUI mehrmals übereinander einsetzen. Dazu hab ich das bemalte QWIdget einfach mehrmals in ein QVBoxLayout und dann in mein Gui Widget eingefügt, aber egal wie ich es mache, es wird immer an die gleiche Stelle gemalt und ist nur einmal sichtbar.
ISt mir nicht ganz klar, weil es doch lauter einzelne Widgets sind ( und ich hab das mal in Java so gemacht, da hats funktioniert).
Auf jeden Fall sollte ich wohl mit einem QPicture, QPixmap oder sowas arbeiten, hab ich aber auch noch nichts auf die Reihe gebracht.
Kann mir da jemand nen Tyo in die richtige Richtung geben??
Schonmal danke ..

Gruß insercoin

Verfasst: 27. Juli 2008 18:21
von Christian81
Also entweder Du erzeugst ein QImage/QPixmap und stellst es in n QLables dar oder Du erstellst Dir eine eigene Klasse, überschreibst das QPaintEvent und malst dort dein LED.
Was Du aber auf alle Fälle nicht machen kannst, ein und dieselbe Instanz eines QWidgets n-Mal irgendwo unterbringen...

Verfasst: 27. Juli 2008 18:22
von mastercad
hilfreich wären nen paar Zeilen code insertcoin, damit man sieht wie dus dir vorstellst und wo vielleicht der Fehler liegt.

mfg
CAD

Verfasst: 28. Juli 2008 00:20
von insertcoin
Ok, ich versuch das hier mal ein bisschen besser darzustellen ..
das ist meine LED Klasse..

Code: Alles auswählen


/***********/
/*  LED.H      */
/***********/

#ifndef LED_H
#define LED_H

#include <QWidget>

class LED : public QWidget
{
    Q_OBJECT

public:
    LED(const char *newText);
    
    QColor *LEDColor;
    QString *LEDText;
    
    void setColor(QColor *newColor);


protected:
    void paintEvent(QPaintEvent *event);

};

#endif

/*********************************************/

/***********/
/*  LED.CPP  */
/***********/


#include <QPainter>

#include "led.h"


LED::LED(const char *newText)
{
 	LEDColor = new QColor(Qt::lightGray);
 	LEDText = new QString(newText);
}


void LED::paintEvent(QPaintEvent *)
{
    QPainter *painter = new QPainter(this);
    
   	//Painter in die Mitte links des Widgets setzen.
    painter->translate(rect().width()/4, rect().height()/2);
    
    QRadialGradient *radialGradient = new QRadialGradient(0, 0, 60, 0, 0);
    radialGradient->setColorAt(0.0, Qt::white);
	radialGradient->setColorAt(0.2, *LEDColor);
    radialGradient->setColorAt(1.0, Qt::black);
    
    painter->setPen(Qt::NoPen);
    painter->setBrush(*radialGradient);

    painter->setRenderHint(QPainter::Antialiasing, true);

    painter->drawEllipse(QRect(-25, -25, 35, 35));
    
    painter->resetTransform();
    painter->translate(rect().width()/2, rect().height()/2);
    painter->setPen(Qt::SolidLine);
    painter->drawText(0, 0, *LEDText); 
}

void LED::setColor(QColor *newColor)
{
 	 LEDColor = newColor;
 	 update();	   	 
}
Und die wollte ich etwa so einbinden, aber das funktioniert irgendwie nicht ..

Code: Alles auswählen

    
    LED *led[9];
    
    QGridLayout *gridLayout=new QGridLayout;
    QWidget *widget = new QWidget;

  for (int i=0;i<9;i++)
  {
     led[i]=new LED("dfef");
    gridLayout->addWidget(led[i],i,1);
    widget->setLayout(gridLayout);
  }  

Bitte nichts zum Code, bin da gerade am rumbasteln weils nicht funktionieren möchte.. =)
ICh hab auch erst gedacht dass ich vielleicht irgendwie immer die gleiche Instanz reinsetz, aber das müsste doch passen oder??
Auf jeden Fall malt der mir immer nur eine LED, nur entsprechend versetzt wenn ich verschieden viel reinsetz .. hab ich da was übersehen??

Verfasst: 28. Juli 2008 08:33
von Christian81
widget->setLayout(gridLayout); ist unnötig und gibt u.U. Probleme - warum willst Du das Layout immerzu neu setzen?

Verfasst: 28. Juli 2008 12:02
von insertcoin
oh, das war ein fehler beim rauskopieren .. ich hab der file nur den relevanten teil entnommen und hab das ausversehen da mit reinkopiert .. soll natürlich außen hin ..

Verfasst: 28. Juli 2008 13:49
von insertcoin
Ich habs nun so probiert, meine LED Klasse ist ein QLabel. ICh mal alles in ein QPixmap und setz das dann ins Label .. aber wenn ich das Label anzeige, seh ich gar nichts .. ich hab langsam keine Idee mehr ..

Code: Alles auswählen

void LED::paintEvent(QPaintEvent * event)
{ 
  	pixmap = new QPixmap();
    QPainter *painter = new QPainter(pixmap);
    
   	//Painter in die Mitte links des Widgets setzen.
    painter->translate(rect().width()/4, rect().height()/2);
    
    QRadialGradient *radialGradient = new QRadialGradient(0, 0, 60, 0, 0);
    radialGradient->setColorAt(0.0, Qt::white);
	radialGradient->setColorAt(0.2, *LEDColor);
    radialGradient->setColorAt(1.0, Qt::black);
    
    painter->setPen(Qt::NoPen);
    painter->setBrush(*radialGradient);

    painter->setRenderHint(QPainter::Antialiasing, true);

    painter->drawEllipse(QRect(-25, -25, 35, 35));
    
    painter->resetTransform();
    painter->translate(rect().width()/2, rect().height()/2);
    painter->setPen(Qt::SolidLine);
    painter->drawText(0, 0, *LEDText);
    
    this->setPixmap(*pixmap); 
}
schließlich versuch ichs in meiner main mit

Code: Alles auswählen

LED test("irgendwas");
test.show();
anzuzeigen, aber nichts !!

sieht jemand den fehler den ich hier mach, geht das so überhaupt??

Verfasst: 28. Juli 2008 14:06
von upsala
Naja, wenn man dem QPixmap keine Größe mitteilt, dann ist auch nur 0x0 Pixel groß.

Verfasst: 28. Juli 2008 14:18
von insertcoin
hab ich schon gemacht, alle möglichen Größen sogar .. und auch dem Label hab ich unterschiedliche Größen mit
setBaseSize()
gegeben. Aber wenn ich es anzeige, ist das Fenster nur minimal groß und enthält nichts ..

Verfasst: 28. Juli 2008 15:14
von mastercad
wieso baust du alles nochmal um wenns schon funktioniert hat?

nimm doch einfach das

Code: Alles auswählen

    widget->setLayout(gridLayout); 
aus der for schleife und bau es darunter ein. Das sollte schon reichen und die Widgets untereinander anzeigen.

mfg
CAD

Verfasst: 28. Juli 2008 15:40
von insertcoin
das ist ja das problem, es funtioniert nicht..
selbst wenn ich 1000 instanzen von dem bemalten widget in ein layout packe .. malt er mir nur eins rein, ich denk mal dass die LED trotz der unterschiedlichen WIdgets immer an die gleiche Stelle im Bildschirm gemalt wird ..
deshalb hab ich verscuht es über QPixmap -> QLAbel zu lösen, aber dann zeigt er mir ja gar nichts mehr an ..

gibt es niemand der viellecith mal was ähnliches realisiert hat, und ein beispiel für mich hätte ???

Verfasst: 28. Juli 2008 16:29
von insertcoin
Ich hab das Problem, ich hab auf den Painter kein begin() und end() ausgeführt .. deshalb hat der die neuen Widgets immer reingesetzt aber nie bemalt ..
Das macht mich jetzt echt fertig, wegen der Kleinigkeit hab ich soviel Zeit verhauen .. oh man ..

Danke für eure Tipps ..