QT界面:重寫鼠標事件/實時顯示Label中鼠標位置

爲了在QT UI界面的狀態欄實時顯示鼠標在Label中的位置,需要重寫鼠標事件MouseMoveEvent()。 但是MouseMoveEvent爲了不過多消耗資源,默認需要鼠標按下捕捉到。因此需要在構造函數中設置setMouseTracking(true),這樣鼠標在不按下時移動也能捕捉到。

示例

環境:Win10-x64+VS2015+Qt5.9.7

首先創建一個Qt GUI Application,工程名爲CMyLabel。

頭文件

CMyLabel.h

#pragma once

#include <QtWidgets/QMainWindow>
#include "ui_CMyLabel.h"

#include <QLabel>
#include <QMouseEvent>
#include <QGridLayout>
#include <QDebug>

#pragma execution_character_set("utf-8")

class CMyLabel : public QMainWindow
{
	Q_OBJECT

public:
	CMyLabel(QWidget *parent = Q_NULLPTR);

private:
	Ui::CMyLabelClass ui;

private:
	QLabel *m_statusLabel;
	QLabel *m_mousePosLabel;

private slots:
	void receiveMessageSlot(QString str);
};


#ifndef MYLABEL_H
#define MYLABEL_H

class MyLabel : public QLabel
{
	Q_OBJECT
public:
	MyLabel(QWidget *parent = 0);
	~MyLabel();

protected:
	void mousePressEvent(QMouseEvent * event);
	void mouseMoveEvent(QMouseEvent *e);
	void mouseReleaseEvent(QMouseEvent * event);
private:
	
signals:
	void sendMessageSignal(QString str);
};

#endif // CMYLABEL_H


源文件

CMyLabel.cpp

#include "CMyLabel.h"

CMyLabel::CMyLabel(QWidget *parent)
	: QMainWindow(parent)
{
	ui.setupUi(this);

	m_statusLabel = new QLabel;
	m_statusLabel->setText(tr("位置:"));
	m_statusLabel->setFixedWidth(50);
	m_mousePosLabel = new QLabel;
	m_mousePosLabel->setText(tr("(0,0)"));
	m_mousePosLabel->setFixedWidth(100);

	//在狀態欄中加入顯示控件
	statusBar()->addPermanentWidget(m_statusLabel);
	statusBar()->addPermanentWidget(m_mousePosLabel);

	MyLabel *m_myLabel1 = new MyLabel();
	MyLabel *m_myLabel2 = new MyLabel();
	m_myLabel1->setStyleSheet("background-color: rgb(250,250,0);");
	m_myLabel2->setStyleSheet("background-color: rgb(0,250,0);");

	QObject::connect(m_myLabel1, SIGNAL(sendMessageSignal(QString)), this, SLOT(receiveMessageSlot(QString)));
	QObject::connect(m_myLabel2, SIGNAL(sendMessageSignal(QString)), this, SLOT(receiveMessageSlot(QString)));

	QHBoxLayout *hlayout1 = new QHBoxLayout;

	hlayout1->addWidget(m_myLabel1);
	hlayout1->addWidget(m_myLabel2);

	QGridLayout *vlayout = new QGridLayout;
	vlayout->addLayout(hlayout1, 0, 0);

	QWidget *widget = new QWidget();
	this->setCentralWidget(widget);
	centralWidget()->setLayout(vlayout);

	this->setMouseTracking(true);
	centralWidget()->setMouseTracking(true);
}


void CMyLabel::receiveMessageSlot(QString str)
{
	m_mousePosLabel->setText(str);
}


MyLabel::MyLabel(QWidget *parent)
	: QLabel(parent)
{
	this->setMouseTracking(true);
}


void MyLabel::mouseMoveEvent(QMouseEvent *e)
{
	qDebug() << "(" + QString::number(e->x()) + "," + QString::number(e->y()) + ")";
	QString sendMsg = "(" + QString::number(e->x()) + "," + QString::number(e->y()) + ")";
	emit sendMessageSignal(sendMsg);
}


void MyLabel::mousePressEvent(QMouseEvent * event)
{
	qDebug() << "event->pos()" << event->pos();
}

void MyLabel::mouseReleaseEvent(QMouseEvent * event)
{
	qDebug() << "event->pos()"<< event->pos();
}


MyLabel::~MyLabel()
{}

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章