PyQt5 Event Oluşturma

Herkese merhaba iyi akşamlar.

PyQt5 ile çerçeveye sahip olmayan bir pencere nasıl hareket ettirilebilir gibi bir düşünce oluştu. Bunun için internetten bakarken aşağıya bıraktığım örnek kodları gördüm.

Yaşadığım sıkıntı yalnızca burada yazılan kod ile değil buna benzer olarak çerçevesi olan bir pencerenin “X” butonuna basmayla yapılan işlemler ile ilgili kodları inceliyorum, test ediyorum herşey güzel çalışırken kendime uyarladığımda patlıyor(çalışmıyor[yani herhangi bir hata vermiyor. Mantık hatası ya da kodlama kısmında bir sorun olabilir mi diye düşündürtüyor])

Örnek kodu şöyle Kaynağı ile bırakıyorum:

python - PyQt5 draggable frameless window - Stack Overflow

import sys
from PyQt5.QtCore import Qt, QPoint
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel


class cssden(QMainWindow):
    def __init__(self):
        super().__init__()

        # <MainWindow Properties>
        self.setFixedSize(320, 450)
        self.setStyleSheet("QMainWindow{background-color: darkgray;border: 1px solid black}")
        self.setWindowFlags(Qt.FramelessWindowHint)
        self.center()
        # </MainWindow Properties>

        # <Label Properties>
        self.lbl = QLabel(self)
        self.lbl.setText("test")
        self.lbl.setStyleSheet("QLabel{background-color: rgb(0,0,0); border: 1px solid red; color: rgb(255,255,255); font: bold italic 20pt 'Times New Roman';}")
        self.lbl.setGeometry(5, 5, 60, 40)
        # </Label Properties>

        self.oldPos = self.pos()
        self.show()

    def center(self):
        qr = self.frameGeometry()
        cp = QDesktopWidget().availableGeometry().center()
        qr.moveCenter(cp)
        self.move(qr.topLeft())

    def mousePressEvent(self, event):
        self.oldPos = event.globalPos()

    def mouseMoveEvent(self, event):
        delta = QPoint (event.globalPos() - self.oldPos)
        self.move(self.x() + delta.x(), self.y() + delta.y())
        self.oldPos = event.globalPos()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = cssden()
    sys.exit(app.exec_())

İlgilendiren kısım ise şu bölüm:

    def mousePressEvent(self, event):
        self.oldPos = event.globalPos()

    def mouseMoveEvent(self, event):
        delta = QPoint (event.globalPos() - self.oldPos)
        self.move(self.x() + delta.x(), self.y() + delta.y())
        self.oldPos = event.globalPos()

Paylaşılan kodu aynen denediğimde çalışırken, kendimin QtDesignerde oluşturduğum boş bir pencerede aynen denerken hiçbir etkinin olmadığını farkettim.

Onuda aşağıya bırakıyorum:
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import Qt,QPoint


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        MainWindow.setWindowFlag(Qt.FramelessWindowHint)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 26))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)
        
    def mousePressEvent(self, event):
        self.oldPos = event.globalPos()

    def mouseMoveEvent(self, event):
        delta = QPoint (event.globalPos() - self.oldPos)
        self.move(self.x() + delta.x(), self.y() + delta.y())
        self.oldPos = event.globalPos()

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

Bunun nedeni nedir? Neden etki etmiyor? Mantık hatası mı var? Varsa nerede
Şimdiden sizlere teşekkür ediyorum…

Evet Çözümünü an itibariyle bulmuş bulunmaktayım. Yine StackOverflow da bakarken kodları daha dikkatli inceledim. Dikkatimi çeken kısım hep class oluşturduklarında parantez içine bir parent sınıf ekliyorlar(yanlış telaffuz etmedim umarım) bunu eklediğim sıra oluşturulan class içinde yapılan ilgili eventler aktif oldu.

ne demek istediğimi düzenlediğim kodda görebilirsiniz:

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import Qt,QPoint
from PyQt5.QtWidgets import QMainWindow


class Ui_MainWindow(QMainWindow):
    def __init__(self):
        super(Ui_MainWindow,self).__init__()
        self.setObjectName("MainWindow")
        self.resize(800, 600)
        self.setWindowFlag(Qt.FramelessWindowHint)
        self.centralwidget = QtWidgets.QWidget()
        self.centralwidget.setObjectName("centralwidget")
        self.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar()
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 26))
        self.menubar.setObjectName("menubar")
        self.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar()
        self.statusbar.setObjectName("statusbar")
        self.setStatusBar(self.statusbar)

        self.retranslateUi()
        
    def mousePressEvent(self, event):
        self.oldPos = event.globalPos()

    def mouseMoveEvent(self, event):
        delta = QPoint (event.globalPos() - self.oldPos)
        self.move(self.x() + delta.x(), self.y() + delta.y())
        self.oldPos = event.globalPos()

    def retranslateUi(self):
        _translate = QtCore.QCoreApplication.translate
        self.setWindowTitle(_translate("MainWindow", "MainWindow"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    ui = Ui_MainWindow()
    ui.show()
    sys.exit(app.exec_())

1 Beğeni