我试图让Qt在按下右键时单独接收鼠标左键事件,这似乎是不可能的,所以我尝试使用xmodmap
禁用
鼠标右键然后按下它并使用鼠标左键,这很有效。
我正在使用 Linux Fedora、X11 和 C++。
但是我需要禁用它之后我按下它而不是之前,但这会导致
xmodmap
挂起,直到我释放鼠标右键,然后发送按下它时发生的每个鼠标事件。
这是我用来禁用
鼠标右键的
xmodmap
命令:
xmodmap -e \"pointer = 1 2 0 4 5 0 0 0 0 0\"
这是我在 Qt 中使用它的方式:
QProcess disable_right;
disable_right.start("/bin/sh", QStringList()<< "-c" <<"xmodmap -e \"pointer = 1 2 0 4 5 0 0 0 0 0\" && xdotool click 1");
disable_right.waitForFinished();
这是使用安装在
eventFilter
上的 QWidget
完成的,这里是:
bool MouseEventEater::eventFilter(QObject *obj, QEvent *event)
{
if(event->type() == QEvent::MouseButtonPress)
{
QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);
//this will detect left button press while right button is pressed,
//which will result mouseEvent->buttons() to be equal to 3.
if(mouseEvent->buttons() >= 3)
{
fprintf(stderr,"3 Buttons\n");
QProcess disable_right;
disable_right.start("/bin/sh", QStringList()<< "-c" <<"xmodmap -e \"pointer = 1 2 0 4 5 0 0 0 0 0\"");
//it will hang here until right mouse button is released
disable_right.waitForFinished();
}
}
else
{
if(event->type() == QEvent::MouseButtonRelease)
{
QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);
if(mouseEvent->button() == Qt::LeftButton)
{
fprintf(stderr,"Left Button Released\n");
}
if(mouseEvent->button() == Qt::RightButton)
{
fprintf(stderr,"Right Button Released\n");
}
}
}
return QObject::eventFilter(obj, event);
}
这正是发生的事情:
我按鼠标右键。
然后我click鼠标左键。
我显示“3个按钮”。
即使我反复单击鼠标左键,只要我仍然按下鼠标右键,什么也不会发生。
当我释放鼠标右键时,需要几秒钟然后我得到“释放鼠标左键”(以防我按下鼠标左键一次)和“释放鼠标右键”。
我认为我正在使用的命令在按下鼠标右键时不起作用,所以我在
xmodmap
命令之前使用以下命令以编程方式释放它(因为我需要物理按下它):
xdotool mouseup 3
我是这样用的:
QProcess disable_right;
disable_right.start("/bin/sh", QStringList()<< "-c" <<"xdotool mouseup 3 && xmodmap -e \"pointer = 1 2 0 4 5 0 0 0 0 0\" && xdotool click 1");
disable_right.waitForFinished();
但这没有效果。
我想了解为什么
xmodmap
不能禁用按下的鼠标按钮,以及如何解决这个问题。
感谢您的时间和精力!