我想在 PyQt 中创建一个可以点击的窗口;即点击一个窗口并通过点击,这样您就可以与它后面的任何东西进行交互,而窗口仍然在顶部。我想要达到的效果的一个例子就像 Ubuntu 上的通知,它默认显示在右上角,您可以单击它。
理想情况下,我希望能够在 PyQt 中做到这一点;如果没有,我的平台是 linux,但也欢迎使用 windows 解决方案!
提前为帮助干杯!我一直在对此进行一些思考和研究,能够做到这一点会很棒。
编辑:我正在尝试制作一个可以像描图纸一样用于后面窗口的窗口
这是在 Windows 上使用 PyQt4 的解决方案。
您需要覆盖 Front 小部件中的 eventFilter(在 Windows 上为 winEvent),然后将事件转发到 Back 窗口。
我不完全确定,但必须有类似的方法可以在其他平台上使用(而不是winEvent,也许是x11Event?)
祝你好运!
from PyQt4 import QtCore, QtGui
import win32api, win32con, win32gui, win32ui
class Front(QtGui.QPushButton):
def __init__(self,text="",whndl=None):
super(Front,self).__init__(text)
self.pycwnd = win32ui.CreateWindowFromHandle(whndl)
# install an event filter for Windows' messages. Forward messages to
# the other HWND
def winEvent(self,MSG):
# forward Left button down message to the other window. Not sure
# what you want to do exactly, so I'm only showing a left button click. You could
if MSG.message == win32con.WM_LBUTTONDOWN or \
MSG.message == win32con.WM_LBUTTONUP:
print "left click in front window"
self.pycwnd.SendMessage(MSG.message, MSG.wParam, MSG.lParam)
return True, 0 # tells Qt to ignore the message
return super(Front,self).winEvent(MSG)
class Back(QtGui.QPushButton):
def __init__(self,text=""):
super(Back,self).__init__(text)
self.clicked.connect(self.onClick)
def onClick(self):
print 'back has been clicked'
def main():
a = QtGui.QApplication([])
back = Back("I'm in back...")
back.setWindowTitle("I'm in back...")
back.show()
# Get the HWND of the window in back (You need to use the exact title of that window)
whndl = win32gui.FindWindowEx(0, 0, None, "I'm in back...")
# I'm just making the front button bigger so that it is obvious it is in front ...
front = Front(text="*____________________________*",whndl=whndl)
front.setWindowOpacity(0.8)
front.show()
a.exec_()
if __name__ == "__main__":
main()
self.setAttribute(Qt.WA_TransparentForMouseEvents, True)
self.setAttribute(Qt.WA_NoChildEventsForParent, True)
self.setWindowFlags(Qt.Window|Qt.X11BypassWindowManagerHint|Qt.WindowStaysOnTopHint|Qt.FramelessWindowHint)
self.setAttribute(Qt.WA_TranslucentBackground)
这行得通。它在 Linux Mint 20.1 Cinnamon 上进行了测试。这意味着父母WA_TransparentForMouseEvents
一直阻止它