From d308744016ee598d5885ea9774a2b71ec728a50e Mon Sep 17 00:00:00 2001 From: Lukas Rybok Date: Tue, 23 Nov 2010 17:46:56 +0100 Subject: [PATCH 1/3] my first commit --- object_view.py | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100755 object_view.py diff --git a/object_view.py b/object_view.py new file mode 100755 index 0000000..54d4925 --- /dev/null +++ b/object_view.py @@ -0,0 +1,44 @@ +#!/usr/bin/python +import sys, os +from PyQt4.QtGui import * +from PyQt4.QtCore import * + +class MainWindow(QMainWindow): + def __init__(self, argv, parent=None): + QMainWindow.__init__(self, parent) + + vlayout = QVBoxLayout() + for i in range(5): + button = QPushButton("TestButton %d" % i) + button.clicked.connect(self.clickedButton) + vlayout.addWidget(button) + + hlayout = QHBoxLayout() + self.redlabel = QGraphicsView() + self.redlabel.setStyleSheet("QLabel {background-color: red}") + hlayout.addLayout(vlayout) + hlayout.addWidget(self.redlabel, 1) + + central = QWidget() + central.setLayout(hlayout) + self.setCentralWidget(central) + + def clickedButton(self): + button = self.sender() + print button.text() + self.redlabel.setText(button.text()) + + + + +def main(): + app = QApplication(sys.argv) + + wnd = MainWindow(sys.argv[1:]) + wnd.show() + + return app.exec_() + +if __name__ == '__main__': + sys.exit(main()) + From 6b03c22767aae037117a4bc4fccbc19888058cb8 Mon Sep 17 00:00:00 2001 From: Lukas Rybok Date: Tue, 23 Nov 2010 17:52:33 +0100 Subject: [PATCH 2/3] added more buttons --- object_view.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/object_view.py b/object_view.py index 54d4925..37dfa6e 100755 --- a/object_view.py +++ b/object_view.py @@ -8,7 +8,7 @@ class MainWindow(QMainWindow): QMainWindow.__init__(self, parent) vlayout = QVBoxLayout() - for i in range(5): + for i in range(8): button = QPushButton("TestButton %d" % i) button.clicked.connect(self.clickedButton) vlayout.addWidget(button) From 3c5c5f9f94e130b0846d8faac90b15e3768dadce Mon Sep 17 00:00:00 2001 From: Lukas Rybok Date: Wed, 24 Nov 2010 16:47:35 +0100 Subject: [PATCH 3/3] initial view version --- annotationitem.py | 32 +++++++++++++++++++++++ annotationscene.py | 63 ++++++++++++++++++++++++++++++++++++++++++++++ lineitem.py | 33 ++++++++++++++++++++++++ object_view.py | 46 +++++++++++++++++++++++++-------- pointitem.py | 34 +++++++++++++++++++++++++ 5 files changed, 197 insertions(+), 11 deletions(-) create mode 100644 annotationitem.py create mode 100644 annotationscene.py create mode 100644 lineitem.py create mode 100644 pointitem.py diff --git a/annotationitem.py b/annotationitem.py new file mode 100644 index 0000000..b5a5b74 --- /dev/null +++ b/annotationitem.py @@ -0,0 +1,32 @@ +from PyQt4.QtGui import * +from PyQt4.Qt import * + +class AnnotationGraphicsItem(QAbstractGraphicsShapeItem): + def __init__(self,controls_enabled=True, parent=None, **kwargs): + super(AnnotationGraphicsItem, self).__init__(parent) + + self.setFlags(QGraphicsItem.ItemIsSelectable|QGraphicsItem.ItemIsMovable) + + self.text_font_ = QFont() + self.text_font_.setPointSize(4) + self.text_item_ = QGraphicsSimpleTextItem() + self.text_item_.setFont(self.text_font_) + self.updateText() + + def boundingRect(self): + return QRectF(0, 0, 0, 0) + + def updateText(self): + self.text_item_.setText("CLASS") + + def itemChange(self, change, value): + if change == QGraphicsItem.ItemSelectedChange: + self.setControlsVisible(value.toBool()) + return QGraphicsItem.itemChange(self, change, value) + + def setControlsVisible(self, visible=True): + self.controls_visible_ = visible + #for corner in self.corner_items_: + # corner.setVisible(self.controls_enabled_ and self.controls_visible_) + + diff --git a/annotationscene.py b/annotationscene.py new file mode 100644 index 0000000..fd8c555 --- /dev/null +++ b/annotationscene.py @@ -0,0 +1,63 @@ +from PyQt4.QtGui import * +from PyQt4.QtCore import * +from pointitem import * +import math + +modes = range(5) +SELECT, POINT, LINE, RECTANGLE, POLYGON = modes + +class AnnotationScene(QGraphicsScene): + def __init__(self, parent=None): + super(AnnotationScene, self).__init__(parent) + self.setBackgroundBrush(Qt.darkGray) + + self.reset() + self.setSceneRect(0,0, 640, 480) + + self.mode_ = None + self.mousePressed_ = None + self.activeItem_ = None + + def reset(self): + self.clear() + + def setMode(self, mode): + assert (mode in modes) + self.mode_ = mode + print mode + + + def mousePressEvent(self, event): + if not self.sceneRect().contains(event.scenePos()): + return + elif self.mode_ == SELECT: + QGraphicsScene.mousePressEvent(self, event) + return + elif self.mode_ == POINT: + self.insertItem(AnnotationGraphicsPointItem(event.scenePos())) + event.accept() + elif self.mode_ == LINE: + self.mousePressed_ = event.scenePos() + line = QGraphicsLineItem(QLineF(event.scenePos(), event.scenePos())) + self.activeItem_ = line + self.addItem(line) + + event.accept() + self.update() + + def mouseReleaseEvent(self, event): + self.mousePressed_ = None + QGraphicsScene.mouseReleaseEvent(self, event) + + def mouseMoveEvent(self, event): + print LINE + if not self.sceneRect().contains(event.scenePos()): + return + elif self.mode_ == LINE: + ## TODO + activeItem. + else: + QGraphicsScene.mouseMoveEvent(self, event) + + def insertItem(self, item): + self.addItem(item) diff --git a/lineitem.py b/lineitem.py new file mode 100644 index 0000000..9d9895c --- /dev/null +++ b/lineitem.py @@ -0,0 +1,33 @@ +from PyQt4.QtGui import * +from PyQt4.Qt import * +from annotationitem import * + +class AnnotationGraphicsLineItem(AnnotationGraphicsItem): + + def __init__(self, pos, endPoint, parent=None): + AnnotationGraphicsItem.__init__(self, False, parent) + self.setPos(pos) + self.endPoint_ = endPoint + self.setFlags(QGraphicsItem.ItemIsSelectable|QGraphicsItem.ItemIsMovable) + self.setPen(QColor('green')) + + def resizeContents(self, rect): + pass + + def boundingRect(self): + width = abs(self.endPoint_.x() - self.pos().x()) + height = abs(self.endPoint_.y() - self.pos().y()) + return QRectF(-10, -10, width, height) + + def paint(self, painter, option, widget = None): + pen = self.pen() + if self.isSelected(): + pen.setColor(QColor('red')) + painter.setPen(pen) + painter.drawLine(self.pos, self.endPoint_) + + def itemChange(self, change, value): + return AnnotationGraphicsItem.itemChange(self, change, value) + + + diff --git a/object_view.py b/object_view.py index 37dfa6e..90e3a58 100755 --- a/object_view.py +++ b/object_view.py @@ -2,39 +2,63 @@ import sys, os from PyQt4.QtGui import * from PyQt4.QtCore import * +from annotationscene import * class MainWindow(QMainWindow): def __init__(self, argv, parent=None): QMainWindow.__init__(self, parent) vlayout = QVBoxLayout() - for i in range(8): - button = QPushButton("TestButton %d" % i) - button.clicked.connect(self.clickedButton) - vlayout.addWidget(button) + buttonSelect = QPushButton("Select") + buttonSelect.clicked.connect(self.clickedSelect) + vlayout.addWidget(buttonSelect) + buttonPoint = QPushButton("Point") + buttonPoint.clicked.connect(self.clickedPoint) + vlayout.addWidget(buttonPoint) + buttonLine = QPushButton("Line") + buttonLine.clicked.connect(self.clickedLine) + vlayout.addWidget(buttonLine) + buttonRectangle = QPushButton("Rectangle") + buttonRectangle.clicked.connect(self.clickedRectangle) + vlayout.addWidget(buttonRectangle) + buttonPolygon = QPushButton("Polygon") + buttonPolygon.clicked.connect(self.clickedPolygon) + vlayout.addWidget(buttonPolygon) + hlayout = QHBoxLayout() - self.redlabel = QGraphicsView() - self.redlabel.setStyleSheet("QLabel {background-color: red}") + self.view_ = QGraphicsView() hlayout.addLayout(vlayout) - hlayout.addWidget(self.redlabel, 1) + hlayout.addWidget(self.view_, 1) + + self.scene_ = AnnotationScene(self) + self.view_.setScene(self.scene_) central = QWidget() central.setLayout(hlayout) self.setCentralWidget(central) - def clickedButton(self): - button = self.sender() - print button.text() - self.redlabel.setText(button.text()) + def clickedSelect(self): + self.scene_.setMode(SELECT) + def clickedPoint(self): + self.scene_.setMode(POINT) + def clickedRectangle(self): + self.scene_.setMode(RECTANGLE) + + def clickedLine(self): + self.scene_.setMode(LINE) + + def clickedPolygon(self): + self.scene_.setMode(POLYGON) def main(): app = QApplication(sys.argv) wnd = MainWindow(sys.argv[1:]) + wnd.resize(800,600) wnd.show() return app.exec_() diff --git a/pointitem.py b/pointitem.py new file mode 100644 index 0000000..02a73e8 --- /dev/null +++ b/pointitem.py @@ -0,0 +1,34 @@ +from PyQt4.QtGui import * +from PyQt4.Qt import * +from annotationitem import * + +class AnnotationGraphicsPointItem(AnnotationGraphicsItem): + size_ = 4 + + def __init__(self, pos, parent=None): + AnnotationGraphicsItem.__init__(self, False, parent) + self.setPos(pos) + self.setFlags(QGraphicsItem.ItemIsSelectable|QGraphicsItem.ItemIsMovable) + self.setPen(QColor('green')) + + def resizeContents(self, rect): + pass + + def boundingRect(self): + return QRectF(-2*self.size_, + -2*self.size_, + 4*self.size_, + 4*self.size_) + + def paint(self, painter, option, widget = None): + pen = self.pen() + if self.isSelected(): + pen.setColor(QColor('red')) + painter.setPen(pen) + painter.drawEllipse(0,0,self.size_,self.size_) + + def itemChange(self, change, value): + return AnnotationGraphicsItem.itemChange(self, change, value) + + +