Portál AbcLinuxu, 2. června 2024 13:51


Dotaz: PySide2 mapToGlobal nebo mapToPatent

4.12.2023 15:46 Milan Uhrák | skóre: 31 | blog: milan_at_ABC
PySide2 mapToGlobal nebo mapToPatent
Přečteno: 289×
Odpovědět | Admin
Zdravím ...

Tři dny a tři noci :-) se motám kolem problému, jak určit polohu widgetu na obrazovce. Google mi moc nepomáhá a chatGPT odpověděl dobře, ale jeho odpověď se vztahovala na jim uvedený příklad:
from PySide2.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout

class MyWidget(QWidget):
    def __init__(self):
        super().__init__()

        self.init_ui()

    def init_ui(self):
        layout = QVBoxLayout()

        button = QPushButton('Můj tlačítko', self)
        button.clicked.connect(self.on_button_click)

        layout.addWidget(button)
        self.setLayout(layout)

    def on_button_click(self):
        # Získání globálních souřadnic tlačítka
        global_pos = self.mapToGlobal(self.sender().pos())
        print('Globální souřadnice tlačítka:', global_pos.x(), global_pos.y())

if __name__ == '__main__':
    app = QApplication([])
    widget = MyWidget()
    widget.show()
    app.exec_()

Jakmile Widget zaměním za okno a oknu nastavím centralWidget, mapToGlobal vrací polohu asi centralWidgetu: (měřeno KRulerem)
...
...
        self.centralW = QWidget()
        layout = QVBoxLayout()

        button = QPushButton('Můj tlačítko', self)
        button.clicked.connect(self.on_button_click)

        layout.addWidget(button)
        self.centralW.setLayout(layout)
        self.setCentralWidget(self.centralW)

    def on_button_click(self):
        # Získání globálních souřadnic tlačítka
        s = self.sender().pos()
        print(f"sender {s}")
        cw = self.centralW.pos()
        print(f"central {cw}")

        global_pos = self.mapToGlobal( self.sender().pos())
        print('Globální souřadnice tlačítka:', global_pos.x(), global_pos.y())
...
...

Opravdový přiklad, kde mapTo... chci použít, je trochu složitější, a jediný způsob určení polohy, který jsem vyšpekuloval je:
        w = self.ui.qpb_DoSearch
        pos = w.pos()
        print(pos)

        while p := w.parentWidget():
            pos = pos + p.pos()
             print(p, p.pos())
             w = p
        print(f"pos: {pos}")

tedy sečíst polohu prvku s polohou všech nadřazených prvků. Výsledek je SKORO přesný. Jsou tu ale dvě věci, které mi zatím brání toto použít:

1) řešení mi připadá kostrbaté

2) ta nepřesnost je ASI způsobená marginy prvků (to nevím jistě) a v případě nějakých šílených marginů mi tento způsob připadá nevhodný.

Možná jdu na problém úplně špatně, cílem je zobrazit krátké varování nad widgetem, že už není další nález hledaného řetězce. Mám to vyřešené přes QDialog bez dekorace, ten QDialog je zvlášť třída, a aby se zobrazil na správném místě, musím znát pozici widgetu. Zatím jsem to vymyslel takto, ale jak píšu, možná to není nejlepší způsob..

Jaké jsou vaše nápady? Rád si počtu rady chytřejších..

Děkuji

M

Řešení dotazu:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

Řešení 1× (Milan Uhrák (tazatel))
4.12.2023 17:52 darebak
Rozbalit Rozbalit vše Re: PySide2 mapToGlobal nebo mapToPatent
Odpovědět | | Sbalit | Link | Blokovat | Admin
QDialog d(widget.parentWidget()) d.move(widget.pos())

alebo bez parent widgetu

QDialog d d.move(widget.mapToGlobal(QPoint(0, 0)))

https://doc.qt.io/qt-6/application-windows.html#window-geometry
5.12.2023 18:13 Milan Uhrák | skóre: 31 | blog: milan_at_ABC
Rozbalit Rozbalit vše Re: PySide2 mapToGlobal nebo mapToPatent
Nejprve jsem tvou odpověď jako moc nechápal. Přece jen Qt znám jen povrchně, a z tvého náznaku jsem noc nepobral. Ale nedalo mi to, a dnes jsem zkoušel to tvé kouzlo přizpůsobit Pythonu a hrát si s QPoint(0, 0) jako argumentem...

Asi napotřetí jsem se trefil :-) a ... fakt to takto funguje. GPT mi radil něco úplně jiného, ale to fungovalo jen za určitých podmínek. Toto tvé použití jsem neznal, a připadalo mi trochu ujeté, no ale fakt funguje..

Takže děkuji za popostrčení.

M.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.