【问题标题】:How to emit a signal if double clicking on slider handle如果双击滑块手柄如何发出信号
【发布时间】:2019-03-04 04:10:36
【问题描述】:

我们使用的是 Qt 5.10/C++,我被要求使用 QSlider 类实现一个功能。

每当用户在滑块手柄上双击鼠标时,我的同事希望我发出一个信号。

如何做到这一点。也许我必须重新实现

bool event(QEvent *e)

,但我不知道如何开始。

【问题讨论】:

  • 有一个QWidget::mouseDoubleClickEvent()。根据文档,QSlider 中似乎没有超载。如果从QSlider 派生是一个选项,您可以在派生类中重载它。 (否则,您可能会寻找event filters。)
  • @Scheff:感谢您的提示。我会试一试。从 QSlider 派生是我的一个选择。
  • 不客气。如果您设法制作了一个有效的最小示例,请不要犹豫,写一个自我回答。 ;-)
  • 作为覆盖QWidget::mouseDoubleClickEvent 的替代方法,您可以在QSlider 上使用install an event filter
  • 在这种情况下,我查看了QStyleStyles and Style Aware Widgets。绘制控件的方法有很多,但您也会发现检索子控件矩形的方法。 (抱歉没有更具体 - 我有点着急。)

标签: c++ qt slider qevent


【解决方案1】:

工作解决方案

在 cmets 的帮助下,我得出了一个可行的解决方案:

#pragma once

#include <QSlider>
#include <QMouseEvent>
#include <QStyleOption>
#include <QDebug>

class DoubleClickSlider : public QSlider {
    Q_OBJECT
public:
    DoubleClickSlider(QWidget* parent = nullptr) : QSlider(parent) { };

signals:
    void sliderHandleDoubleClicked();

protected:
    void mouseDoubleClickEvent(QMouseEvent *event) override {
        QStyleOptionSlider opt;
        this->initStyleOption(&opt);
        QRect sr = this->style()->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderHandle, this);

        if (sr.contains(event->pos())) {
            qDebug() << "Double clicked handle";
            emit sliderHandleDoubleClicked();
        }
        QSlider::mouseDoubleClickEvent(event);

    }
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多