当您从模型中获取鼠标信号到您的插槽时,传递的参数是QModelIndex。
QModelIndex不会告诉您按下了什么按钮。因此,我们可以使用QApplication :: mouseButtons。但是QApplication :: mouseButtons是当前按下的按钮,而不是当模型经历了点击时。
我的思想实验是说,在按下右键后,底层视图会将信号发送到我的小部件,但就在我的小部件插槽收到信号之前,发生了虚假的左键单击。因此,在收到QModelIndex时调用QApplication :: mouseButtons会错误地将正在单击的行与鼠标左键而不是右键相关联。这种情况怎么可能?
当你看到Qt甚至是QML时,在收到QModelIndex时需要很多代码杂技才能获得正确的鼠标按钮信息。这是诺基亚努力推动鼠标按钮不可知论的政策吗?
答案 0 :(得分:3)
我不认为这是一种非常可能的情况,但可能会发生。
确保点击哪个按钮的“简单”方法是继承QTableView
(或您正在使用的视图并重新实现mouseReleaseEvent
。
void mouseReleaseEvent(QMouseEvent * event)
{
// store the button that was clicked
mButton = event->button();
// Now call the parent's event
QTableView::mouseReleaseEvent(event);
}
默认情况下,mouseReleaseEvent
如果按下了某个视图项,则会发出clicked
信号
如果用户在您的小部件内按下鼠标,然后拖动 在释放鼠标按钮之前将鼠标移动到另一个位置 小部件接收发布事件。该功能将发出 如果正在按下某个项目,则单击()信号。
诀窍是捕获派生类中的clicked
信号并发出一个新信号,除了模型索引之外还包含按钮。
// Define your new signal in the header
signals:
void clicked(QModelIndex, Qt::MouseButton);
// and a slot that will emit it
private slots:
void clickedSlot(QModelIndex);
// In the constructor of your derived class connect the default clicked with a slot
connect(this, SIGNAL(clicked(QModelIndex), this, SLOT(clickedSlot(QModelIndex)));
// Now the slot just emits the new clicked signal with the button that was pressed
void clickedSlot(QModelIndex i)
{
emit clicked(i, mButton);
}
如果您还需要mousePressEvent
信号,也可以使用pressed
执行类似操作。