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()
{}

在这里插入图片描述

  • 5
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值