Qt 5.15实现自定义鼠标光标时持续闪烁问题求助
Qt 5.15实现自定义鼠标光标时持续闪烁问题求助
大家好,我最近用Qt 5.15 toolkit在C++里实现了一个自定义光标,写了个小测试程序,包含三个类:CMainWindow、CTestWidget和CBox,其中CTestWidget和CBox都是QLabel的子类。CMainWindow包含CTestWidget,CTestWidget捕获鼠标事件来让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




