Seite 4 von 5

Re: Geometrische Objekte werden generiert, aber nicht angezeigt.

Verfasst: Samstag 19. Januar 2019, 11:07
von __deets__

Re: Geometrische Objekte werden generiert, aber nicht angezeigt.

Verfasst: Samstag 19. Januar 2019, 20:43
von Atalanttore
Wenn `path` ein `QPainterPath`-Objekt und `scene` ein `QGraphicsScene`-Objekt ist, schreibt man das dann so:

Code: Alles auswählen

scene.setSelectionArea(path)
selected = scene.selectedItems()
Es wäre toll, wenn `selected` dann eine Liste mit den noch sichtbaren Objekten enthält. Ist das der Fall?

Gruß
Atalanttore

Re: Geometrische Objekte werden generiert, aber nicht angezeigt.

Verfasst: Samstag 19. Januar 2019, 20:46
von __deets__
Ich wuerde eher mit der zweiten Option operieren, die Selektion ist sicher moeglich, aber mir persoenlich zu viel Seiteneffekt - die Selektion hat ja ggf. auch noch andere Einsatzzwecke.

Und hast du das mal probiert? Du hast doch inzwischen ausreichend viel Code, um damit mal rumzuspielen.

Re: Geometrische Objekte werden generiert, aber nicht angezeigt.

Verfasst: Samstag 19. Januar 2019, 21:31
von Atalanttore
Also eher so:

Code: Alles auswählen

scene.setSelectionArea(path)
selected = scene.items()
Gruß
Atalanttore

Re: Geometrische Objekte werden generiert, aber nicht angezeigt.

Verfasst: Samstag 19. Januar 2019, 21:55
von __deets__
Hast du dir die items-calls mal angeschaut? Das sind jede Menge. Mit Argumenten für eine Zone (als rect oder Pfad und so)

Also präzise wonach du gefragt hast.

Re: Geometrische Objekte werden generiert, aber nicht angezeigt.

Verfasst: Sonntag 20. Januar 2019, 21:15
von Atalanttore
@__deets__: Die C++-Codeschnipsel der Methodenaufrufe sind für mich wenig verständlich.
  1. Was meinst du mit "items-calls"?
  2. Was ist eine Zone bei Qt?
Gruß
Atalanttore

Re: Geometrische Objekte werden generiert, aber nicht angezeigt.

Verfasst: Sonntag 20. Januar 2019, 21:17
von __deets__
Alle die Aufrufe die items heissen. Und verschiedene Argumente akzeptieren, um die items die in einer bestimmten Zone oder Region sind. Das willst du doch.

Re: Geometrische Objekte werden generiert, aber nicht angezeigt.

Verfasst: Sonntag 20. Januar 2019, 21:20
von Atalanttore
Eigentlich wollte ich nur eine einfache Möglichkeit zum Erkennen, wenn ein Objekt für den Nutzer nicht mehr sichtbar ist.

Ist ein `QGraphicsScene`-Objekt eine Zone oder Region?

Gruß
Atalanttore

Re: Geometrische Objekte werden generiert, aber nicht angezeigt.

Verfasst: Sonntag 20. Januar 2019, 21:26
von __deets__
Diese Methoden sind eine Möglichkeit - wenn du die sichtbare Region (die dann ein Rechteck ist) zur Abfrage nutzt, dann erhältst du die sichtbaren items zurück.

Aber warum willst du das? Die Kombination aus view und Scene löst das doch für dich.

Und die Scene ist keine Region. Sondern ein Sack voller Objekte.

Re: Geometrische Objekte werden generiert, aber nicht angezeigt.

Verfasst: Sonntag 20. Januar 2019, 21:29
von Atalanttore
@__deets__: Meinst du mit "view" ein `QGraphicsView`-Objekt?

Gruß
Atalanttore

Re: Geometrische Objekte werden generiert, aber nicht angezeigt.

Verfasst: Sonntag 20. Januar 2019, 21:31
von __deets__
Ja.

Re: Geometrische Objekte werden generiert, aber nicht angezeigt.

Verfasst: Sonntag 20. Januar 2019, 21:34
von Atalanttore
@__deets__: Werden Objekte außerhalb einer `QGraphicsView` automatisch gelöscht?

Gruß
Atalanttore

Re: Geometrische Objekte werden generiert, aber nicht angezeigt.

Verfasst: Sonntag 20. Januar 2019, 21:43
von __deets__
Nein. Aber sie werden effizient ausgefiltert. All das steht auch in der Doku. Und solange du kein Problem hast, musst du auch keines lösen. Hast du eines?

Re: Geometrische Objekte werden generiert, aber nicht angezeigt.

Verfasst: Sonntag 20. Januar 2019, 21:48
von Atalanttore
Schön, wenn man sich um die Entfernung von enteilten Objekten nicht zu kümmern braucht.

Gruß
Atalanttore

Re: Geometrische Objekte werden generiert, aber nicht angezeigt.

Verfasst: Sonntag 20. Januar 2019, 21:56
von __deets__
Endlos geht das natürlich nicht. Aber das ganze ist explizit konstruiert worden um effizient zu filtern, was nicht sichtbar ist. Solange du also kein Problem hast, musst du dich auch nicht grämen. Wenn du eines bekommst, ist die Frage nach “was ist sichtbar” mit den genannten Methoden und http://doc.qt.io/qt-5/qgraphicsview.html#sceneRect-prop als Argument ermitteln.

Re: Geometrische Objekte werden generiert, aber nicht angezeigt.

Verfasst: Sonntag 20. Januar 2019, 22:06
von Atalanttore
Dann kann ich weiter an meiner Erweiterung basteln. Allerdings muss ich auch noch ein anderes Problem dafür lösen, aber das ist in einem anderen Thema.

Gruß
Atalanttore

Re: Geometrische Objekte werden generiert, aber nicht angezeigt.

Verfasst: Mittwoch 23. Januar 2019, 17:20
von Atalanttore
Zum Einbau einer Erweiterung habe ich an den Stellschrauben im Code gedreht, damit es mehr nach Weltraum aussieht. Dabei ist mir aufgefallen, dass wieder mal (wie bei Tkinter) ein dünner weißer Rahmen um den schwarzen Hintergrund gezeichnet wird. Vor allem im Vollbildmodus sieht man den Rahmen. Wie bekommt man bei Qt diesen Rahmen weg?

Code:

Code: Alles auswählen

import random
import time
import sys

from PyQt5 import QtCore
from PyQt5.QtWidgets import QApplication, QGraphicsView, QGraphicsScene
from PyQt5.QtGui import QPainterPath, QPolygonF


SPEED = 5000
MIN_DISTANCE = 30000
DISTANCE_VARIANCE = 20000


class Star:
    D = 1000

    def __init__(self, scene):
        path = QPainterPath()

        #path.addRect(-10, -10, 20, 20)

        polygon = QPolygonF()
        polygon.append(QtCore.QPointF(13, 0))
        polygon.append(QtCore.QPointF(10, -5))
        polygon.append(QtCore.QPointF(10, -10))
        polygon.append(QtCore.QPointF(5, -10))
        polygon.append(QtCore.QPointF(0, -13))
        polygon.append(QtCore.QPointF(-5, -10))
        polygon.append(QtCore.QPointF(-10, -10))
        polygon.append(QtCore.QPointF(-10, -5))
        polygon.append(QtCore.QPointF(-13, 0))
        polygon.append(QtCore.QPointF(-10, 5))
        polygon.append(QtCore.QPointF(-10, 10))
        polygon.append(QtCore.QPointF(-5, 10))
        polygon.append(QtCore.QPointF(0, 13))
        polygon.append(QtCore.QPointF(5, 10))
        polygon.append(QtCore.QPointF(10, 10))
        polygon.append(QtCore.QPointF(10, 5))

        path.addPolygon(polygon)

        self._x, self._y = random.random() * 20000 - 10000, random.random() * 20000 - 10000
        self._z = random.random() * 20000 + MIN_DISTANCE
        self._speed = random.random() * SPEED
        self._path = scene.addPath(path)
        self._path.setBrush(QtCore.Qt.white)
        self.update(0)  # force placement

    def update(self, elapsed):

        self._z -= elapsed * self._speed
        if self._z < 0:
            self._z = random.random() * DISTANCE_VARIANCE + MIN_DISTANCE
        self._path.setX(self._x * self.D / self._z)
        self._path.setY(self._y * self.D / self._z)
        self._path.setScale(1 - self._z / (MIN_DISTANCE + DISTANCE_VARIANCE)) # Skalierung
        self._path.setRotation(self._path.rotation() + elapsed * 360) # Drehung
        return [self]

class StarSpawner:
    STARS_PER_SECOND = 10
    TOTAL_STARS = 100

    def __init__(self, scene):
        self._star_spawn_period = 1.0 / self.STARS_PER_SECOND
        self._accu = 0.0
        self._count = self.TOTAL_STARS
        self._scene = scene


    def update(self, elapsed):

        self._accu += elapsed
        spawned_stars = []
        while self._accu > self._star_spawn_period:
            spawned_stars.append(Star(self._scene))
            self._accu -= self._star_spawn_period

        self._count -= len(spawned_stars)

        if self._count > 0:
            spawned_stars.append(self)

        return spawned_stars


class GraphicsWindow(QGraphicsView):

    def __init__(self, parent=None):

        super(GraphicsWindow, self).__init__(parent)
        self._last = time.monotonic()
        scene = QGraphicsScene(self)
        self.setScene(scene)
        self.setBackgroundBrush(QtCore.Qt.black)
        self._things = [StarSpawner(scene)]
        scene.setSceneRect(-400, -400, 800, 800)

        self._timer = QtCore.QTimer(self)
        self._timer.setSingleShot(False)
        self._timer.setInterval(1000 / 60)
        self._timer.timeout.connect(self._update_all)
        self._timer.start()

    def _update_all(self):

        now = time.monotonic()
        elapsed = now - self._last
        self._last = now

        things_for_this_frame = self._things
        self._things = [] # neu!
        for thing in things_for_this_frame:
            print(things_for_this_frame)
            self._things.extend(thing.update(elapsed))


def main():
    app = QApplication(sys.argv)
    graphics_window = GraphicsWindow()
    graphics_window.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()
Gruß
Atalanttore

Re: Geometrische Objekte werden generiert, aber nicht angezeigt.

Verfasst: Donnerstag 24. Januar 2019, 13:04
von __deets__
Ich kann das im Moment nicht selbst ueberpruefen. Aber weil ich gestern fuer ein Projekt das hier gefunden habe

https://github.com/pyqtgraph/pyqtgraph

ist das vielleicht etwas, wo du viel Python-Code findest, der QGraphicsView findest, an dem du dich langhangeln kannst.

Re: Geometrische Objekte werden generiert, aber nicht angezeigt.

Verfasst: Donnerstag 24. Januar 2019, 21:44
von Atalanttore
@__deets__: Ganz schön viel Code. Wo beginnt da ein erfahrener Programmierer mit dem Entlanghangeln?

Mittlerweile habe ich nicht nur eine, sondern zwei Lösungen für das Problem gefunden. Siehe hier.

Gruß
Atalanttore

Re: Geometrische Objekte werden generiert, aber nicht angezeigt.

Verfasst: Donnerstag 24. Januar 2019, 21:48
von __deets__
Einfach querlesen. Was dein Anfang ist kann ich dir nicht sagen. Das Ding hat Beispiele, wenn du darin etwas siehst, dass dir gefällt, schau dir die Klassen etc an p, die benutzt werden.