PyQt Mouse Event Python 2.7 + rysowanie

Odpowiedz Nowy wątek
2015-12-06 02:27
0

Cześć, mam problem(kolejny :) )...
Otóż. Przy pomocy Qt Designera stworzyłem sobie program do obsługi pewnego kontrolera, który zawiera w sobie karty(imho ważne), teraz doprowadziłem przyciski do stanu interaktywności dzięki wam i teoretycznie wszystko działa.

Jednak wymyśliłem sobie, że w jednej karcie program będzie wyświetlał tło-obrazek(done) i po kliknięciu w dane miejsce tego obrazka, program będzie rysować nad nim okrąg w miejscu w którym kliknęliśmy wraz z zapisem pozycji do listy. Jednakże jest problem, bo nie wiem na jakiej zasadzie działa wykrywanie zdarzeń typu kliknięcie myszką .mousePressEvent(event). Debugger zgłasza mi błąd w argumencie funkcji (event nie istnieje). Próbowałem dodać przed def setupUi(self, menu) funkcję:

def mousePressEvent(self, e):
        self.pressed = True
        self.x = e.x()
        self.y = e.y()
        print str(e.x())+","+str(e.y)
        QWidget.mousePressEvent(self, e)

ale nie wiem na jakiej zasadzie ta funkcja mousePressEvent w self.lokalizacja.background powinna być zrealizowana/odpalona.
Poniżej znajduje się kod, w którym wg. mnie dzieją się istotne dla ww. problemu rzeczy:

class Ui_Menu(object, zmienne):
(dużo def funkcji, (...). i dalej->)
    def setupUi(self, Menu):
        Menu.setObjectName(_fromUtf8("Menu"))
        (...)
        self.lokalizacja = QtGui.QWidget()
        self.lokalizacja.setObjectName(_fromUtf8("lokalizacja"))

        self.lokalizacja.hboxlayout = QtGui.QHBoxLayout(self.lokalizacja)
        self.lokalizacja.setLayout(self.lokalizacja.hboxlayout)
        self.lokalizacja.backgroundpixmap = QtGui.QPixmap("pic.jpg")
        self.lokalizacja.background = QtGui.QLabel(self.lokalizacja)
        self.lokalizacja.background.setPixmap(self.lokalizacja.backgroundpixmap)
        self.lokalizacja.background.setGeometry(0, 0, 551, 431)

        self.lokalizacja.background.mousePressEvent(event)

        self.tabWidget.addTab(self.lokalizacja, _fromUtf8(""))
        (...)
    def retranslateUi(self, Menu):
        (...)

if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    Menu = QtGui.QDialog()
    ui = Ui_Menu()
    ui.setupUi(Menu)
    thread2 = MyThread2(zmienne.opusc2)
    thread2.start()
    Menu.show()
    sys.exit(app.exec_())

Pozostało 580 znaków

2015-12-06 11:34
0

To:

def mousePressEvent(self, e):
        self.x = e.x()
        self.y = e.y()
        print str(self.x)+","+str(self.y)
        # w python3 wystarczy print(event.pos()) 

Jest funkcja, ktora jest zdarzeniem, ale ona tyczy sie calego programu / otwartego okna (tak samo jak KeyPressEvent)

Jednak Ty nie chcesz, aby to tyczyło się całego programu tylko jednej etykiety, dlatego musisz stworzyć własną funkcję i przypisać do tego obiektu zdarzenie. Robisz to następująco:

Usuwasz tą linijkę:

self.lokalizacja.background.mousePressEvent(event)

I zamieniasz ją na:

self.lokalizacja.background.mousePressEvent =  self.nazwa_funkcji # ważne, bez nawiasów

A kod funkcji powinien wygladac np. tak:

def nazwa_funkcji(self, event):
        print "funkcja ktora dziala po nacisnieciu na dany obiekt" # kod ktory zamieniasz na rysowanie kółek

Teraz obiekt po naciśnięciu go przyciskiem myszki wie, że ma wykonać funkcję o nazwie nazwa_funkcji , a w niej ma wypisać print.

(testowałem na python3)


Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0