Mainwindow, Testwidget и A Box. TestWidget, TestWidget захватывает события мыши, которые перемещают поле, чтобы следить за мышью.
Код: Выделить всё
#include
#include
#include
class CTestWidget;
class CMainWindow;
class CBox : public QLabel
{
Q_OBJECT
public:
CBox(CTestWidget *parent);
void followMouse(void);
void mouseEntered(bool enter) { mouseEnteredFlag=enter;}
private:
bool mouseEnteredFlag;
};
class CTestWidget : public QLabel
{
Q_OBJECT
public:
CTestWidget(CMainWindow *parent);
protected:
void mouseMoveEvent(QMouseEvent *event);
void enterEvent(QEvent *event);
void leaveEvent(QEvent *event);
private:
CBox *box;
};
class CMainWindow : public QMainWindow
{
Q_OBJECT
public:
CMainWindow(QWidget *parent=0);
private:
CTestWidget *widget;
};
Код: Выделить всё
#include
#include
#include
#include
#include
#include "QtCursorExample.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
CMainWindow window;
window.show();
return app.exec();
}
CMainWindow::CMainWindow(QWidget *parent) : QMainWindow(parent)
{
widget=new CTestWidget(this);
setCentralWidget(widget);
resize(400,400);
move(100,100);
}
CTestWidget::CTestWidget(CMainWindow *parent) : QLabel(parent)
{
setMouseTracking(true); //receive mouse events even when no buttons are pressed
box=new CBox(this); //box attached to the cursor
setStyleSheet("background-color: yellow;");
setAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
setText("THIS IS A TEST");
setMinimumSize(200,200);
setMaximumSize(200,200);
}
void CTestWidget::enterEvent(QEvent *event)
{
box->show();
box->mouseEntered(true);
event->accept();
}
void CTestWidget::leaveEvent(QEvent *event)
{
box->hide();
box->mouseEntered(false);
event->accept();
}
void CTestWidget::mouseMoveEvent(QMouseEvent *event)
{
box->followMouse();
event->accept();
}
CBox::CBox(CTestWidget *parent) : QLabel(parent)
{
mouseEnteredFlag=false;
setWindowFlags(Qt::CustomizeWindowHint|Qt::FramelessWindowHint|Qt::Tool);
setAttribute(Qt::WA_TranslucentBackground); //see through
setFrameShape(QFrame::Box);
setAlignment(Qt::AlignCenter);
setLineWidth(2);
setMinimumSize(15,15);
setMaximumSize(15,15);
}
void CBox::followMouse(void)
{
if(mouseEnteredFlag==true)
{
QPoint globalCursorPos=QCursor::pos();
//centre the box on cursor position
globalCursorPos.setX(globalCursorPos.x()-10/2);
globalCursorPos.setY(globalCursorPos.y()-10/2);
move(globalCursorPos);
}
}
Код: Выделить всё
TARGET = QtCursorExample
TEMPLATE = app
CONFIG += qt
QT += widgets
SOURCES = QtCursorExample.cpp
HEADERS = QtCursorExample.h
QMAKE_CXXFLAGS += -Wall
Подробнее здесь: https://stackoverflow.com/questions/797 ... nt-flicker
Мобильная версия