Nieuws:

We zijn er weer.

Na lange tijd van afwezigheid zijn we er weer  :laugh:
We hebben alle wachtwoorden gereset, je oude wachtwoord werkt niet meer.Je moet via het "wachtwoord vergeten"-linkje je wachtwoord resetten. Je krijgt hiervoor een mailtje op het adres dat je bij ons geregistreerd hebt.

De komende tijd zijn we nog druk bezig om de rest van de site op te bouwen, dus het kan zijn dat sommige onderdelen (tijdelijk) niet werken.

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: PyQt5 widgets in QGridLayout 'leegmaken'  (gelezen 421 keer)

Offline erik1984

  • Lid
    • erik1984
  • Steunpunt: Nee
PyQt5 widgets in QGridLayout 'leegmaken'
« Gepost op: 2015/05/15, 20:29:48 »
Momenteel ben ik bezig met een eenvoudig puzzelspelletje in Qt5 met PyQt5 (in python dus). De puzzel bestaat uit een raster (QGridLayout zonder spacing). Elk vakje (QWidget) in het raster implementeert QWidget.paintEvent(). Als de gebruiker op een vakje klikt dan wordt update() aangeroepen op alle widgets in het QGridLayout om de paintEvents aan te roepen. Er ontstaat een probleem wanneer er een kleiner puzzelbord wordt geladen dan er al op het scherm stond. In dat geval blijven er 'artefacten' achter van het vorige bord (zie bijlage).

Wat is de handigste manier om eerst alle widgets in het raster te wissen voordat er een nieuwe puzzel wordt opgebouwd?

Offline erik1984

  • Lid
    • erik1984
  • Steunpunt: Nee
Re: PyQt5 widgets in QGridLayout 'leegmaken'
« Reactie #1 Gepost op: 2015/05/17, 15:43:33 »
Soort van opgelost. Voor het wissen van de inhoud van een widget is het voldoende om niets te doen tijdens het paintEvent. Voor het tekenen wordt de widget al leeggemaakt. Nu heb ik een variabele erased erbij gezet en als die op True staat wordt er niets gedaan in het paintEvent.

Offline profoX

  • Lid
    • wesley
    • Lionslink
  • Steunpunt: Nee
Re: PyQt5 widgets in QGridLayout 'leegmaken'
« Reactie #2 Gepost op: 2015/05/31, 16:00:21 »
Lijkt me wel een correcte oplossing. Wat je zegt klopt inderdaad volgens de documentatie "When the paint event occurs, the update region has normally been erased, so you are painting on the widget's background." De details van implementatie zijn niet duidelijk, dus het is mij niet 100% duidelijk waar het probleem nu precies zit, maar als de QWidgets het enige zichtbare zijn en je overal paintEvent() oproept en niets tekent zouden ze inderdaad leeg moeten zijn (en zodoende enkel hun eigen achtergrondkleur hebben).

QML (ook onderdeel van Qt 5) is mogelijk wel een betere kandidaat voor dit soort spelletjes!
Daar kan je in de toekomst misschien eens mee experimenteren?
Human Knowledge Belongs To The World -- Antitrust (2001)
Nederlandstalige Ubuntu documentatie van Ubuntu-NL (wiki)