PyQt4 Graphicsview With Context Menu

Author Avatar
Mutse Young 10月 04, 2012

前言

PyQt4 开发环境的安装,请参考PyQt4 国际化与本地化一文。

本篇主要讲解在 QGraphicsView Framework 中增加右键菜单,关于QGraphicsView,后续帖子将重点讲述。

源码

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
   #!/usr/bin/python
#
# -*- coding: utf-8 -*-

from PyQt4.QtGui import *
from PyQt4.QtCore import *
import sys

class MainWindow(QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)

scene = QGraphicsScene()
view = QGraphicsView()
view.setScene(scene)
view.setSceneRect(0, 0, 1280, 1024)

view.centerOn(0, 0)
view.setRenderHint(QPainter.Antialiasing)

item = QGraphicsLineItem()
item.setLine(50, 50, 400, 400)
scene.addItem(item)

view.setContextMenuPolicy(Qt.CustomContextMenu)
self.setCentralWidget(view)

view.customContextMenuRequested.connect(self.showContextMenu)

self.setWindowTitle(self.tr("GraphicsView PyQT4"))

def showContextMenu(self, pos):
contextMenu = QMenu("viewMenu", self.view)
action1 = QAction(self.tr("item A"), self)
contextMenu.addAction(action1)
action2 = QAction(self.tr("item B"), self)
contextMenu.addAction(action2)
contextMenu.exec_(QCursor.pos())

if __name__ == "__main__":
app = QApplication(sys.argv)

mainw = MainWindow()
mainw.show()

sys.exit(app.exec_())

解析

主窗体

1
2
3
class MainWindow(QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)

定义一个主窗体MainWindow,继承QMainWindow。其中 __init__ 方法,相当于 C++ 中的构造函数。而 super(MainWindow, self).__init__(parent) 方法则是调用其父类的构造函数,从而模拟 C++ 继承特性。

QGraphicsView 框架

1
2
3
4
scene = QGraphicsScene()
view = QGraphicsView()
view.setScene(scene)
view.setSceneRect(0, 0, 1280, 1024)

QGraphicsScene() 用来生成一个场景实例,QGraphicsView() 用来生成一个视图实例。setScene() 用来设置场景,setSceneRect() 用来设置场景大小。

1
2
view.centerOn(0, 0)
view.setRenderHint(QPainter.Antialiasing)

centerOn() 用来设置水平滚动条和垂直滚动条的初始位置分别为最左端和最上端。setRenderHint(QPainter.Antialiasing) 用来处理反锯齿效果。

右键菜单

1
2
3
4
view.setContextMenuPolicy(Qt.CustomContextMenu)
...

view.customContextMenuRequested.connect(self.showContextMenu)

上面两行代码用来绑定 GraphicsView 右键菜单。

显示右键菜单:

1
2
3
4
5
6
7
def showContextMenu(self, pos):
contextMenu = QMenu("viewMenu", self.view)
action1 = QAction(self.tr("item A"), self)
contextMenu.addAction(action1)
action2 = QAction(self.tr("item B"), self)
contextMenu.addAction(action2)
contextMenu.exec_(QCursor.pos())

在右键菜单中增加两个菜单项,并添加到右键菜单中。当在 QGraphicsView 视图区域点击右键时,将会弹出右键菜单。