如何在Qt中处理相对于光标位置的光标形状?

时间:2014-11-28 21:12:52

标签: c++ qt cursor

观察Qt源代码,当鼠标指针移动时,我看不到光标形状的变化,鼠标移动事件中没有任何内容,也没有任何输入事件。

我想要做的是一个小部件,其中鼠标光标根据鼠标位置而变化,但不必放置假小部件也不必设置全局光标(除非它是唯一的解决方案)。但在此之前,我想了解Qt如何管理它。

1 个答案:

答案 0 :(得分:0)

您可以为小部件实施mouseMoveEventinstall an event filter,对于某些鼠标位置,您可以使用QCuror API更改鼠标光标。

以下是一个例子:

CursorChange.pro:

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = CursorChange
TEMPLATE = app


SOURCES += main.cpp \
           widget.cpp

HEADERS  += widget.h

widget.h:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

protected:
    void mouseMoveEvent(QMouseEvent *event);
};

#endif // WIDGET_H

widget.cpp:

#include "widget.h"

#include <QMouseEvent>
#include <QCursor>

Widget::Widget(QWidget *parent) :
    QWidget(parent)
{
    setMouseTracking(true);
}

Widget::~Widget()
{
}

void Widget::mouseMoveEvent(QMouseEvent *event)
{
    if(event->pos().x() < geometry().width() / 2)
    {
        setCursor(QCursor(Qt::OpenHandCursor));
    }
    else
    {
        setCursor(QCursor(Qt::WaitCursor));
    }

    QWidget::mouseMoveEvent(event);
}

main.cpp中:

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    Widget w;
    w.show();

    return a.exec();
}

这样,当您将鼠标指针悬停在小部件的左半部分时,您将拥有一个鼠标光标,如果您将鼠标指针悬停在小部件的右侧,您将得到等待鼠标光标。