pyqt ローディング UI は、マウスイベントやその他のイベントが使用できない問題を解決します
以下のUI読み込み方法では、マウスイベントを実装したい場合、起動が難しい
class MyWindow:
def __init__(self):
self.window = uic.loadUi('./w.ui')
self.window.show()
app = QtWidgets.QApplication(sys.argv)
window = MyWindow()
app.exec_()
ソリューション 1
ウィンドウ上でのマウス クリックを実現し、マウスの位置を出力したいのですが、継承方法は使用しません。この機能を実現するにはどうすればよいでしょうか。
解決策:新しい関数を作成し、元の関数をこの新しい関数と等しくします。
class MyWindow:
def mousePressEvent(self, a0):
print(a0.globalPos())
def __init__(self):
self.window: QtWidgets.QWidget = uic.loadUi('./w.ui')
self.window.show()
self.window.mousePressEvent = self.mousePressEvent
app = QtWidgets.QApplication(sys.argv)
window = MyWindow()
app.exec_()
無事解決、このカスタム関数の名前は何気なく選んでも構いませんが、パラメータは元の関数のパラメータと同じです。
解決策 2
継承を使用して UI をロードする
import sys
from PyQt5 import QtWidgets, QtGui, Qt, uic
type = uic.loadUiType(r'./w.ui')
class MyWindow(QtWidgets.QWidget, type[0]):
def mousePressEvent(self, a0):
print(a0.globalPos())
def __init__(self):
super(MyWindow, self).__init__()
self.setupUi(self)
self.button = self.pushButton
self.show()
app = QtWidgets.QApplication(sys.argv)
window = MyWindow()
app.exec_()
マウスイベントも実装
ウィンドウ内のボタンをマウス イベントに追加する場合は、方法 1 を使用します。
import sys
from PyQt5 import QtWidgets, QtGui, Qt, uic
type = uic.loadUiType(r'./w.ui')
class MyWindow(QtWidgets.QWidget, type[0]):
def mousePressEvent(self, a0):
print(a0.globalPos())
def fun(self, a0):
print(123)
def __init__(self):
super(MyWindow, self).__init__()
self.setupUi(self)
self.button = self.pushButton
self.button.leaveEvent = self.fun
self.show()
app = QtWidgets.QApplication(sys.argv)
window = MyWindow()
app.exec_()