mousePressEvent in QLabel

Alles rund um die Programmierung mit Qt
Antworten
darkshine
Beiträge: 102
Registriert: 20. August 2010 11:39

mousePressEvent in QLabel

Beitrag 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]
Herzogswalder
Beiträge: 79
Registriert: 11. Oktober 2009 00:37
Wohnort: Dresden

Beitrag von Herzogswalder »

Mach eine Ableitung von QLabel und überschreibe dort mousePressEvent.
Dieses Label benutzt du dann an Stelle von QLabel.
Gruß, Herzogswalder
Qt 4.8, OS X Mountain Lion
darkshine
Beiträge: 102
Registriert: 20. August 2010 11:39

Beitrag 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
padreigh
Beiträge: 340
Registriert: 13. Mai 2010 10:06

Beitrag 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();
}
Patrick (QtCreator 1.3.1, Qt 4.6.3)
---
template = subdirs
darkshine
Beiträge: 102
Registriert: 20. August 2010 11:39

Beitrag 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.
darkshine
Beiträge: 102
Registriert: 20. August 2010 11:39

Beitrag von darkshine »

Kann ich es auch realisieren, ohne eine neue Klasse zu erstellen?
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Was stört dich daran, eine neue Klasse zu erstellen?
padreigh
Beiträge: 340
Registriert: 13. Mai 2010 10:06

Beitrag 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);
    } 
};
Patrick (QtCreator 1.3.1, Qt 4.6.3)
---
template = subdirs
Antworten