gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 01:02:00 25 4
gpt4 key购买 nike

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

QModelIndex 不会告诉您按下了什么按钮。所以,我们可以求助于 QApplication::mouseButtons。但是 QApplication::mouseButtons 是当前按钮按下,而不是当模型经历点击时。

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

当您查看 Qt 甚至 QML 时,需要大量的代码技巧才能在收到 QModelIndex 时获得正确的鼠标按钮信息。这是诺基亚在努力插入鼠标按钮不可知论的政策吗?

最佳答案

我认为这不太可能发生,但它可能会发生。

确定单击哪个按钮的“简单”方法是子类化 QTableView(或您正在使用的 View 并重新实现 mouseReleaseEvent

void mouseReleaseEvent(QMouseEvent * event)
{
// store the button that was clicked
mButton = event->button();
// Now call the parent's event
QTableView::mouseReleaseEvent(event);
}

默认情况下,如果按下 View 的某个项目,mouseReleaseEvent 会发出 clicked 信号

If a user presses the mouse inside your widget and then drags the mouse to another location before releasing the mouse button, your widget receives the release event. The function will emit the clicked() signal if an item was being pressed.

诀窍是在您的派生类中捕获 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);
}

如果您还需要 pressed 信号,您可以使用 mousePressEvent 做类似的事情。

关于c++ - QApplication::mouseButtons 的线程安全性和延迟安全性如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8199698/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com