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