处理QListWidget单击和滚动

时间:2018-12-18 11:16:42

标签: c++ ios qt

我有一个带有某些项目(QListWidgetItem的项目)的QListWidget。当然,这些项目具有其自己的控件,例如按钮,线编辑等...

对于我的QListWidget,我在构造函数中设置了

this->setAttribute(Qt::WA_AcceptTouchEvents, true);
this->grabGesture(Qt::TapGesture, Qt::IgnoredGesturesPropagateToParent | Qt::ReceivePartialGestures);

本质上是我的事件处理问题:

bool ListControl::event(QEvent* e)
{
    auto event = e->type();
    if (event == QEvent::TouchBegin)
    {
        auto touch = dynamic_cast<QTouchEvent*>(e);
        if (touch)
        {
            return this->HandleTouch(touch, event);
        }
    }

    ...some code comes here...

    return QListWidget::event(e);
}

当我返回 QEvent :: TouchBegin HandleTouch -Method时,我可以移动元素列表(QListWidgetItems)。 “移动”是指滚动列表,用手指在手机触摸屏上。但是后来我无法集中精力于任何对QListWidgetItem的控制。

当我返回 QEvent :: TouchBegin QListWidget :: event(e)时,我将注意力集中在控件上,但无法再滚动列表。

我尝试了很多,但没有任何帮助。我该如何解决这个问题,用手指移动/滚动列表,但也可以集中精力于控件上。

补充: 我测量拍子持续时间。如果少于150ms,那么我得到了被单击的QWidget。 只有我不设法向小部件发送消息,以便它做出反应。

1 个答案:

答案 0 :(得分:0)

好的,我有解决方案!快速又肮脏的解释...诀窍在触摸处理程序(QEvent :: TouchBegin)中,您必须将焦点设置到录制的窗口小部件。 例如,如果小部件是QPushButton,则必须返回false,否则返回true。这些解决方案对我有用!

const auto posf = event->touchPoints().first().pos();
QPoint position(posf.x(), posf.y());

auto widget = this->childAt(position);
if (widget)
{
    widget->setFocus();
    widget->activateWindow();
    widget->raise();
}

auto button = dynamic_cast<QPushButton*>(widget);
result = (button == nullptr);

也许我可以帮助某人