Появилась мысль научиться рисовать на рабочем столе. К примеру, линию под курсором мыши или прямоугольную область (подобно выделению). Вот только незнаю с чего начать. Пробовал гуглить – находил обрывки кода на Delphi. На Python ничего..
Как я понимаю, нужно получить объект desktop'a и с помощью QPainter'a рисовать на нем?
QtGui.QApplication.desktop() это и есть то, что мне нужно? Или всетаки нет?
Написал вот такое (точнее собрал из нескольких найденных скриптов). Пока рисование на виджете
# -*- coding: cp1251 -*-
from PyQt4 import QtCore, QtGui
import sys
import os
class MainForm(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.scribbling = False
self.myPenWidth = 1
self.myPenColor = QtCore.Qt.blue
self.lastPoint = QtCore.QPoint()
def mousePressEvent(self, event):
if event.button() == QtCore.Qt.LeftButton:
self.lastPoint = event.pos()
self.scribbling = True
def mouseMoveEvent(self, event):
if (event.buttons() & QtCore.Qt.LeftButton) and self.scribbling:
self.drawLineTo(event.pos())
def mouseReleaseEvent(self, event):
if event.button() == QtCore.Qt.LeftButton and self.scribbling:
self.drawLineTo(event.pos())
self.scribbling = False
def drawLineTo(self, endPoint):
painter = QtGui.QPainter()
painter.begin(self)
painter.setPen(QtGui.QPen(self.myPenColor, self.myPenWidth, QtCore.Qt.SolidLine, QtCore.Qt.RoundCap, QtCore.Qt.RoundJoin))
painter.drawLine(self.lastPoint, endPoint)
painter.end()
rad = self.myPenWidth / 2 + 2
self.update(QtCore.QRect(self.lastPoint, endPoint).normalized().adjusted(-rad, -rad, +rad, +rad))
self.lastPoint = QtCore.QPoint(endPoint)
class App(QtGui.QApplication):
def __init__(self, *args):
QtGui.QApplication.__init__(self, *args)
self.ui = MainForm(None)
self.ui.show()
if __name__ == "__main__":
app = App(sys.argv)
app.exec_()
QPainter::begin: Paint device returned engine == 0, type: 1
QPainter::setPen: Painter not active
QPainter::end: Painter not active, aborted
Вроде все правильно написано. Если drawLineTo обозвать paintEvent (и соответственно определить endPoint), то линия рисуется.
Наставьте на путь истинный (применение розг не возбраняется) :)