Пользовательский курсор мыши в C ++ с использованием QT Toolkit - постоянный мерцаниеC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Пользовательский курсор мыши в C ++ с использованием QT Toolkit - постоянный мерцание

Сообщение Anonymous »

Я реализовал пользовательский курсор в C ++, используя инструментарий QT 5.15, как показано в этой небольшой тестовой программе, содержащей три класса: < /p>
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;
};
qtcursorexample.cpp

Код: Выделить всё

#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);
}
}
pro файл

Код: Выделить всё

TARGET    = QtCursorExample
TEMPLATE  = app
CONFIG   += qt
QT       += widgets

SOURCES = QtCursorExample.cpp
HEADERS = QtCursorExample.h
QMAKE_CXXFLAGS += -Wall
Тем не менее, Даже когда мышь не перемещается , коробка постоянно перекрашивается и постоянно мерцает.>

Подробнее здесь: https://stackoverflow.com/questions/797 ... nt-flicker
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»