--- /dev/null
+#!/usr/bin/env python
+
+from __future__ import with_statement
+from __future__ import division
+
+import sys
+import logging
+
+from PyQt4 import QtCore
+from PyQt4 import QtGui
+
+
+_moduleLogger = logging.getLogger(__name__)
+
+
+class QPieDisplay(QtGui.QWidget):
+
+ def __init__(self, parent = None, flags = QtCore.Qt.Window):
+ QtGui.QWidget.__init__(self, parent, flags)
+ self._child = None
+ self._size = QtCore.QSize(128, 128)
+ self._canvas = QtGui.QPixmap(self._size)
+ self._mask = QtGui.QBitmap(self._canvas.size())
+ self._mask.fill(QtCore.Qt.color0)
+ self._generate_mask(self._mask)
+ self._canvas.setMask(self._mask)
+
+ def sizeHint(self):
+ return self._size
+
+ def showEvent(self, showEvent):
+ self.setMask(self._mask)
+
+ QtGui.QWidget.showEvent(self, showEvent)
+
+ def paintEvent(self, paintEvent):
+ painter = QtGui.QPainter(self._canvas)
+ painter.setRenderHint(QtGui.QPainter.Antialiasing, True)
+ adjustmentRect = self._canvas.rect().adjusted(0, 0, -1, -1)
+
+ painter.setBrush(self.palette().window())
+ painter.setPen(self.palette().mid().color())
+ painter.drawRect(self._canvas.rect())
+
+ background = self.palette().highlight().color()
+ painter.setPen(QtCore.Qt.NoPen)
+ painter.setBrush(background)
+ painter.drawPie(adjustmentRect, 0, 360 * 16)
+
+ dark = self.palette().mid().color()
+ painter.setPen(QtGui.QPen(dark, 1))
+ painter.setBrush(QtCore.Qt.NoBrush)
+ painter.drawEllipse(adjustmentRect)
+
+ screen = QtGui.QPainter(self)
+ screen.drawPixmap(QtCore.QPoint(0, 0), self._canvas)
+ QtGui.QWidget.paintEvent(self, paintEvent)
+
+ def mousePressEvent(self, mouseEvent):
+ pass
+
+ def mouseReleaseEvent(self, mouseEvent):
+ if self._child is None:
+ lastMousePos = mouseEvent.pos()
+ globalButtonPos = self.mapToGlobal(lastMousePos)
+ self._child = QPieDisplay(None, QtCore.Qt.SplashScreen)
+ self._child.move(globalButtonPos)
+ self._child.show()
+ else:
+ self._child.hide()
+ self._child = None
+
+ def _generate_mask(self, mask):
+ """
+ Specifies on the mask the shape of the pie menu
+ """
+ painter = QtGui.QPainter(mask)
+ painter.setPen(QtCore.Qt.color1)
+ painter.setBrush(QtCore.Qt.color1)
+ painter.drawRect(mask.rect())
+
+class Grid(object):
+
+ def __init__(self):
+ layout = QtGui.QGridLayout()
+ for i in xrange(3):
+ for k in xrange(3):
+ button = QtGui.QPushButton("%s,%s" % (i, k))
+ button.setSizePolicy(QtGui.QSizePolicy(
+ QtGui.QSizePolicy.MinimumExpanding,
+ QtGui.QSizePolicy.MinimumExpanding,
+ QtGui.QSizePolicy.PushButton,
+ ))
+ self._create_callback(button)
+ layout.addWidget(button, i, k)
+
+ centralWidget = QtGui.QWidget()
+ centralWidget.setLayout(layout)
+ centralWidget.setContentsMargins(0, 0, 0, 0)
+
+ self._window = QtGui.QMainWindow()
+ self._window.setAttribute(QtCore.Qt.WA_DeleteOnClose, True)
+ self._window.setWindowTitle("Buttons!")
+ self._window.setCentralWidget(centralWidget)
+ self._child = None
+
+ def show(self):
+ self._window.show()
+
+ def _create_callback(self, button):
+ button.clicked.connect(lambda: self._on_click(button))
+
+ def _on_click(self, button):
+ if self._child is None:
+ buttonCorner = pos = QtCore.QPoint(0, 0)
+ globalButtonPos = button.mapToGlobal(pos)
+ self._child = QPieDisplay(None, QtCore.Qt.SplashScreen)
+ self._child.move(globalButtonPos)
+ self._child.show()
+ else:
+ self._child.hide()
+ self._child = None
+
+
+if __name__ == "__main__":
+ app = QtGui.QApplication([])
+
+ grid = Grid()
+ grid.show()
+
+ val = app.exec_()
+ sys.exit(val)
--- /dev/null
+#!/usr/bin/env python
+
+from __future__ import with_statement
+from __future__ import division
+
+import sys
+import logging
+
+from PyQt4 import QtCore
+from PyQt4 import QtGui
+
+
+_moduleLogger = logging.getLogger(__name__)
+
+
+if __name__ == "__main__":
+ app = QtGui.QApplication([])
+
+ layout = QtGui.QGridLayout()
+ for i in xrange(3):
+ for k in xrange(3):
+ button = QtGui.QPushButton("%s,%s" % (i, k))
+ button.setSizePolicy(QtGui.QSizePolicy(
+ QtGui.QSizePolicy.MinimumExpanding,
+ QtGui.QSizePolicy.MinimumExpanding,
+ QtGui.QSizePolicy.PushButton,
+ ))
+ layout.addWidget(button, i, k)
+
+ centralWidget = QtGui.QWidget()
+ centralWidget.setLayout(layout)
+ centralWidget.setContentsMargins(0, 0, 0, 0)
+
+ window = QtGui.QMainWindow()
+ window.setAttribute(QtCore.Qt.WA_DeleteOnClose, True)
+ window.setWindowTitle("Buttons!")
+ window.setCentralWidget(centralWidget)
+ window.show()
+
+ val = app.exec_()
+ sys.exit(val)