在 Ubuntu20.04 上,當背景關系選單出現而 Windows 可以接收時,我無法讓小部件接收滑鼠釋放事件。我的 pyqt 版本是 5.15.2。
我考慮過手動發送滑鼠釋放事件,但不知道在背景關系選單出現時哪些系統會收到滑鼠釋放事件,這樣做可能會導致重復釋放事件。有沒有更好的解決方案?
# coding:utf-8
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QMenu, QLabel
class Menu(QMenu):
def __init__(self, parent=None):
super().__init__(parent=parent)
self.addAction('action 1')
self.addAction('action 2')
def showEvent(self, e):
print('show context menu')
super().showEvent(e)
class Widget(QLabel):
def mousePressEvent(self, e):
print('mouse press, button:', e.button())
super().mousePressEvent(e)
def mouseReleaseEvent(self, e):
print('mouse release, button:', e.button())
super().mouseReleaseEvent(e)
class Demo(QWidget):
def __init__(self):
super().__init__()
self.widget = Widget('Click Me', self)
self.widget.move(175, 180)
self.resize(400, 400)
def contextMenuEvent(self, e):
menu = Menu(self)
menu.exec(e.globalPos())
if __name__ == '__main__':
app = QApplication(sys.argv)
w = Demo()
w.show()
app.exec_()
uj5u.com熱心網友回復:
一般規則是在 Windows 上釋放滑鼠右鍵并在 Linux 上按下滑鼠右鍵時觸發背景關系選單事件。
為避免不一致并具有忽略作業系統并始終執行相同操作的通用行為,您可以設定一個內部標志并在需要時檢查它:由于背景關系選單事件可能優先,因此從滑鼠按下和背景關系呼叫函式選單。
請記住:
- 如果您不想處理背景關系選單事件并希望它傳播到父級(如您的情況),則必須忽略該事件;如果您覆寫
contextMenuEvent它,則必須使用event.ignore()或呼叫基本實作來顯式完成,假設它不接受事件; - 如果文本互動標志支持滑鼠/鍵盤導航(以允許剪貼板選單),QLabel 可能會處理該事件;
- 背景關系選單事件也可以由鍵盤上的選單鍵觸發,所以你應該確保它
reason()是Mouse; 如果執行“unpress”部分的函式總是檢查上述標志(并且應該),這實際上不是必需的,但檢查完整性和一致性的原因仍然是一種好習慣;
class Widget(QLabel):
_isPressed = False
def mousePressEvent(self, e):
print('mouse press, button:', e.button())
super().mousePressEvent(e)
self._isPressed = True
def mouseReleaseEvent(self, e):
super().mouseReleaseEvent(e)
self.unpress()
def contextMenuEvent(self, e):
super().contextMenuEvent(e)
# or, alternatively:
e.ignore()
if e.reason() == e.Mouse:
self.unpress()
def unpress(self):
if not self._isPressed:
return
self._isPressed = True
# do whatever you need
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/482820.html
上一篇:如何使用QGraphicsItem僅在圓形中繪制網格線
下一篇:未安裝QML模塊
