You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Qt 5.15实现自定义鼠标光标时持续闪烁问题求助

Qt 5.15实现自定义鼠标光标时持续闪烁问题求助

大家好,我最近用Qt 5.15 toolkit在C++里实现了一个自定义光标,写了个小测试程序,包含三个类:CMainWindowCTestWidgetCBox,其中CTestWidgetCBox都是QLabel的子类。CMainWindow包含CTestWidgetCTestWidget捕获鼠标事件来让CBox跟着鼠标移动。

下面是我的代码:

头文件 QtCursorExample.h

#include <QMainWindow>
#include <QWidget>
#include <QLabel>

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 <QApplication>
#include <QMainWindow>
#include <QWidget>
#include <QLabel>
#include <QMouseEvent>
#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

但是现在遇到了一个棘手的问题:哪怕鼠标完全不动,这个CBox也会持续重绘,一直闪烁。我试过把系统光标设置为Qt::BlankCursor,但完全没效果,闪烁的问题依然存在。有没有大佬能给我一些解决思路或者建议?

内容来源于stack exchange

火山引擎 最新活动