c++ - 当光标不在 QSpinBox 上时,使 QSpinBox 对鼠标滚轮事件使用react

标签 c++ qt qspinbox

我正在使用 Qt 5.3.2Qt Creator 3.2.1MinGW 4.8.2Windows 7 .我有一个 QSpinBox并且仅当鼠标悬停在 QSpinBox 上时才能使用鼠标滚轮更改其值.如果鼠标不在 QSpinBox 上, 滚动鼠标滚轮没有效果,即使 QSpinBox还是有重点的。我需要做什么才能更改 QSpinBox 中的值即使鼠标没有悬停在鼠标滚轮上也有焦点?设置mouseTrackingtrue没有那个效果。

最佳答案

使用 eventFilter 来做到这一点。将它安装在您的 mainWindow 上:

bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
        if (obj == this && event->type() == QEvent::Wheel)
        {
            QWheelEvent *wheelEvent = static_cast<QWheelEvent *>(event);
            if(wheelEvent->delta() > 0)
                ui->spinBox->setValue(ui->spinBox->value() + 1);
            else
                ui->spinBox->setValue(ui->spinBox->value() - 1);
        }
}

这只是示例,您可以根据需要进行改进。

或者使用这个:

bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{

        if (obj == this && event->type() == QEvent::Wheel)
        {
            QApplication::sendEvent(ui->spinBox,event);
        }
}

在这个例子中,当你检测到 wheel 事件时,你将它发送到你的 spinbox。

但别忘了

protected:
bool eventFilter(QObject *obj, QEvent *event);//in header

qApp->installEventFilter(this);//in constructor

正如 DmitrySazonov 推荐的那样。当我们的 spinBox 处于焦点时,我们将检测 wheelEvents,当 spinBox 失去焦点时,我们不会对 wheel 使用react(其他小部件 react 正常)。我们在一个 eventFilter 中执行此操作。为此提供新的 bool 变量。例如:

private:
bool spin;//in header

在构造函数中初始化:

spin = false;

你的 eventFilter 应该是。

    bool MainWindow::eventFilter(QObject *obj, QEvent *event)
    {
        if(obj == ui->spinBox && event->type() == QEvent::FocusIn)
            spin = true;


        if(spin)
        {
            if (obj == this && event->type() == QEvent::Wheel)
            {
                QApplication::sendEvent(ui->spinBox,event);
            }
        }

        if(obj == ui->spinBox && event->type() == QEvent::FocusOut)
            spin = false;
    }

或者只是这样做,没有额外的变量:

if (obj == this && event->type() == QEvent::Wheel)
{
    if(ui->spinBox->hasFocus())
        QApplication::sendEvent(ui->spinBox,event);
}

关于c++ - 当光标不在 QSpinBox 上时,使 QSpinBox 对鼠标滚轮事件使用react,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26041471/

相关文章:

c++ - Qt QFileDialog::setDirectory 在 Ubuntu 12.04 中的有趣行为

c++ - 如何防止打开文件两次?

C++将两个QSliders加在一起?

c++ - 每当我运行 C++ 中的乘法矩阵代码时,它总是崩溃。不知道为什么

c++ - 数组初始化问题

c++ - 使用 2 种不同方法时的 O(N) 差异很大

c++ - 数据结构/容器选择

Qt QSpinBox : How to display uppercase hexadecimal number

c++ - Qt QTableWidget QDoubleSpinBoxes/QSpinBoxes 作为通过迭代访问值的元素

C++ - 全局静态对象和局部静态对象的构造函数调用是否不同?