QApplication :: mouseButtons的线程安全性和延迟安全性如何?

时间:2011-11-20 05:39:04

标签: c++ qt qt4 mouse qml

当您从模型中获取鼠标信号到您的插槽时,传递的参数是QModelIndex。

QModelIndex不会告诉您按下了什么按钮。因此,我们可以使用QApplication :: mouseButtons。但是QApplication :: mouseButtons是当前按下的按钮,而不是当模型经历了点击时。

我的思想实验是说,在按下右键后,底层视图会将信号发送到我的小部件,但就在我的小部件插槽收到信号之前,发生了虚假的左键单击。因此,在收到QModelIndex时调用QApplication :: mouseButtons会错误地将正在单击的行与鼠标左键而不是右键相关联。这种情况怎么可能?

当你看到Qt甚至是QML时,在收到QModelIndex时需要很多代码杂技才能获得正确的鼠标按钮信息。这是诺基亚努力推动鼠标按钮不可知论的政策吗?

1 个答案:

答案 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执行类似操作。