alp*_*ric 2 python qt pyqt qlineedit qmenu
该QMenu节目上了一个QLineEdit右键单击。
问题:如何修改此代码以在左键单击时也显示菜单?

from PyQt4.QtCore import *
from PyQt4.QtGui import *
import sys
class MyWindow(QWidget):
def __init__(self, *args):
QWidget.__init__(self, *args)
def actionFunct(self, argBool):
print 'actionFunct()', argBool
def buildGUI(self):
self.line=QLineEdit(self)
self.line.setText('My Line Edit')
self.menu=QMenu(self.line)
self.line.installEventFilter(self)
self.menu.installEventFilter(self)
for i in range(3):
actn=QAction('Action 0%s'%i, self.menu, checkable=True)
actn.triggered.connect(self.actionFunct)
self.menu.addAction(actn)
self.line.setContextMenuPolicy(Qt.CustomContextMenu)
self.line.connect(self.line, SIGNAL("customContextMenuRequested(QPoint)" ), self.lineClicked)
layout=QVBoxLayout(self)
layout.addWidget(self.line)
self.setLayout(layout)
def lineClicked(self, QPos):
print 'lineClicked', QPos
parentPosition = self.line.mapToGlobal(QPoint(0, 0))
menuPosition = parentPosition + QPos
self.menu.move(menuPosition)
self.menu.show()
if __name__ == "__main__":
app = QApplication(sys.argv)
w = MyWindow()
w.buildGUI()
w.show()
sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)
使用installEventFilter()方法通过易于定制的eventFilter()方法路由所有 lineedit 事件:
self.line.installEventFilter(self)
Run Code Online (Sandbox Code Playgroud)
现在所有事件self.line触发器都将通过eventFilter。在那里使用接收到的event对象,我们使用以下方法查询位置:
event.pos()
Run Code Online (Sandbox Code Playgroud)
我们将其leftClicked()作为参数发送给方法(在 lineeidit 的右键单击上调用相同的方法)。从 PyQt4.QtCore 导入 * 从 PyQt4.QtGui 导入 * 导入系统
class MyWindow(QWidget):
def __init__(self, *args):
QWidget.__init__(self, *args)
def actionFunct(self, argBool):
print 'actionFunct()', argBool
def buildGUI(self):
self.line=QLineEdit(self)
self.line.setText('My Line Edit')
self.line.installEventFilter(self)
self.menu=QMenu(self.line)
for i in range(3):
actn=QAction('Action 0%s'%i, self.menu, checkable=True)
actn.triggered.connect(self.actionFunct)
self.menu.addAction(actn)
self.line.setContextMenuPolicy(Qt.CustomContextMenu)
self.line.connect(self.line, SIGNAL("customContextMenuRequested(QPoint)" ), self.leftClicked)
self.line.cursorPositionChanged.connect(self.leftClicked)
layout=QVBoxLayout(self)
layout.addWidget(self.line)
self.setLayout(layout)
def eventFilter(self, widget, event):
print 'eventFilter', widget, event
if widget == self.line and isinstance(event, QMouseEvent) and event.buttons() & Qt.LeftButton:
self.leftClicked(event.pos())
return True
return False
def leftClicked(self, QPos):
print 'leftClicked', QPos
parentPosition = self.line.mapToGlobal(QPoint(0, 0))
menuPosition = parentPosition + QPos
self.menu.move(menuPosition)
self.menu.show()
if __name__ == "__main__":
app = QApplication(sys.argv)
w = MyWindow()
w.buildGUI()
w.show()
sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)
首先将QLineEdit最容易触发的cursorPositionChanged信号连接到方法。在左键单击时,此方法被称为使用 Qt 查询当前鼠标光标位置QCursor.pos():
current_mouse_cursor=QCursor.pos()
Run Code Online (Sandbox Code Playgroud)
它返回如下内容:
QtCore.QPoint(852, 595)
Run Code Online (Sandbox Code Playgroud)
最后将菜单移动到查询的鼠标光标位置并显示它:
self.menu.move(current_mouse_cursor)
self.menu.show()
Run Code Online (Sandbox Code Playgroud)

下面发布了一个工作代码:
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import sys
class MyWindow(QWidget):
def __init__(self, *args):
QWidget.__init__(self, *args)
def actionFunct(self, argBool):
print 'actionFunct()', argBool
def buildGUI(self):
self.line=QLineEdit(self)
self.line.setText('My Line Edit')
self.menu=QMenu(self.line)
for i in range(3):
actn=QAction('Action 0%s'%i, self.menu, checkable=True)
actn.triggered.connect(self.actionFunct)
self.menu.addAction(actn)
self.line.setContextMenuPolicy(Qt.CustomContextMenu)
self.line.connect(self.line, SIGNAL("customContextMenuRequested(QPoint)" ), self.rightClicked)
self.line.cursorPositionChanged.connect(self.leftClicked)
layout=QVBoxLayout(self)
layout.addWidget(self.line)
self.setLayout(layout)
def leftClicked(self, arg):
print 'leftClicked', arg, QCursor.pos()
self.menu.move(QCursor.pos())
self.menu.show()
def rightClicked(self, QPos):
print 'rightClicked', QPos
parentPosition = self.line.mapToGlobal(QPoint(0, 0))
menuPosition = parentPosition + QPos
self.menu.move(menuPosition)
self.menu.show()
if __name__ == "__main__":
app = QApplication(sys.argv)
w = MyWindow()
w.buildGUI()
w.show()
sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2016 次 |
| 最近记录: |