Seite 1 von 1

mousePressEvent in QLabel

Verfasst: 20. September 2010 14:09
von darkshine
Hallo Gemeinde,

ich habe mit QtDesigner ein Hauptfenster erstellt.

Code: Alles auswählen

class myTerm : public QMainWindow
{
	Q_OBJECT


public:

	myTerm(QWidget *parent = 0);
	~myTerm();	

Code: Alles auswählen

//Initalisierung
myTerm::myTerm(QWidget *parent)
: QMainWindow(parent)
{
	//Das Fenster
	ui.setupUi(this);
Jetzt lasse ich mir innerhalb der des Fensters in einem QLabel matrixlabel eine Grafik anzeigen

Code: Alles auswählen

void myTerm::matrix()
{

	 int array[5][5]={{1,0,1,0,1},{0,1,0,1,0},{1,0,1,0,1},{0,1,0,1,0},{1,0,1,0,1}};

   QImage * image = new QImage(5,5,QImage::Format_Indexed8);

   image->setNumColors(2);
   image->setColor(0, qRgb(255,255,255));
   image->setColor(1, qRgb(  0,  0,  0));

   for(int i=0;i<5;i++) {
      for(int j=0;j<5;j++) {
            image->setPixel(i,j,array[i][j]);
      }
   }

   QImage scaledImage = image->scaled(300,300,Qt::IgnoreAspectRatio,Qt::FastTransformation);

   QLabel * label = new QLabel(ui.matrixlabel);
   label->setPixmap(QPixmap::fromImage(scaledImage));
   label->show(); 
}
Nun möchte ich wissen wo ich gerade in dem Fenster klicke. Mit der Funktion

Code: Alles auswählen

void myTerm::mousePressEvent(QMouseEvent *mousetaste)
{
	
	position = mousetaste->pos();
	QString stringpos = QString("%1 x und %2 y\n").arg(position.rx()).arg(position.rx());
	ui.textBrowser_2->insertPlainText(stringpos);	
}
wird von dem ganzen Fenster die Position aufgenommen. Ich möchte die Position und den Ursprung aber nur in meinem "Grafiklabel" haben.
Es müsste irgendwie mit "ui.matrixlabel->mousePressEvent" gehen, aber ich komme an die Funktion nicht ohne Fehlermeldung ran[/quote]

Verfasst: 20. September 2010 15:27
von Herzogswalder
Mach eine Ableitung von QLabel und überschreibe dort mousePressEvent.
Dieses Label benutzt du dann an Stelle von QLabel.

Verfasst: 21. September 2010 09:14
von darkshine
Ich habe das ganze jetzt in eine eigene Klasse geschrieben

Code: Alles auswählen

class myMatrix : public QLabel
{
	Q_OBJECT

public:

	myMatrix(QLabel *parent = 0);
	~myMatrix();	
	void zeichnematrix(QLabel*);
	void virtual mousePressEvent ( QMouseEvent *event );

private:

	QPoint position;
	QString stringpos;

};
Nun erstelle ich ein Objekt der Klasse in myTerm und füge es in ein vorhandenes QLabel ein

Code: Alles auswählen

void myTerm::matrix()
{
    myma = new myMatrix();	
    myma->zeichnematrix(ui.matrixlabel);	
}
Ich glaube zwar nicht, dass dies der Königsweg ist, aber es klappt. Mit meinem mousePressEvent bin ich aber dadurch nicht weiter gekommen.

Ich hatte mir folgenes überlegt

Code: Alles auswählen

void myTerm::mousePressEvent(QMouseEvent *mousetaste)
{
	
	myma->mousePressEvent(mousetaste);	
	ui.textBrowser_2->insertPlainText(myma->mousepos());
	
}
Dies funktioniert aber leider nicht

Verfasst: 21. September 2010 09:54
von padreigh

Code: Alles auswählen

#include <QDebug>
#include <QLabel>

class myLabel : public QLabel {
Q_OBJECT
protected:
     void virtual mousePressEvent ( QMouseEvent *event )
    {
        // mach was was dein QLabel machen soll 
        qDebug() << event->pos() << event->button();
        // lass es alles machen was das normale QLabel machen würde
        QLabel::mousePressedEvent(event);
    }
}
und das nimmst du einfach statt QLabel da wo du es brauchst ... nix zeichnematrix(irgendnlabel) ... das ist 100% methodenidentisch (nat.nur prot./publ.) mit einem QLabel - nur die eine Methode unterscheidet sich ...

Code: Alles auswählen

void myTerm::matrix()
{
   // mal was rein ins image und scale es so das scaledImage was enthält

   myLabel * label = new myLabel(ui.matrixlabel);
   label->setPixmap(QPixmap::fromImage(scaledImage));
   label->show();
}

Verfasst: 21. September 2010 10:39
von darkshine
Viel Dank.
Es läuft jetzt soweit

Code: Alles auswählen

void myTerm::matrix()
{
    label = new myMatrix(ui.matrixlabel);
    label->setPixmap(QPixmap::fromImage(label->scaledImage));
    label->show(); 	
}

Code: Alles auswählen

myMatrix::myMatrix(QLabel *parent)
: QLabel(parent)
{
	zeichnematrix();
}

myMatrix::~myMatrix()
{
}

void myMatrix::zeichnematrix()
{

	int array[5][5]={{1,0,1,0,1},{0,1,0,1,0},{1,0,1,0,1},{0,1,0,1,0},{1,0,1,0,1}};

   QImage * image = new QImage(5,5,QImage::Format_Indexed8);

   image->setNumColors(2);
   image->setColor(0, qRgb(255,255,255));
   image->setColor(1, qRgb(  0,  0,  0));

   for(int i=0;i<5;i++) {
      for(int j=0;j<5;j++) {
            image->setPixel(i,j,array[i][j]);
      }
   }

   scaledImage = image->scaled(300,300,Qt::IgnoreAspectRatio,Qt::FastTransformation);

}

void myMatrix::mousePressEvent(QMouseEvent *mousetaste)
{	
	//position = mousetaste->pos();	
	qDebug() << mousetaste->pos(); 
}
Ich habe scaledImage jetzt als public definiert. Ich hoffe es ist jetzt so wie ihr es gemeint habt.

Verfasst: 21. September 2010 12:41
von darkshine
Kann ich es auch realisieren, ohne eine neue Klasse zu erstellen?

Verfasst: 21. September 2010 15:37
von upsala
Was stört dich daran, eine neue Klasse zu erstellen?

Verfasst: 21. September 2010 16:41
von padreigh
Die Aussage
darkshine hat geschrieben: Es läuft jetzt soweit

Code: Alles auswählen

void myTerm::matrix()
{
    label = new myMatrix(ui.matrixlabel);
    label->setPixmap(QPixmap::fromImage(label->scaledImage));
    label->show();    
} 
und dein geposteter code machen mich nervös ... du murkst da ganz schön rum...

ich kenn die definitionen nicht, abder vermute mal so ....

Code: Alles auswählen

label = new myMatrix(ui.matrixlabel);
label ist ein neues label ... ui.matrixlabel ist ein QLabel aus deiner ui ...
du steckst also dein label in ein anderes label rein ... ok ... kann man machen ... muss man nicht machen ... aber egal.

Code: Alles auswählen

    label->setPixmap(QPixmap::fromImage(label->scaledImage));
also du setzt die Pixmap deines Labels von einem QImage Member deines Labels das du erst mit ner statischen Methode aus QPixmap in eine Pixmap wandelst wofür du es aber public machst ... wofür????
Dein Label kennt seinev Member, das brauchst du nicht extern machen, das geht intern im Label, und zwar sogar OHNE Member der das Bild speichert ... zum Beispiel so:

Code: Alles auswählen

// passende includes 
class myLabel : public QLabel {
Q_OBJECT
public:
myLabel ( QWidget * parent = 0, Qt::WindowFlags f = 0 ) : QLabel(parent,f)
{
     int array[5][5]={{1,0,1,0,1},{0,1,0,1,0},{1,0,1,0,1},{0,1,0,1,0},  {1,0,1,0,1}};

    QImage image = QImage(5,5,QImage::Format_Indexed8);

    image.setNumColors(2);
    image.setColor(0, qRgb(255,255,255));
    image.setColor(1, qRgb(  0,  0,  0));

    for(int i=0;i<5;i++) {
       for(int j=0;j<5;j++) {
             image.setPixel(i,j,array[i][j]);
       }
    } 

    setPixmap(QPixmap::fromImage(        image.scaled(300,300,Qt::IgnoreAspectRatio,Qt::FastTransformation)
    )); 
}
	
protected:
     void virtual mousePressEvent ( QMouseEvent *event )
    {
        // mach was was dein QLabel machen soll
        qDebug() << event->pos() << event->button();
        // lass es alles machen was das normale QLabel machen würde
        QLabel::mousePressedEvent(event);
    } 
};