Artikelverzeichnis
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.
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.
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.
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:
Das endgültige Anzeigebild und der entsprechende Koordinateneffekt werden ebenfalls realisiert.
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