【问题标题】:How in Qt are handle the cursor shape relative to cursor position?Qt 中如何处理相对于光标位置的光标形状?
【发布时间】:2014-11-28 21:12:52
【问题描述】:

看Qt源码,看不到鼠标指针移动时光标形状在哪里改变,mouseMoveEvent里面什么都没有,enterEvent也没有。

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

【问题讨论】:

  • 让我确保我理解正确。您想知道如何根据小部件上的鼠标位置更改鼠标光标形状吗?
  • 是的,这就是我的结局,但我也想了解 Qt 自己是如何做到的(不必在鼠标移动事件中处理它)
  • 我想我有一个解决方案,请看我的回答。请说明我的示例是否适合您的需求。

标签: c++ qt cursor


【解决方案1】:

您可以为您的小部件实现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();
}

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

【讨论】:

  • “但在那之前,我想了解 Qt 是如何管理它的。”
  • @hl037_ 在哪里实现了什么?你在 Qt 源代码中搜索什么?您想了解 Windows 是如何实现这样的功能的吗?您到底在寻找什么?
  • 小心,因为这个答案会将光标传播到子小部件。
猜你喜欢
  • 2021-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-06
  • 1970-01-01
  • 2013-05-27
  • 2013-10-10
相关资源
最近更新 更多