Mit Painter erzeugte LED in QWIdget öfters verwenden

Alles rund um die Programmierung mit Qt
Antworten
insertcoin
Beiträge: 54
Registriert: 19. Mai 2008 13:08

Mit Painter erzeugte LED in QWIdget öfters verwenden

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
mastercad
Beiträge: 8
Registriert: 24. Juli 2008 07:59
Kontaktdaten:

Beitrag 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
insertcoin
Beiträge: 54
Registriert: 19. Mai 2008 13:08

Beitrag 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??
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

widget->setLayout(gridLayout); ist unnötig und gibt u.U. Probleme - warum willst Du das Layout immerzu neu setzen?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
insertcoin
Beiträge: 54
Registriert: 19. Mai 2008 13:08

Beitrag 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 ..
insertcoin
Beiträge: 54
Registriert: 19. Mai 2008 13:08

Beitrag 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??
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Naja, wenn man dem QPixmap keine Größe mitteilt, dann ist auch nur 0x0 Pixel groß.
insertcoin
Beiträge: 54
Registriert: 19. Mai 2008 13:08

Beitrag 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 ..
mastercad
Beiträge: 8
Registriert: 24. Juli 2008 07:59
Kontaktdaten:

Beitrag 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
insertcoin
Beiträge: 54
Registriert: 19. Mai 2008 13:08

Beitrag 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 ???
insertcoin
Beiträge: 54
Registriert: 19. Mai 2008 13:08

Beitrag 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 ..
Antworten