我有一个带有某些项目(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。 只有我不设法向小部件发送消息,以便它做出反应。
答案 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);
也许我可以帮助某人