aboutsummaryrefslogtreecommitdiff
path: root/libs/plugin_python/tests/python/test_qt_widgets.py
blob: 057f34e3178ffde8f6298313481a1998d031cd73 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
from PyQt6.QtWidgets import QWidget

import mobase_tests.qt_widgets as m


class PyWidget(QWidget):
    def heightForWidth(self, a0: int) -> int:
        return a0 * 3 + 4


class PyCustomWidget(m.CustomWidget):
    def __init__(self, name: str):
        super().__init__(name)

    def heightForWidth(self, value: int) -> int:
        return value * 6 - 5


def test_qt_widget():
    # own cpp
    w = m.make_widget_own_cpp("w1")
    assert m.is_alive("w1")
    assert m.is_owned_cpp("w1")

    del w
    assert m.is_alive("w1")

    # own py
    w = m.make_widget_own_py("w2")
    assert m.is_alive("w2")
    assert not m.is_owned_cpp("w2")

    del w
    assert not m.is_alive("w2")

    # transfer to C++
    w = PyWidget()
    m.send_to_cpp("w3", w)

    # delete the reference w - this should NOT delete the underlying object since it
    # was transferred to C++
    del w
    assert m.is_alive("w3")
    assert m.is_owned_cpp("w3")

    # if the Python object is dead (BAD!), this will crash horrible
    assert m.heightForWidth("w3", 4) == 4 * 3 + 4

    # CustomWidget as a qholder, so the construction itself transfers the ownership
    # to C++
    w = PyCustomWidget("w4")
    w.set_parent_cpp()
    assert m.is_alive("w4")
    assert m.heightForWidth("w4", 7) == 6 * 7 - 5
    assert w.heightForWidth(7) == 6 * 7 - 5

    # can call function not defined and not bound through the delegate
    assert not w.hasHeightForWidth()

    del w
    assert m.is_alive("w4")
    assert m.heightForWidth("w4", 7) == 6 * 7 - 5