QT passt QLabel an und verwendet es zur Anzeige von Bildern

I. Übersicht

Um Bilder auf dem Label anzuzeigen und entsprechende Koordinaten zu erhalten, sind entsprechende Mausereignisse erforderlich. Allerdings unterstützt QLabel standardmäßig keine Mausereignisfunktionen, wie z. B. Klickereignisse. Um das Klickereignis von QLabel zu realisieren, gibt es im Allgemeinen zwei Möglichkeiten: Eine besteht darin, eine dynamische Bibliotheksdatei zu generieren und diese im Verzeichnis D:\ProgramFiles\Qt\5.12.10\msvc2015_64\plugins\designer abzulegen, das direkt gezogen werden kann im Designer Die andere besteht darin, die Steuerelementklasse direkt hinzuzufügen und das entsprechende Steuerelement zu einem benutzerdefinierten Steuerelement heraufzustufen.

2. Erstellen Sie ein neues Projekt und fügen Sie die Klasse mylabel hinzu

Fügen Sie die Klasse mylabel unter dem Projekt hinzu, das das benutzerdefinierte Steuerelement verwenden muss.

Fügen Sie hier eine Bildbeschreibung ein
Die Header-Datei und die CPP-Datei, in der sich die Klasse mylibel befindet, lauten wie folgt:
myLabel.h

#pragma once

#include <QWidget>
#include <QLabel>
#include <QObject>
#include <QEvent>
#include <QMouseEvent>

extern int xlocation;
extern int ylocation;
class mylabel : public QLabel
{
    
    
	Q_OBJECT    // must include this if you use Qt signals/slots
public:
	explicit mylabel(QWidget *parent = 0);

signals:
	void myClicked();                    // 单击产生的信号
	void myDoubleClicked();              // 双击产生的信号

private:
	void enterEvent(QEvent* event);      // 鼠标进入事件
	void leaveEvent(QEvent *event);      //当鼠离开
	void mousePressEvent(QMouseEvent* event);  //鼠标按下
	void mouseReleaseEvent(QMouseEvent *event);//鼠标释放
	void mouseMoveEvent(QMouseEvent *event);   //鼠标移动
	void mouseDoubleClickEvent(QMouseEvent *event); // 鼠标双击事件
};

mylabel.cpp

#include "myLabel.h"
#include <QDebug>
#include <QMoveEvent>
int xlocation = 0;
int ylocation = 0;
mylabel::mylabel(QWidget *parent) :QLabel(parent)
{
    
    

}
//鼠标进入
void mylabel::enterEvent(QEvent *event)
{
    
    
	qDebug() << "tips:" << "move enter";
	emit myDoubleClicked();
}
//鼠离开
void mylabel::leaveEvent(QEvent *event)
{
    
    
	qDebug() << "tips:" << "mouse leave";
	emit myDoubleClicked();
}
//鼠标按下
void mylabel::mousePressEvent(QMouseEvent *event)
{
    
    
	QString  Str = QString("location: X=%1 Y=%2").arg(event->x()).arg(event->y());
	xlocation = event->x();
	ylocation = event->y();
	//判断鼠标是按下左键还是右键
	if (event->button() == Qt::LeftButton) {
    
    
		qDebug() << "tips:" << "mouse press the left button" + Str;
		emit myClicked();
	}
	else {
    
    
		qDebug() << "tips:" << "mouse press the right button" + Str;
	}
}
//鼠标释放
void mylabel::mouseReleaseEvent(QMouseEvent *event)
{
    
    
	//判断鼠标是按下左键还是右键
	if (event->button() == Qt::LeftButton) {
    
    
		qDebug() << "tips:" << "mouse release the left button";
	}
	else {
    
    
		qDebug() << "tips:" << "mouse release the right button";
	}
}
//鼠标移动
void mylabel::mouseMoveEvent(QMouseEvent *event)
{
    
    
	//持续状态 需要用buttons 用与操作符 进行判断
	if (event->buttons()&Qt::LeftButton) {
    
    
		QString  Str = QString("location:X=%1 Y=%2").arg(event->x()).arg(event->y());
		qDebug() << "tips:" << "mouse move" + Str;
	}
}
//当鼠标双击的时候
void mylabel::mouseDoubleClickEvent(QMouseEvent *event)
{
    
    
	qDebug() << "tips:" << "When the mouse double clicks, the double click signal is issued";
	emit myDoubleClicked();
}

3. Verbessern Sie die Etikettensteuerung

Ziehen Sie in der Benutzeroberfläche von qt Designer das Label-Steuerelement an eine geeignete Position, klicken Sie dann mit der rechten Maustaste, um das hochgestufte Widget auszuwählen , und stufen Sie es in die von uns definierte mylabel-Klasse hoch.
Fügen Sie hier eine Bildbeschreibung ein

Fügen Sie hier eine Bildbeschreibung ein

Hinweis: Nachdem das Steuerelement hochgestuft wurde, wird die Header-Datei des von uns definierten Steuerelements automatisch in unsere UI-Header-Datei aufgenommen. Wie Sie sehen können, befindet sich das Verzeichnis der Header-Datei (myLabel.h) im selben Verzeichnis wie ui_MyLabelTest2.h und muss daher in dieses Verzeichnis kopiert werden.

Fügen Sie hier eine Bildbeschreibung ein

Fügen Sie hier eine Bildbeschreibung ein

4. Referenzieren und verbinden Sie das Signal

Das Mausklickereignis und die Ausführungsfunktion sind über cnnect verbunden, und das Mausdruckereignis (mousePressEvent), das Mausbewegungsereignis usw. sind geschützte Attribute und können daher nicht direkt über den Signalsteckplatz verbunden werden. Hier möchte ich hauptsächlich die Koordinaten des Etiketts über das Mausklickereignis erhalten, daher verwende ich zwei globale Variablen (xlocation und ylocation), um meine Funktion zu realisieren.
Darüber hinaus wird die Funktion ImshowQImage() hinzugefügt, um Bilder im Label-Steuerelement anzuzeigen.

MyLabelTest2::MyLabelTest2(QWidget *parent)
    :QMainWindow(parent)
{
    
    
    ui.setupUi(this);
	//ui.label11->setText("hello word");
	ImshowQImage();
	QObject::connect(ui.label11, &mylabel::myClicked, this, &MyLabelTest2::myLabel_Clicked);
}
void MyLabelTest2::ImshowQImage()
{
    
    

	QString filename = "D:\\PyProject01\\images\\background.jpg";
	QImage image(filename);
	
	//图片自适应label大小
	image.scaled(ui.label11->size(), Qt::KeepAspectRatio);
	ui.label11->setScaledContents(true);
	//显示图片
	ui.label11->setPixmap(QPixmap::fromImage(image));
	//ui.label_processedImage->resize(ui.label_rawImage->pixmap()->size());
	ui.label11->show();
}
void MyLabelTest2::myLabel_Clicked()
{
    
    
	qDebug() << xlocation << " " << ylocation;
	ui.label2->setText(QString::asprintf("(%d,%d)", xlocation,ylocation));
}

5. Wirkungstest

Testen Sie unsere Kontrollereignisse, indem Sie die Maus über das Etikett bewegen, drücken, klicken usw. Die Testergebnisse sind wie folgt:

Fügen Sie hier eine Bildbeschreibung ein
Das endgültige Anzeigebild und der entsprechende Koordinateneffekt werden ebenfalls realisiert.
Fügen Sie hier eine Bildbeschreibung ein
Großartig, großer Spaß. Wenn Sie glauben, dass es für Sie hilfreich ist, klicken Sie einfach dreimal.

Referenzen:
[1] https://blog.csdn.net/lizaijinsheng/article/details/125314092
[2] https://blog.csdn.net/qq_40541268/article/details/85211021
[3] https:// blog .csdn.net/qq_33583069/article/details/109513284
[4] https://blog.csdn.net/augfun/article/details/101083946

Acho que você gosta

Origin blog.csdn.net/qq_44924694/article/details/130819482
Recomendado
Clasificación