【发布时间】:2013-05-21 12:08:02
【问题描述】:
在尝试确定在事件函数中按下了哪个鼠标按钮时,我在 PySide 中遇到了问题。我特别需要它来忽略鼠标移动事件,因为它在左右鼠标按钮上都起作用。
如果按下场景上的右键,我想忽略鼠标移动事件。有什么帮助吗?
【问题讨论】:
在尝试确定在事件函数中按下了哪个鼠标按钮时,我在 PySide 中遇到了问题。我特别需要它来忽略鼠标移动事件,因为它在左右鼠标按钮上都起作用。
如果按下场景上的右键,我想忽略鼠标移动事件。有什么帮助吗?
【问题讨论】:
所有鼠标事件都有两种方法(button 和buttons)来确定哪个按钮被按下。但仅对于 move 事件,文档说:
请注意,鼠标移动事件的返回值始终是 Qt::NoButton。
对于mouseMoveEvent,你应该使用buttons 方法。
void mouseMoveEvent(QMouseEvent *e)
{
if(e->buttons() == Qt::RightButton)
qDebug() << "Only right button";
}
为了忽略移动事件,您当然需要在eventFilter 中完成这项工作。
【讨论】:
eventFilter 的问题,但我只能为你提供 C++ 代码。
QApplication::mouseButtons() 将返回mouseButton 的状态,
所以,你可以在KeyPressEvent中获取鼠标的状态。
【讨论】:
您可以通过Qt::RightButton 查看按下了哪个鼠标按钮。对不起 c++ 代码,但我希望你能理解这个想法:
void mousePressEvent(QMouseEvent *event)
{
if (event->button()==Qt::RightButton){
qDebug() << "right button is pressed
}
}
【讨论】:
QContextMenuEvent 而不是QMouseEvent - 即使我没有菜单,并且尝试使用setContextMenuPolicy 也不会改变任何事情。
.buttons()(注意“s”),因为 .button() 将始终为该事件返回 Qt::NoButton。 doc.qt.io/qt-5/qmouseevent.html#button
您可以使用布尔值:
void mousePressEvent(QMouseEvent *event)
{
if (event->button()==Qt::RightButton){
qDebug() << "right button is pressed
pressed=true; //<-----
}
}
在 mouseMoveEvent 上
void GLWidget::mouseMoveEvent(QMouseEvent *event)
{
float dx = event->x() - lastPos.x(); // where lastpos is a QPoint member
float dy = event->y() - lastPos.y();
if (dx<0) dx=-dx;
if (dy<0) dy=-dy;
if (event->buttons() & Qt::LeftButton) { //if you have MOVEd
...do something
}
if (event->buttons() & Qt::RightButton) {
if (pressed==true) return;
else{
...do
}
}
}
在鼠标释放时你必须设置pressed=false; (“pressed”必须是该类的成员)
希望对你有帮助,告诉我
【讨论】:
if (event->buttons() == Qt::LeftButton),而不是button()。